diff --git a/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp b/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp
index 9ee4cb917cdbf76dddf988b4456d5d611c9a11e0..bb20d25bbc6b82e1d2b3dddd8a2f732a384cdb6d 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp
@@ -230,16 +230,16 @@ void excludeGridInterfaceNodesForMirror(Parameter* para, int lev)
 	//define bool vector for nodes outside the interface
 	for (unsigned int it = 0; it < para->getParH(lev + 1)->numberOfPointsCpTop; it++)
 	{
-		for (unsigned int ifit = 0; ifit < para->getParH((int)lev)->K_CF; ifit++)
+        for (unsigned int ifit = 0; ifit < para->getParH((int)lev)->coarseToFine.numberOfCells; ifit++)
 		{
-			if ((para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH((int)lev)->intCF.ICellCFF[ifit]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->intCF.ICellCFF[ifit]]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborY[para->getParH((int)lev)->intCF.ICellCFF[ifit]]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH((int)lev)->intCF.ICellCFF[ifit]]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborY[para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->intCF.ICellCFF[ifit]]]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->intCF.ICellCFF[ifit]]]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH(lev + 1)->neighborY[para->getParH((int)lev)->intCF.ICellCFF[ifit]]]) ||
-				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH(lev + 1)->neighborY[para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->intCF.ICellCFF[ifit]]]]))
+			if ((para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborY[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborY[para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH(lev + 1)->neighborY[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]]) ||
+				(para->getParH(lev + 1)->cpTopIndex[it] == (int)para->getParH(lev + 1)->neighborZ[para->getParH(lev + 1)->neighborY[para->getParH(lev + 1)->neighborX[para->getParH((int)lev)->coarseToFine.fineCellIndices[ifit]]]]))
 			{
 				para->getParH(lev + 1)->isOutsideInterface.push_back(false);
 				tempBool = false;
@@ -256,9 +256,9 @@ void excludeGridInterfaceNodesForMirror(Parameter* para, int lev)
 	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	for (unsigned int it = 0; it < para->getParH((int)lev)->numberOfPointsCpTop; it++)
 	{
-		for (unsigned int ifit = 0; ifit < para->getParH((int)lev)->K_FC; ifit++)
+        for (unsigned int ifit = 0; ifit < para->getParH((int)lev)->fineToCoarse.numberOfCells; ifit++)
 		{
-			if (para->getParH((int)lev)->cpTopIndex[it] == (int)para->getParH((int)lev)->intFC.ICellFCC[ifit])
+			if (para->getParH((int)lev)->cpTopIndex[it] == (int)para->getParH((int)lev)->fineToCoarse.coarseCellIndices[ifit])
 			{
 				para->getParH((int)lev)->isOutsideInterface.push_back(false);
 				tempBool = false;
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp b/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp
index b8ca4e9c2020e17cd0192267ac5d931b510afc3a..f1c9bb8e53f81a554091a5e230ba09556b084167 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp
@@ -42,7 +42,7 @@ void RefinementAndExchange_streams_exchangeInterface::operator()(UpdateGrid27 *u
     //!
     //! 1. Interpolation fine to coarse for nodes which are at the border of the gpus/processes
     //!
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFCBorder, para->getParD(level)->offFC, CudaStreamIndex::SubDomainBorder);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarseBorder, para->getParD(level)->neighborFineToCoarse, CudaStreamIndex::SubDomainBorder);
 
     //! 2. prepare the exchange between gpus (collect the send nodes for communication in a buffer on the gpu) and trigger bulk kernel execution when finished
     //!
@@ -53,8 +53,8 @@ void RefinementAndExchange_streams_exchangeInterface::operator()(UpdateGrid27 *u
     //! 3. launch the bulk kernels for both interpolation processes (fine to coarse and coarse to fine)
     //!
     para->getStreamManager()->waitOnStartBulkKernelEvent(CudaStreamIndex::Bulk);
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFCBulk, para->getParD(level)->offFCBulk, CudaStreamIndex::SubDomainBorder);
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCFBulk, para->getParD(level)->offCFBulk, CudaStreamIndex::SubDomainBorder);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarseBulk, para->getParD(level)->neighborFineToCoarseBulk, CudaStreamIndex::SubDomainBorder);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFineBulk, para->getParD(level)->neighborCoarseToFineBulk, CudaStreamIndex::SubDomainBorder);
 
     //! 4. exchange information between GPUs (only nodes which are part of the interpolation)
     //!
@@ -62,7 +62,7 @@ void RefinementAndExchange_streams_exchangeInterface::operator()(UpdateGrid27 *u
 
     // 5. interpolation fine to coarse for nodes which are at the border of the gpus/processes
     //!
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCFBorder, para->getParD(level)->offCF, CudaStreamIndex::SubDomainBorder);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFineBorder, para->getParD(level)->neighborCoarseToFine, CudaStreamIndex::SubDomainBorder);
 
     cudaDeviceSynchronize();
 }
@@ -73,7 +73,7 @@ void RefinementAndExchange_streams_exchangeAllNodes::operator()(UpdateGrid27 *up
     //!
     //! 1. interpolation fine to coarse for nodes which are at the border of the gpus/processes
     //!
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFCBorder, para->getParD(level)->offFC, CudaStreamIndex::SubDomainBorder);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarseBorder, para->getParD(level)->neighborFineToCoarse, CudaStreamIndex::SubDomainBorder);
 
     //! 2. prepare the exchange between gpus (collect the send nodes for communication in a buffer on the gpu) and trigger bulk kernel execution when finished
     //!
@@ -84,8 +84,8 @@ void RefinementAndExchange_streams_exchangeAllNodes::operator()(UpdateGrid27 *up
     //! 3. launch the bulk kernels for both interpolation processes (fine to coarse and coarse to fine)
     //!
     para->getStreamManager()->waitOnStartBulkKernelEvent(CudaStreamIndex::Bulk);
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFCBulk, para->getParD(level)->offFCBulk, CudaStreamIndex::SubDomainBorder);
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCFBulk, para->getParD(level)->offCFBulk, CudaStreamIndex::SubDomainBorder);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarseBulk, para->getParD(level)->neighborFineToCoarseBulk, CudaStreamIndex::SubDomainBorder);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFineBulk, para->getParD(level)->neighborCoarseToFineBulk, CudaStreamIndex::SubDomainBorder);
 
     //! 4. exchange information between GPUs (all nodes)
     //!
@@ -93,7 +93,7 @@ void RefinementAndExchange_streams_exchangeAllNodes::operator()(UpdateGrid27 *up
 
     // 5. interpolation fine to coarse for nodes which are at the border of the gpus/processes
     //!
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCFBorder, para->getParD(level)->offCF, CudaStreamIndex::SubDomainBorder);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFineBorder, para->getParD(level)->neighborCoarseToFine, CudaStreamIndex::SubDomainBorder);
 
     cudaDeviceSynchronize();
 }
@@ -104,14 +104,14 @@ void RefinementAndExchange_noStreams_exchangeInterface::operator()(UpdateGrid27
     //!
     //! 1. interpolation fine to coarse
     //!
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFC, para->getParD(level)->offFC, CudaStreamIndex::Legacy);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarse, para->getParD(level)->neighborFineToCoarse, CudaStreamIndex::Legacy);
 
     //! 2. exchange information between GPUs (only nodes which are part of the interpolation)
     //!
     updateGrid->exchangeMultiGPU_noStreams_withPrepare(level, true);
 
     //! 3. interpolation coarse to fine
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCF, para->getParD(level)->offCF, CudaStreamIndex::Legacy);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFine, para->getParD(level)->neighborCoarseToFine, CudaStreamIndex::Legacy);
 }
 
 void RefinementAndExchange_noStreams_exchangeAllNodes::operator()(UpdateGrid27 *updateGrid, Parameter *para, int level)
@@ -120,14 +120,14 @@ void RefinementAndExchange_noStreams_exchangeAllNodes::operator()(UpdateGrid27 *
     //!
     //! 1. interpolation fine to coarse
     //!
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFC, para->getParD(level)->offFC, CudaStreamIndex::Legacy);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarse, para->getParD(level)->neighborFineToCoarse, CudaStreamIndex::Legacy);
 
     //! 2. exchange information between GPUs (all nodes)
     //!
     updateGrid->exchangeMultiGPU_noStreams_withPrepare(level, false);
 
     //! 3. interpolation coarse to fine
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCF, para->getParD(level)->offCF, CudaStreamIndex::Legacy);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFine, para->getParD(level)->neighborCoarseToFine, CudaStreamIndex::Legacy);
 }
 
 void Refinement_noExchange::operator()(UpdateGrid27 *updateGrid, Parameter *para, int level)
@@ -136,7 +136,7 @@ void Refinement_noExchange::operator()(UpdateGrid27 *updateGrid, Parameter *para
     //!
     //! 1. interpolation fine to coarse
     //!
-    updateGrid->fineToCoarse(level, &para->getParD(level)->intFC, para->getParD(level)->offFC, CudaStreamIndex::Legacy);
+    updateGrid->fineToCoarse(level, &para->getParD(level)->fineToCoarse, para->getParD(level)->neighborFineToCoarse, CudaStreamIndex::Legacy);
     //! 2. interpolation coarse to fine
-    updateGrid->coarseToFine(level, &para->getParD(level)->intCF, para->getParD(level)->offCF, CudaStreamIndex::Legacy);
+    updateGrid->coarseToFine(level, &para->getParD(level)->coarseToFine, para->getParD(level)->neighborCoarseToFine, CudaStreamIndex::Legacy);
 }
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
index 4136614dfbfc9e0d2fc1bf7f4b01624f94eabb6f..a2b1039afca4eaa3fcd75e28cae16cb5f68f6c9b 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
@@ -328,9 +328,9 @@ void UpdateGrid27::preCollisionBC(int level, unsigned int t)
     //////////////////////////////////////////////////////////////////////////////////
 }
 
-void UpdateGrid27::fineToCoarse(int level, InterpolationCellFC* icellFC, OffFC &offFC, CudaStreamIndex streamIndex)
+void UpdateGrid27::fineToCoarse(int level, InterpolationCells* fineToCoarse, ICellNeigh &neighborFineToCoarse, CudaStreamIndex streamIndex)
 {
-    gridScalingKernelManager->runFineToCoarseKernelLB(level, icellFC, offFC, streamIndex);
+    gridScalingKernelManager->runFineToCoarseKernelLB(level, fineToCoarse, neighborFineToCoarse, streamIndex);
 
     if (para->getDiffOn()) {
         if (para->getStreamManager()->streamIsRegistered(streamIndex)) {
@@ -341,9 +341,9 @@ void UpdateGrid27::fineToCoarse(int level, InterpolationCellFC* icellFC, OffFC &
     }
 }
 
-void UpdateGrid27::coarseToFine(int level, InterpolationCellCF* icellCF, OffCF &offCF, CudaStreamIndex streamIndex)
+void UpdateGrid27::coarseToFine(int level, InterpolationCells* coarseToFine, ICellNeigh &neighborCoarseToFine, CudaStreamIndex streamIndex)
 {
-    this->gridScalingKernelManager->runCoarseToFineKernelLB(level, icellCF, offCF, streamIndex);
+    this->gridScalingKernelManager->runCoarseToFineKernelLB(level, coarseToFine, neighborCoarseToFine, streamIndex);
 
     if (para->getDiffOn())
     {
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
index 8ce2cf5bfd72f9f53cdb35bc92502ee9ca0d3ad8..9c6ff48725f4e17121de0a1a8681d0bafcfb58ee 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
@@ -38,8 +38,8 @@ private:
     void preCollisionBC(int level, unsigned int t);
     void collisionPorousMedia(int level);
 
-    void fineToCoarse(int level, InterpolationCellFC* icellFC, OffFC &offFC, CudaStreamIndex streamIndex);
-    void coarseToFine(int level, InterpolationCellCF* icellCF, OffCF &offCF, CudaStreamIndex streamIndex);
+    void fineToCoarse(int level, InterpolationCells* fineToCoarse, ICellNeigh &neighborFineToCoarse, CudaStreamIndex streamIndex);
+    void coarseToFine(int level, InterpolationCells* coarseToFine, ICellNeigh &neighborCoarseToFine, CudaStreamIndex streamIndex);
 
     void prepareExchangeMultiGPU(int level, CudaStreamIndex streamIndex);
     void prepareExchangeMultiGPUAfterFtoC(int level, CudaStreamIndex streamIndex);
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
index a1c8554cc4e262e9f1eca4204aed4ffcfd4c3a87..647ab169b22dfd5973bb6ee6bbf80745ca647241 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
@@ -165,25 +165,13 @@ void GridReader::allocArrays_OffsetScale()
         AnzahlKnotenGesFC += tempFC;
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        //size + memsize CF
-        para->getParH(i)->K_CF = tempCF;
-        para->getParD(i)->K_CF = para->getParH(i)->K_CF;
-        para->getParH(i)->intCF.kCF = para->getParH(i)->K_CF;
-        para->getParD(i)->intCF.kCF = para->getParH(i)->K_CF;
-        para->getParH(i)->mem_size_kCF = sizeof(unsigned int)* para->getParH(i)->K_CF;
-        para->getParD(i)->mem_size_kCF = sizeof(unsigned int)* para->getParD(i)->K_CF;
-        para->getParH(i)->mem_size_kCF_off = sizeof(real)* para->getParH(i)->K_CF;
-        para->getParD(i)->mem_size_kCF_off = sizeof(real)* para->getParD(i)->K_CF;
+        //size CF
+        para->getParH(i)->coarseToFine.numberOfCells = tempCF;
+        para->getParD(i)->coarseToFine.numberOfCells = para->getParH(i)->coarseToFine.numberOfCells;
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        //size + memsize FC
-        para->getParH(i)->K_FC = tempFC;
-        para->getParD(i)->K_FC = para->getParH(i)->K_FC;
-        para->getParH(i)->intFC.kFC = para->getParH(i)->K_FC;
-        para->getParD(i)->intFC.kFC = para->getParH(i)->K_FC;
-        para->getParH(i)->mem_size_kFC = sizeof(unsigned int)* para->getParH(i)->K_FC;
-        para->getParD(i)->mem_size_kFC = sizeof(unsigned int)* para->getParD(i)->K_FC;
-        para->getParH(i)->mem_size_kFC_off = sizeof(real)* para->getParH(i)->K_FC;
-        para->getParD(i)->mem_size_kFC_off = sizeof(real)* para->getParD(i)->K_FC;
+        //size FC
+        para->getParH(i)->fineToCoarse.numberOfCells = tempFC;
+        para->getParD(i)->fineToCoarse.numberOfCells = para->getParH(i)->fineToCoarse.numberOfCells;
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         //alloc
 		cudaMemoryManager->cudaAllocInterfaceCF(i);
@@ -192,12 +180,12 @@ void GridReader::allocArrays_OffsetScale()
 		cudaMemoryManager->cudaAllocInterfaceOffFC(i);
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         //init
-        obj_offCF->initArrayOffset(para->getParH(i)->offCF.xOffCF, para->getParH(i)->offCF.yOffCF, para->getParH(i)->offCF.zOffCF, i);
-        obj_offFC->initArrayOffset(para->getParH(i)->offFC.xOffFC, para->getParH(i)->offFC.yOffFC, para->getParH(i)->offFC.zOffFC, i);
-        obj_scaleCFC->initScale(para->getParH(i)->intCF.ICellCFC, i);
-        obj_scaleCFF->initScale(para->getParH(i)->intCF.ICellCFF, i);
-        obj_scaleFCC->initScale(para->getParH(i)->intFC.ICellFCC, i);
-        obj_scaleFCF->initScale(para->getParH(i)->intFC.ICellFCF, i);
+        obj_offCF->initArrayOffset(para->getParH(i)->neighborCoarseToFine.x, para->getParH(i)->neighborCoarseToFine.y, para->getParH(i)->neighborCoarseToFine.z, i);
+        obj_offFC->initArrayOffset(para->getParH(i)->neighborFineToCoarse.x, para->getParH(i)->neighborFineToCoarse.y, para->getParH(i)->neighborFineToCoarse.z, i);
+        obj_scaleCFC->initScale(para->getParH(i)->coarseToFine.coarseCellIndices, i);
+        obj_scaleCFF->initScale(para->getParH(i)->coarseToFine.fineCellIndices, i);
+        obj_scaleFCC->initScale(para->getParH(i)->fineToCoarse.coarseCellIndices, i);
+        obj_scaleFCF->initScale(para->getParH(i)->fineToCoarse.fineCellIndices, i);
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         //copy
 		cudaMemoryManager->cudaCopyInterfaceCF(i);
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index c2f86721de26d516ed60f497a65d1d46a34aa182..533382211dfba6c2d1ad88b1c75ef89e32beec0f 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -1179,25 +1179,13 @@ void GridGenerator::allocArrays_OffsetScale()
         std::cout << "number of nodes FC level " << level << " : " << numberOfNodesPerLevelFC << std::endl;
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        //size + memsize CF
-        para->getParH(level)->K_CF = numberOfNodesPerLevelCF;
-        para->getParD(level)->K_CF = para->getParH(level)->K_CF;
-        para->getParH(level)->intCF.kCF = para->getParH(level)->K_CF;
-        para->getParD(level)->intCF.kCF = para->getParH(level)->K_CF;
-        para->getParH(level)->mem_size_kCF = sizeof(uint)* para->getParH(level)->K_CF;
-        para->getParD(level)->mem_size_kCF = sizeof(uint)* para->getParD(level)->K_CF;
-        para->getParH(level)->mem_size_kCF_off = sizeof(real)* para->getParH(level)->K_CF;
-        para->getParD(level)->mem_size_kCF_off = sizeof(real)* para->getParD(level)->K_CF;
+        //size CF
+        para->getParH(level)->coarseToFine.numberOfCells = numberOfNodesPerLevelCF;
+        para->getParD(level)->coarseToFine.numberOfCells = para->getParH(level)->coarseToFine.numberOfCells;
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        //size + memsize FC
-        para->getParH(level)->K_FC = numberOfNodesPerLevelFC;
-        para->getParD(level)->K_FC = para->getParH(level)->K_FC;
-        para->getParH(level)->intFC.kFC = para->getParH(level)->K_FC;
-        para->getParD(level)->intFC.kFC = para->getParH(level)->K_FC;
-        para->getParH(level)->mem_size_kFC = sizeof(uint)* para->getParH(level)->K_FC;
-        para->getParD(level)->mem_size_kFC = sizeof(uint)* para->getParD(level)->K_FC;
-        para->getParH(level)->mem_size_kFC_off = sizeof(real)* para->getParH(level)->K_FC;
-        para->getParD(level)->mem_size_kFC_off = sizeof(real)* para->getParD(level)->K_FC;
+        //size FC
+        para->getParH(level)->fineToCoarse.numberOfCells = numberOfNodesPerLevelFC;
+        para->getParD(level)->fineToCoarse.numberOfCells = para->getParH(level)->fineToCoarse.numberOfCells;
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         //alloc
         cudaMemoryManager->cudaAllocInterfaceCF(level);
@@ -1206,9 +1194,9 @@ void GridGenerator::allocArrays_OffsetScale()
         cudaMemoryManager->cudaAllocInterfaceOffFC(level);
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         //init
-        builder->getOffsetCF(para->getParH(level)->offCF.xOffCF, para->getParH(level)->offCF.yOffCF, para->getParH(level)->offCF.zOffCF, level);
-        builder->getOffsetFC(para->getParH(level)->offFC.xOffFC, para->getParH(level)->offFC.yOffFC, para->getParH(level)->offFC.zOffFC, level);
-        builder->getGridInterfaceIndices(para->getParH(level)->intCF.ICellCFC, para->getParH(level)->intCF.ICellCFF, para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.ICellFCF, level);
+        builder->getOffsetCF(para->getParH(level)->neighborCoarseToFine.x, para->getParH(level)->neighborCoarseToFine.y, para->getParH(level)->neighborCoarseToFine.z, level);
+        builder->getOffsetFC(para->getParH(level)->neighborFineToCoarse.x, para->getParH(level)->neighborFineToCoarse.y, para->getParH(level)->neighborFineToCoarse.z, level);
+        builder->getGridInterfaceIndices(para->getParH(level)->coarseToFine.coarseCellIndices, para->getParH(level)->coarseToFine.fineCellIndices, para->getParH(level)->fineToCoarse.coarseCellIndices, para->getParH(level)->fineToCoarse.fineCellIndices, level);
 
         if (para->getUseStreams() || para->getNumprocs() > 1) {
             // split fine-to-coarse indices into border and bulk
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
index 4cd8769407220ec97030489585009d435a6cce8e..696254c44e0fe1150ded8566650483878377928c 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
@@ -333,7 +333,7 @@ void IndexRearrangementForStreams::reorderSendIndicesForCommAfterFtoC(
 {
     VF_LOG_INFO("Reorder send indices for communication after fine to coarse: level: {} direction: {}", level,
                 direction);
-    if (para->getParH(level)->intCF.kCF == 0 || para->getParH(level)->intFC.kFC == 0)
+    if (para->getParH(level)->coarseToFine.numberOfCells == 0 || para->getParH(level)->fineToCoarse.numberOfCells == 0)
         VF_LOG_CRITICAL("reorderSendIndicesForCommAfterFtoC(): para->getParH(level)->intCF needs to be initialized "
                         "before calling this function");
 
@@ -342,19 +342,19 @@ void IndexRearrangementForStreams::reorderSendIndicesForCommAfterFtoC(
     std::vector<int> sendIndicesOther;
     uint numberOfSendIndices = builder->getNumberOfSendIndices(direction, level);
 
-    // iCellFCC
+    // coarse cells of interpolation fine to coarse (iCellFCC)
     for (uint posInSendIndices = 0; posInSendIndices < numberOfSendIndices; posInSendIndices++) {
         sparseIndexSend = sendIndices[posInSendIndices];
-        if (isSparseIndexInICellFCC(para->getParH(level)->intFC.kFC, sparseIndexSend, level)) {
+        if (isSparseIndexInCoarseIndexForFtoC(para->getParH(level)->fineToCoarse.numberOfCells, sparseIndexSend, level)) {
             addUniqueIndexToCommunicationVectors(sendIndicesAfterFtoC, sparseIndexSend,
                                                  sendIndicesForCommAfterFtoCPositions, posInSendIndices);
         }
     }
 
-    // iCellCFC
-    std::vector<uint> nodesCFC;
-    aggregateNodesInICellCFC(level, nodesCFC);
-    for (auto sparseIndex : nodesCFC)
+    // coarse cells of interpolation coarse to fine (iCellCFC)
+    std::vector<uint> coarseCellsForCtoF;
+    aggregateCoarseNodesForCtoF(level, coarseCellsForCtoF);
+    for (auto sparseIndex : coarseCellsForCtoF)
         findIfSparseIndexIsInSendIndicesAndAddToCommVectors(sparseIndex, sendIndices, numberOfSendIndices,
                                                             sendIndicesAfterFtoC, sendIndicesForCommAfterFtoCPositions);
 
@@ -378,27 +378,27 @@ void IndexRearrangementForStreams::reorderSendIndicesForCommAfterFtoC(
     }
 }
 
-bool IndexRearrangementForStreams::isSparseIndexInICellFCC(uint sizeOfICellFCC, int sparseIndex, int level) const
+bool IndexRearrangementForStreams::isSparseIndexInCoarseIndexForFtoC(uint numberOfCoarseNodesForFtoC, int sparseIndex, int level) const
 {
-    for (uint j = 0; j < sizeOfICellFCC; j++) {
+    for (uint j = 0; j < numberOfCoarseNodesForFtoC; j++) {
         if (sparseIndex < 0)
             return false;
-        if (para->getParH(level)->intFC.ICellFCC[j] == (uint)sparseIndex) {
+        if (para->getParH(level)->fineToCoarse.coarseCellIndices[j] == (uint)sparseIndex) {
             return true;
         }
     }
     return false;
 }
 
-void IndexRearrangementForStreams::aggregateNodesInICellCFC(int level, std::vector<uint> &nodesCFC) const
+void IndexRearrangementForStreams::aggregateCoarseNodesForCtoF(int level, std::vector<uint> &nodesCFC) const
 {
     uint sparseIndex;
     uint *neighborX = para->getParH(level)->neighborX;
     uint *neighborY = para->getParH(level)->neighborY;
     uint *neighborZ = para->getParH(level)->neighborZ;
 
-    for (uint x = 0; x < para->getParH(level)->intCF.kCF; x++) {
-        sparseIndex = para->getParH(level)->intCF.ICellCFC[x];
+    for (uint x = 0; x < para->getParH(level)->coarseToFine.numberOfCells; x++) {
+        sparseIndex = para->getParH(level)->coarseToFine.coarseCellIndices[x];
         nodesCFC.push_back(sparseIndex);
         nodesCFC.push_back(neighborX[sparseIndex]);
         nodesCFC.push_back(neighborY[sparseIndex]);
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
index e6753e21be43a4f004d812cca8b9adafa501ffe8..014c725e30c58921e783810a8332ff0865e7938c 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
@@ -89,12 +89,12 @@ protected:
     //! \param sendIndicesForCommAfterFtoCPositions stores each sendIndex's positions before reordering
     void reorderSendIndicesForCommAfterFtoC(int *sendIndices, int &numberOfSendNodesAfterFtoC, int direction,
                                             int level, std::vector<uint> &sendIndicesForCommAfterFtoCPositions) const;
-    //! \brief Check if a sparse index occurs in the ICellFCC
-    bool isSparseIndexInICellFCC(uint sizeOfICellFCC, int sparseIndexSend, int level) const;
+    //! \brief Check if a sparse index occurs in the coarse nodes for the interpolation from fine to coarse
+    bool isSparseIndexInCoarseIndexForFtoC(uint numberOfCoarseNodesForFtoC, int sparseIndexSend, int level) const;
     //! \brief Aggregate all nodes in the coarse cells for the interpolation in coarse to fine
     //! \details For the coarse cells in the interpolation from coarse to fine only one node is stored. This methods
     //! looks for the other nodes of each cell and puts them into vector. Duplicate nodes are only stored once.
-    void aggregateNodesInICellCFC(int level, std::vector<uint> &nodesCFC) const;
+    void aggregateCoarseNodesForCtoF(int level, std::vector<uint> &nodesCFC) const;
     //! \brief Add index to sendIndicesAfterFtoC and sendIndicesForCommAfterFtoCPositions, but omit indices which are already in sendIndicesAfterFtoC
     void addUniqueIndexToCommunicationVectors(std::vector<int> &sendIndicesAfterFtoC, int &sparseIndexSend,
                                               std::vector<unsigned int> &sendIndicesForCommAfterFtoCPositions,
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp
index 7bf534013ab68ba6a58fb3f33ca4ae03610cc12d..289b1607dd6acd47a88594a2b0a4497cdf6e7649 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp
@@ -86,10 +86,10 @@ struct SendIndicesForCommAfterFtoCX {
     const int numberOfProcessNeighbors = 1;
     const int indexOfProcessNeighbor = 0;
 
-    std::vector<uint> iCellCFC = { 8, 10, 12 };
-    std::vector<uint> iCellFCC = { 14, 16, 18 };
-    const uint kCF = (uint)iCellCFC.size();
-    const uint kFC = (uint)iCellFCC.size();
+    std::vector<uint> interpolationCellCoarseToFineCoarse = { 8, 10, 12 };
+    std::vector<uint> interpolationCellFineToCoarseCoarse = { 14, 16, 18 };
+    const uint numNodesCtoF = (uint)interpolationCellCoarseToFineCoarse.size();
+    const uint numNodesFtoC = (uint)interpolationCellFineToCoarseCoarse.size();
     uint neighborX[18] = { 0u };
     uint neighborY[18] = { 0u };
     uint neighborZ[18] = { 0u };
@@ -106,14 +106,14 @@ struct SendIndicesForCommAfterFtoCX {
 class IndexRearrangementForStreamsTest_reorderSendIndices : public testing::Test
 {
 protected:
-    SendIndicesForCommAfterFtoCX si;
+    SendIndicesForCommAfterFtoCX sendIndices;
     SPtr<Parameter> para;
     std::unique_ptr<IndexRearrangementForStreams> testSubject;
 
     void act()
     {
-        testSubject->reorderSendIndicesForCommAfterFtoCX(si.direction, si.level, si.indexOfProcessNeighbor,
-                                                         si.sendIndicesForCommAfterFtoCPositions);
+        testSubject->reorderSendIndicesForCommAfterFtoCX(sendIndices.direction, sendIndices.level, sendIndices.indexOfProcessNeighbor,
+                                                         sendIndices.sendIndicesForCommAfterFtoCPositions);
     };
 
 private:
@@ -124,21 +124,21 @@ private:
         SPtr<GridImpDouble> grid =
             GridImpDouble::makeShared(nullptr, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, Distribution(), 1);
         std::shared_ptr<LevelGridBuilderDouble> builder = std::make_shared<LevelGridBuilderDouble>(grid);
-        builder->setNumberOfSendIndices((uint)si.sendIndices.size());
+        builder->setNumberOfSendIndices((uint)sendIndices.sendIndices.size());
 
-        para = testingVF::createParameterForLevel(si.level);
+        para = testingVF::createParameterForLevel(sendIndices.level);
 
-        para->getParH(si.level)->intFC.kFC = si.kFC;
-        para->getParH(si.level)->intFC.ICellFCC = &(si.iCellFCC.front());
-        para->getParH(si.level)->intCF.ICellCFC = &(si.iCellCFC.front());
-        para->getParH(si.level)->intCF.kCF = si.kCF;
-        para->getParH(si.level)->neighborX = si.neighborX;
-        para->getParH(si.level)->neighborY = si.neighborY;
-        para->getParH(si.level)->neighborZ = si.neighborZ;
+        para->getParH(sendIndices.level)->fineToCoarse.numberOfCells = sendIndices.numNodesFtoC;
+        para->getParH(sendIndices.level)->fineToCoarse.coarseCellIndices = &(sendIndices.interpolationCellFineToCoarseCoarse.front());
+        para->getParH(sendIndices.level)->coarseToFine.coarseCellIndices = &(sendIndices.interpolationCellCoarseToFineCoarse.front());
+        para->getParH(sendIndices.level)->coarseToFine.numberOfCells = sendIndices.numNodesCtoF;
+        para->getParH(sendIndices.level)->neighborX = sendIndices.neighborX;
+        para->getParH(sendIndices.level)->neighborY = sendIndices.neighborY;
+        para->getParH(sendIndices.level)->neighborZ = sendIndices.neighborZ;
 
-        para->setNumberOfProcessNeighborsX(si.numberOfProcessNeighbors, si.level, "send");
-        para->getParH(si.level)->sendProcessNeighborX[si.indexOfProcessNeighbor].index = si.sendIndices.data();
-        para->initProcessNeighborsAfterFtoCX(si.level);
+        para->setNumberOfProcessNeighborsX(sendIndices.numberOfProcessNeighbors, sendIndices.level, "send");
+        para->getParH(sendIndices.level)->sendProcessNeighborX[sendIndices.indexOfProcessNeighbor].index = sendIndices.sendIndices.data();
+        para->initProcessNeighborsAfterFtoCX(sendIndices.level);
 
         testSubject = std::make_unique<IndexRearrangementForStreams>(
             IndexRearrangementForStreams(para, builder, vf::gpu::Communicator::getInstance()));
@@ -149,14 +149,14 @@ TEST_F(IndexRearrangementForStreamsTest_reorderSendIndices, reorderSendIndicesFo
 {
     act();
 
-    EXPECT_THAT(si.sendIndicesForCommAfterFtoCPositions.size(),
-                testing::Eq(si.sendIndicesForCommAfterFtoCPositions_expected.size()));
-    EXPECT_THAT(si.sendIndicesForCommAfterFtoCPositions, testing::Eq(si.sendIndicesForCommAfterFtoCPositions_expected));
+    EXPECT_THAT(sendIndices.sendIndicesForCommAfterFtoCPositions.size(),
+                testing::Eq(sendIndices.sendIndicesForCommAfterFtoCPositions_expected.size()));
+    EXPECT_THAT(sendIndices.sendIndicesForCommAfterFtoCPositions, testing::Eq(sendIndices.sendIndicesForCommAfterFtoCPositions_expected));
 
-    EXPECT_THAT(para->getParH(si.level)->sendProcessNeighborsAfterFtoCX[si.indexOfProcessNeighbor].numberOfNodes,
-                testing::Eq(si.numberOfSendNodesAfterFtoC_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(si.level)->sendProcessNeighborX[si.indexOfProcessNeighbor].index,
-                                si.sendProcessNeighborX_expected))
+    EXPECT_THAT(para->getParH(sendIndices.level)->sendProcessNeighborsAfterFtoCX[sendIndices.indexOfProcessNeighbor].numberOfNodes,
+                testing::Eq(sendIndices.numberOfSendNodesAfterFtoC_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(sendIndices.level)->sendProcessNeighborX[sendIndices.indexOfProcessNeighbor].index,
+                                sendIndices.sendProcessNeighborX_expected))
         << "sendProcessNeighborX[].index does not match the expected vector";
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.cpp
index 347ab362d1f6b28a6c2b46f2e885085f955fb34e..f3717b58fca0e81e23be100eb8d15371703f8010 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.cpp
@@ -14,77 +14,77 @@ void InterpolationCellGrouper::splitFineToCoarseIntoBorderAndBulk(uint level) co
 {
     this->reorderFineToCoarseIntoBorderAndBulk(level);
 
-    parDs[level]->intFCBorder.kFC = parHs[level]->intFCBorder.kFC;
-    parDs[level]->intFCBulk.kFC = parHs[level]->intFCBulk.kFC;
-    parDs[level]->intFCBorder.ICellFCC = parDs[level]->intFC.ICellFCC;
-    parDs[level]->intFCBulk.ICellFCC = parDs[level]->intFCBorder.ICellFCC + parDs[level]->intFCBorder.kFC;
-    parDs[level]->intFCBorder.ICellFCF = parDs[level]->intFC.ICellFCF;
-    parDs[level]->intFCBulk.ICellFCF = parDs[level]->intFCBorder.ICellFCF + parDs[level]->intFCBorder.kFC;
-    parDs[level]->offFCBulk.xOffFC = parDs[level]->offFC.xOffFC + parDs[level]->intFCBorder.kFC;
-    parDs[level]->offFCBulk.yOffFC = parDs[level]->offFC.yOffFC + parDs[level]->intFCBorder.kFC;
-    parDs[level]->offFCBulk.zOffFC = parDs[level]->offFC.zOffFC + parDs[level]->intFCBorder.kFC;
+    parDs[level]->fineToCoarseBorder.numberOfCells = parHs[level]->fineToCoarseBorder.numberOfCells;
+    parDs[level]->fineToCoarseBulk.numberOfCells = parHs[level]->fineToCoarseBulk.numberOfCells;
+    parDs[level]->fineToCoarseBorder.coarseCellIndices = parDs[level]->fineToCoarse.coarseCellIndices;
+    parDs[level]->fineToCoarseBulk.coarseCellIndices = parDs[level]->fineToCoarseBorder.coarseCellIndices + parDs[level]->fineToCoarseBorder.numberOfCells;
+    parDs[level]->fineToCoarseBorder.fineCellIndices = parDs[level]->fineToCoarse.fineCellIndices;
+    parDs[level]->fineToCoarseBulk.fineCellIndices = parDs[level]->fineToCoarseBorder.fineCellIndices + parDs[level]->fineToCoarseBorder.numberOfCells;
+    parDs[level]->neighborFineToCoarseBulk.x = parDs[level]->neighborFineToCoarse.x + parDs[level]->fineToCoarseBorder.numberOfCells;
+    parDs[level]->neighborFineToCoarseBulk.y = parDs[level]->neighborFineToCoarse.y + parDs[level]->fineToCoarseBorder.numberOfCells;
+    parDs[level]->neighborFineToCoarseBulk.z = parDs[level]->neighborFineToCoarse.z + parDs[level]->fineToCoarseBorder.numberOfCells;
 }
 
 void InterpolationCellGrouper::reorderFineToCoarseIntoBorderAndBulk(uint level) const
 {
     // create some local variables for better readability
-    uint *iCellFccAll = parHs[level]->intFC.ICellFCC;
-    uint *iCellFcfAll = parHs[level]->intFC.ICellFCF;
+    uint *fineToCoarseCoarseAll = parHs[level]->fineToCoarse.coarseCellIndices;
+    uint *fineToCoarseFineAll = parHs[level]->fineToCoarse.fineCellIndices;
     auto grid = this->builder->getGrid(level);
 
-    std::vector<uint> iCellFccBorderVector;
-    std::vector<uint> iCellFccBulkVector;
-    std::vector<uint> iCellFcfBorderVector;
-    std::vector<uint> iCellFcfBulkVector;
-    std::vector<real> xOffFCBorderVector;
-    std::vector<real> yOffFCBorderVector;
-    std::vector<real> zOffFCBorderVector;
-    std::vector<real> xOffFCBulkVector;
-    std::vector<real> yOffFCBulkVector;
-    std::vector<real> zOffFCBulkVector;
-
-    // fill border and bulk vectors with iCellFCs
-    for (uint i = 0; i < parHs[level]->intFC.kFC; i++)
-        if (grid->isSparseIndexInFluidNodeIndicesBorder(iCellFccAll[i])) {
-            iCellFccBorderVector.push_back(iCellFccAll[i]);
-            iCellFcfBorderVector.push_back(iCellFcfAll[i]);
-            xOffFCBorderVector.push_back(parHs[level]->offFC.xOffFC[i]);
-            yOffFCBorderVector.push_back(parHs[level]->offFC.yOffFC[i]);
-            zOffFCBorderVector.push_back(parHs[level]->offFC.zOffFC[i]);
+    std::vector<uint> fineToCoarseCoarseBorderVector;
+    std::vector<uint> fineToCoarseCoarseBulkVector;
+    std::vector<uint> fineToCoarseFineBorderVector;
+    std::vector<uint> fineToCoarseFineBulkVector;
+    std::vector<real> neighborXBorder;
+    std::vector<real> neighborYBorder;
+    std::vector<real> neighborZBorder;
+    std::vector<real> neighborXBulk;
+    std::vector<real> neighborYBulk;
+    std::vector<real> neighborZBulk;
+
+    // fill border and bulk vectors with interpolation cells fine to coarse
+    for (uint i = 0; i < parHs[level]->fineToCoarse.numberOfCells; i++)
+        if (grid->isSparseIndexInFluidNodeIndicesBorder(fineToCoarseCoarseAll[i])) {
+            fineToCoarseCoarseBorderVector.push_back(fineToCoarseCoarseAll[i]);
+            fineToCoarseFineBorderVector.push_back(fineToCoarseFineAll[i]);
+            neighborXBorder.push_back(parHs[level]->neighborFineToCoarse.x[i]);
+            neighborYBorder.push_back(parHs[level]->neighborFineToCoarse.y[i]);
+            neighborZBorder.push_back(parHs[level]->neighborFineToCoarse.z[i]);
         } else {
-            iCellFccBulkVector.push_back(iCellFccAll[i]);
-            iCellFcfBulkVector.push_back(iCellFcfAll[i]);
-            xOffFCBulkVector.push_back(parHs[level]->offFC.xOffFC[i]);
-            yOffFCBulkVector.push_back(parHs[level]->offFC.yOffFC[i]);
-            zOffFCBulkVector.push_back(parHs[level]->offFC.zOffFC[i]);
+            fineToCoarseCoarseBulkVector.push_back(fineToCoarseCoarseAll[i]);
+            fineToCoarseFineBulkVector.push_back(fineToCoarseFineAll[i]);
+            neighborXBulk.push_back(parHs[level]->neighborFineToCoarse.x[i]);
+            neighborYBulk.push_back(parHs[level]->neighborFineToCoarse.y[i]);
+            neighborZBulk.push_back(parHs[level]->neighborFineToCoarse.z[i]);
         }
 
     // set new sizes and pointers
-    parHs[level]->intFCBorder.ICellFCC = iCellFccAll;
-    parHs[level]->intFCBorder.ICellFCF = iCellFcfAll;
-    parHs[level]->intFCBorder.kFC = (uint)iCellFccBorderVector.size();
-    parHs[level]->intFCBulk.kFC = (uint)iCellFccBulkVector.size();
-    parHs[level]->intFCBulk.ICellFCC = iCellFccAll + parHs[level]->intFCBorder.kFC;
-    parHs[level]->intFCBulk.ICellFCF = iCellFcfAll + parHs[level]->intFCBorder.kFC;
-    parHs[level]->offFCBulk.xOffFC = parHs[level]->offFC.xOffFC + parHs[level]->intFCBorder.kFC;
-    parHs[level]->offFCBulk.yOffFC = parHs[level]->offFC.yOffFC + parHs[level]->intFCBorder.kFC;
-    parHs[level]->offFCBulk.zOffFC = parHs[level]->offFC.zOffFC + parHs[level]->intFCBorder.kFC;
+    parHs[level]->fineToCoarseBorder.coarseCellIndices = fineToCoarseCoarseAll;
+    parHs[level]->fineToCoarseBorder.fineCellIndices = fineToCoarseFineAll;
+    parHs[level]->fineToCoarseBorder.numberOfCells = (uint)fineToCoarseCoarseBorderVector.size();
+    parHs[level]->fineToCoarseBulk.numberOfCells = (uint)fineToCoarseCoarseBulkVector.size();
+    parHs[level]->fineToCoarseBulk.coarseCellIndices = fineToCoarseCoarseAll + parHs[level]->fineToCoarseBorder.numberOfCells;
+    parHs[level]->fineToCoarseBulk.fineCellIndices = fineToCoarseFineAll + parHs[level]->fineToCoarseBorder.numberOfCells;
+    parHs[level]->neighborFineToCoarseBulk.x = parHs[level]->neighborFineToCoarse.x + parHs[level]->fineToCoarseBorder.numberOfCells;
+    parHs[level]->neighborFineToCoarseBulk.y = parHs[level]->neighborFineToCoarse.y + parHs[level]->fineToCoarseBorder.numberOfCells;
+    parHs[level]->neighborFineToCoarseBulk.z = parHs[level]->neighborFineToCoarse.z + parHs[level]->fineToCoarseBorder.numberOfCells;
 
     // copy the created vectors to the memory addresses of the old arrays
     // this is inefficient :(
-    for (uint i = 0; i < (uint)iCellFccBorderVector.size(); i++) {
-        iCellFccAll[i] = iCellFccBorderVector[i];
-        iCellFcfAll[i] = iCellFcfBorderVector[i];
-        parHs[level]->offFC.xOffFC[i] = xOffFCBorderVector[i];
-        parHs[level]->offFC.yOffFC[i] = yOffFCBorderVector[i];
-        parHs[level]->offFC.zOffFC[i] = zOffFCBorderVector[i];
+    for (uint i = 0; i < (uint)fineToCoarseCoarseBorderVector.size(); i++) {
+        fineToCoarseCoarseAll[i] = fineToCoarseCoarseBorderVector[i];
+        fineToCoarseFineAll[i] = fineToCoarseFineBorderVector[i];
+        parHs[level]->neighborFineToCoarse.x[i] = neighborXBorder[i];
+        parHs[level]->neighborFineToCoarse.y[i] = neighborYBorder[i];
+        parHs[level]->neighborFineToCoarse.z[i] = neighborZBorder[i];
     }
-    for (uint i = 0; i < (uint)iCellFccBulkVector.size(); i++) {
-        parHs[level]->intFCBulk.ICellFCC[i] = iCellFccBulkVector[i];
-        parHs[level]->intFCBulk.ICellFCF[i] = iCellFcfBulkVector[i];
-        parHs[level]->offFCBulk.xOffFC[i] = xOffFCBulkVector[i];
-        parHs[level]->offFCBulk.yOffFC[i] = yOffFCBulkVector[i];
-        parHs[level]->offFCBulk.zOffFC[i] = zOffFCBulkVector[i];
+    for (uint i = 0; i < (uint)fineToCoarseCoarseBulkVector.size(); i++) {
+        parHs[level]->fineToCoarseBulk.coarseCellIndices[i] = fineToCoarseCoarseBulkVector[i];
+        parHs[level]->fineToCoarseBulk.fineCellIndices[i] = fineToCoarseFineBulkVector[i];
+        parHs[level]->neighborFineToCoarseBulk.x[i] = neighborXBulk[i];
+        parHs[level]->neighborFineToCoarseBulk.y[i] = neighborYBulk[i];
+        parHs[level]->neighborFineToCoarseBulk.z[i] = neighborZBulk[i];
     }
 }
 
@@ -92,42 +92,42 @@ void InterpolationCellGrouper::splitCoarseToFineIntoBorderAndBulk(uint level) co
 {
     this->reorderCoarseToFineIntoBorderAndBulk(level);
 
-    parDs[level]->intCFBorder.kCF = parHs[level]->intCFBorder.kCF;
-    parDs[level]->intCFBulk.kCF = parHs[level]->intCFBulk.kCF;
-    parDs[level]->intCFBorder.ICellCFC = parDs[level]->intCF.ICellCFC;
-    parDs[level]->intCFBulk.ICellCFC = parDs[level]->intCFBorder.ICellCFC + parDs[level]->intCFBorder.kCF;
-    parDs[level]->intCFBorder.ICellCFF = parDs[level]->intCF.ICellCFF;
-    parDs[level]->intCFBulk.ICellCFF = parDs[level]->intCFBorder.ICellCFF + parDs[level]->intCFBorder.kCF;
-    parDs[level]->offCFBulk.xOffCF = parDs[level]->offCF.xOffCF + parDs[level]->intCFBorder.kCF;
-    parDs[level]->offCFBulk.yOffCF = parDs[level]->offCF.yOffCF + parDs[level]->intCFBorder.kCF;
-    parDs[level]->offCFBulk.zOffCF = parDs[level]->offCF.zOffCF + parDs[level]->intCFBorder.kCF;
+    parDs[level]->coarseToFineBorder.numberOfCells = parHs[level]->coarseToFineBorder.numberOfCells;
+    parDs[level]->coarseToFineBulk.numberOfCells = parHs[level]->coarseToFineBulk.numberOfCells;
+    parDs[level]->coarseToFineBorder.coarseCellIndices = parDs[level]->coarseToFine.coarseCellIndices;
+    parDs[level]->coarseToFineBulk.coarseCellIndices = parDs[level]->coarseToFineBorder.coarseCellIndices + parDs[level]->coarseToFineBorder.numberOfCells;
+    parDs[level]->coarseToFineBorder.fineCellIndices = parDs[level]->coarseToFine.fineCellIndices;
+    parDs[level]->coarseToFineBulk.fineCellIndices = parDs[level]->coarseToFineBorder.fineCellIndices + parDs[level]->coarseToFineBorder.numberOfCells;
+    parDs[level]->neighborCoarseToFineBulk.x = parDs[level]->neighborCoarseToFine.x + parDs[level]->coarseToFineBorder.numberOfCells;
+    parDs[level]->neighborCoarseToFineBulk.y = parDs[level]->neighborCoarseToFine.y + parDs[level]->coarseToFineBorder.numberOfCells;
+    parDs[level]->neighborCoarseToFineBulk.z = parDs[level]->neighborCoarseToFine.z + parDs[level]->coarseToFineBorder.numberOfCells;
 }
 
 void InterpolationCellGrouper::reorderCoarseToFineIntoBorderAndBulk(uint level) const
 {
     // create some local variables for better readability
-    uint *iCellCfcAll = parHs[level]->intCF.ICellCFC;
-    uint *iCellCffAll = parHs[level]->intCF.ICellCFF;
+    uint *coarseToFineCoarseAll = parHs[level]->coarseToFine.coarseCellIndices;
+    uint *coarseToFineFineAll = parHs[level]->coarseToFine.fineCellIndices;
     uint *neighborX = this->parHs[level]->neighborX;
     uint *neighborY = this->parHs[level]->neighborY;
     uint *neighborZ = this->parHs[level]->neighborZ;
     auto grid = this->builder->getGrid(level);
 
-    std::vector<uint> iCellCfcBorderVector;
-    std::vector<uint> iCellCfcBulkVector;
-    std::vector<uint> iCellCffBorderVector;
-    std::vector<uint> iCellCffBulkVector;
-    std::vector<real> xOffCFBorderVector;
-    std::vector<real> yOffCFBorderVector;
-    std::vector<real> zOffCFBorderVector;
-    std::vector<real> xOffCFBulkVector;
-    std::vector<real> yOffCFBulkVector;
-    std::vector<real> zOffCFBulkVector;
+    std::vector<uint> coarseToFineCoarseBorderVector;
+    std::vector<uint> coarseToFineCoarseBulkVector;
+    std::vector<uint> coarseToFineFineBorderVector;
+    std::vector<uint> coarseToFineFineBulkVector;
+    std::vector<real> neighborXBorder;
+    std::vector<real> neighborYBorder;
+    std::vector<real> neighborZBorder;
+    std::vector<real> neighborXBulk;
+    std::vector<real> neighborYBulk;
+    std::vector<real> neighborZBulk;
     uint sparseIndexOfICellBSW;
 
-    // fill border and bulk vectors with iCellCFs
-    for (uint i = 0; i < parHs[level]->intCF.kCF; i++) {
-        sparseIndexOfICellBSW = iCellCfcAll[i];
+    // fill border and bulk vectors with interpolation cells coarse to fine
+    for (uint i = 0; i < parHs[level]->coarseToFine.numberOfCells; i++) {
+        sparseIndexOfICellBSW = coarseToFineCoarseAll[i];
 
         if (grid->isSparseIndexInFluidNodeIndicesBorder(sparseIndexOfICellBSW) ||
             grid->isSparseIndexInFluidNodeIndicesBorder(neighborX[sparseIndexOfICellBSW]) ||
@@ -138,45 +138,45 @@ void InterpolationCellGrouper::reorderCoarseToFineIntoBorderAndBulk(uint level)
             grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ[neighborY[sparseIndexOfICellBSW]]) ||
             grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ[neighborY[neighborX[sparseIndexOfICellBSW]]])) {
 
-            iCellCfcBorderVector.push_back(iCellCfcAll[i]);
-            iCellCffBorderVector.push_back(iCellCffAll[i]);
-            xOffCFBorderVector.push_back(parHs[level]->offCF.xOffCF[i]);
-            yOffCFBorderVector.push_back(parHs[level]->offCF.yOffCF[i]);
-            zOffCFBorderVector.push_back(parHs[level]->offCF.zOffCF[i]);
+            coarseToFineCoarseBorderVector.push_back(coarseToFineCoarseAll[i]);
+            coarseToFineFineBorderVector.push_back(coarseToFineFineAll[i]);
+            neighborXBorder.push_back(parHs[level]->neighborCoarseToFine.x[i]);
+            neighborYBorder.push_back(parHs[level]->neighborCoarseToFine.y[i]);
+            neighborZBorder.push_back(parHs[level]->neighborCoarseToFine.z[i]);
         } else {
-            iCellCfcBulkVector.push_back(iCellCfcAll[i]);
-            iCellCffBulkVector.push_back(iCellCffAll[i]);
-            xOffCFBulkVector.push_back(parHs[level]->offCF.xOffCF[i]);
-            yOffCFBulkVector.push_back(parHs[level]->offCF.yOffCF[i]);
-            zOffCFBulkVector.push_back(parHs[level]->offCF.zOffCF[i]);
+            coarseToFineCoarseBulkVector.push_back(coarseToFineCoarseAll[i]);
+            coarseToFineFineBulkVector.push_back(coarseToFineFineAll[i]);
+            neighborXBulk.push_back(parHs[level]->neighborCoarseToFine.x[i]);
+            neighborYBulk.push_back(parHs[level]->neighborCoarseToFine.y[i]);
+            neighborZBulk.push_back(parHs[level]->neighborCoarseToFine.z[i]);
         }
     }
 
     // set new sizes and pointers
-    parHs[level]->intCFBorder.ICellCFC = parHs[level]->intCF.ICellCFC;
-    parHs[level]->intCFBorder.ICellCFF = parHs[level]->intCF.ICellCFF;
-    parHs[level]->intCFBorder.kCF = (uint)iCellCfcBorderVector.size();
-    parHs[level]->intCFBulk.kCF = (uint)iCellCfcBulkVector.size();
-    parHs[level]->intCFBulk.ICellCFC = parHs[level]->intCF.ICellCFC + parHs[level]->intCFBorder.kCF;
-    parHs[level]->intCFBulk.ICellCFF = parHs[level]->intCF.ICellCFF + parHs[level]->intCFBorder.kCF;
-    parHs[level]->offCFBulk.xOffCF = parHs[level]->offCF.xOffCF + parHs[level]->intCFBorder.kCF;
-    parHs[level]->offCFBulk.yOffCF = parHs[level]->offCF.yOffCF + parHs[level]->intCFBorder.kCF;
-    parHs[level]->offCFBulk.zOffCF = parHs[level]->offCF.zOffCF + parHs[level]->intCFBorder.kCF;
+    parHs[level]->coarseToFineBorder.coarseCellIndices = parHs[level]->coarseToFine.coarseCellIndices;
+    parHs[level]->coarseToFineBorder.fineCellIndices = parHs[level]->coarseToFine.fineCellIndices;
+    parHs[level]->coarseToFineBorder.numberOfCells = (uint)coarseToFineCoarseBorderVector.size();
+    parHs[level]->coarseToFineBulk.numberOfCells = (uint)coarseToFineCoarseBulkVector.size();
+    parHs[level]->coarseToFineBulk.coarseCellIndices = parHs[level]->coarseToFine.coarseCellIndices + parHs[level]->coarseToFineBorder.numberOfCells;
+    parHs[level]->coarseToFineBulk.fineCellIndices = parHs[level]->coarseToFine.fineCellIndices + parHs[level]->coarseToFineBorder.numberOfCells;
+    parHs[level]->neighborCoarseToFineBulk.x = parHs[level]->neighborCoarseToFine.x + parHs[level]->coarseToFineBorder.numberOfCells;
+    parHs[level]->neighborCoarseToFineBulk.y = parHs[level]->neighborCoarseToFine.y + parHs[level]->coarseToFineBorder.numberOfCells;
+    parHs[level]->neighborCoarseToFineBulk.z = parHs[level]->neighborCoarseToFine.z + parHs[level]->coarseToFineBorder.numberOfCells;
 
     // copy the created vectors to the memory addresses of the old arrays
     // this is inefficient :(
-    for (uint i = 0; i < (uint)iCellCfcBorderVector.size(); i++) {
-        parHs[level]->intCFBorder.ICellCFC[i] = iCellCfcBorderVector[i];
-        parHs[level]->intCFBorder.ICellCFF[i] = iCellCffBorderVector[i];
-        parHs[level]->offCF.xOffCF[i] = xOffCFBorderVector[i];
-        parHs[level]->offCF.yOffCF[i] = yOffCFBorderVector[i];
-        parHs[level]->offCF.zOffCF[i] = zOffCFBorderVector[i];
+    for (uint i = 0; i < (uint)coarseToFineCoarseBorderVector.size(); i++) {
+        parHs[level]->coarseToFineBorder.coarseCellIndices[i] = coarseToFineCoarseBorderVector[i];
+        parHs[level]->coarseToFineBorder.fineCellIndices[i] = coarseToFineFineBorderVector[i];
+        parHs[level]->neighborCoarseToFine.x[i] = neighborXBorder[i];
+        parHs[level]->neighborCoarseToFine.y[i] = neighborYBorder[i];
+        parHs[level]->neighborCoarseToFine.z[i] = neighborZBorder[i];
     }
-    for (uint i = 0; i < (uint)iCellCfcBulkVector.size(); i++) {
-        parHs[level]->intCFBulk.ICellCFC[i] = iCellCfcBulkVector[i];
-        parHs[level]->intCFBulk.ICellCFF[i] = iCellCffBulkVector[i];
-        parHs[level]->offCFBulk.xOffCF[i] = xOffCFBulkVector[i];
-        parHs[level]->offCFBulk.yOffCF[i] = yOffCFBulkVector[i];
-        parHs[level]->offCFBulk.zOffCF[i] = zOffCFBulkVector[i];
+    for (uint i = 0; i < (uint)coarseToFineCoarseBulkVector.size(); i++) {
+        parHs[level]->coarseToFineBulk.coarseCellIndices[i] = coarseToFineCoarseBulkVector[i];
+        parHs[level]->coarseToFineBulk.fineCellIndices[i] = coarseToFineFineBulkVector[i];
+        parHs[level]->neighborCoarseToFineBulk.x[i] = neighborXBulk[i];
+        parHs[level]->neighborCoarseToFineBulk.y[i] = neighborYBulk[i];
+        parHs[level]->neighborCoarseToFineBulk.z[i] = neighborZBulk[i];
     }
 }
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.h
index 5471194f643e044a7c2cdca1db45017b9d3a1022..600b31aef4ff99080a8e580a24625b35463990ac 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouper.h
@@ -54,14 +54,14 @@ protected:
     //////////////////////////////////////////////////////////////////////////
 
     //! \brief This function reorders the arrays of CFC/CFF indices and sets the pointers and sizes of the new
-    //! subarrays: \details The coarse cells for interpolation from coarse to fine (iCellCFC) are divided into two
-    //! subgroups: border and bulk. The fine cells (iCellCFF) are reordered accordingly. The offset cells (xOffCF,
+    //! subarrays: \details The coarse cells for interpolation from coarse to fine (coarseToFineCoarse) are divided into two
+    //! subgroups: border and bulk. The fine cells (coarseToFineFine) are reordered accordingly. The offset cells (xOffCF,
     //! yOffCF, zOffCF) must be reordered in the same way.
     void reorderCoarseToFineIntoBorderAndBulk(uint level) const;
 
     //! \brief This function reorders the arrays of FCC/FCF indices and return pointers and sizes of the new subarrays:
-    //! \details The coarse cells for interpolation from fine to coarse (iCellFCC) are divided into two subgroups:
-    //! border and bulk. The fine cells (iCellFCF) are reordered accordingly. The offset cells (xOffFC,
+    //! \details The coarse cells for interpolation from fine to coarse (fineToCoarseCoarse) are divided into two subgroups:
+    //! border and bulk. The fine cells (fineToCoarseFine) are reordered accordingly. The offset cells (xOffFC,
     //! yOffFC, zOffFC) must be reordered in the same way.
     void reorderFineToCoarseIntoBorderAndBulk(uint level) const;
 
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouperTest.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouperTest.cpp
index 664552b2f47542cc6ae3d4940c2b74ede1beff91..8fa9a8a71ee5e60a129d06dffa09b8247766b88c 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouperTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/InterpolationCellGrouperTest.cpp
@@ -62,37 +62,37 @@ public:
     }
 };
 
-struct CFBorderBulk {
+struct CoarseToFineBorderBulk {
     // data to work on
     std::vector<uint> fluidNodeIndicesBorder = { 10, 11, 12, 13, 14, 15, 16 };
-    std::vector<uint> iCellCFC = { 1, 11, 3, 13, 5, 15, 7 };
-    std::vector<uint> iCellCFF = { 2, 12, 4, 14, 6, 16, 8 };
-    const uint sizeOfICellCf = (uint)iCellCFC.size();
+    std::vector<uint> intCtoFcoarse = { 1, 11, 3, 13, 5, 15, 7 };
+    std::vector<uint> fineCellIndices = { 2, 12, 4, 14, 6, 16, 8 };
+    const uint sizeOfInterpolationCoarseToFine = (uint)intCtoFcoarse.size();
     uint neighborX[17] = { 0u };
     uint neighborY[17] = { 0u };
     uint neighborZ[17] = { 0u };
     const int level = 0;
-    std::vector<real> offsetCFx = { 1, 11, 3, 13, 5, 15, 7 };
-    std::vector<real> offsetCFy = { 101, 111, 103, 113, 105, 115, 107 };
-    std::vector<real> offsetCFz = { 1001, 1011, 1003, 1013, 1005, 1015, 1007 };
+    std::vector<real> neighborCFx = { 1, 11, 3, 13, 5, 15, 7 };
+    std::vector<real> neighborCFy = { 101, 111, 103, 113, 105, 115, 107 };
+    std::vector<real> neighborCFz = { 1001, 1011, 1003, 1013, 1005, 1015, 1007 };
 
     // expected data
-    std::vector<uint> iCellCfcBorder_expected = { 11, 13, 15 };
-    std::vector<uint> iCellCfcBulk_expected = { 1, 3, 5, 7 };
-    std::vector<uint> iCellCffBorder_expected = { 12, 14, 16 };
-    std::vector<uint> iCellCffBulk_expected = { 2, 4, 6, 8 };
-    std::vector<real> offsetCFx_Border_expected = { 11, 13, 15 };
-    std::vector<real> offsetCFx_Bulk_expected = { 1, 3, 5, 7 };
-    std::vector<real> offsetCFy_Border_expected = { 111, 113, 115 };
-    std::vector<real> offsetCFy_Bulk_expected = { 101, 103, 105, 107 };
-    std::vector<real> offsetCFz_Border_expected = { 1011, 1013, 1015 };
-    std::vector<real> offsetCFz_Bulk_expected = { 1001, 1003, 1005, 1007 };
+    std::vector<uint> intCtoFcoarseBorder_expected = { 11, 13, 15 };
+    std::vector<uint> intCtoFcoarseBulk_expected = { 1, 3, 5, 7 };
+    std::vector<uint> fineCellIndicesBorder_expected = { 12, 14, 16 };
+    std::vector<uint> fineCellIndicesBulk_expected = { 2, 4, 6, 8 };
+    std::vector<real> neighborCFx_Border_expected = { 11, 13, 15 };
+    std::vector<real> neighborCFx_Bulk_expected = { 1, 3, 5, 7 };
+    std::vector<real> neighborCFy_Border_expected = { 111, 113, 115 };
+    std::vector<real> neighborCFy_Bulk_expected = { 101, 103, 105, 107 };
+    std::vector<real> neighborCFz_Border_expected = { 1011, 1013, 1015 };
+    std::vector<real> neighborCFz_Bulk_expected = { 1001, 1003, 1005, 1007 };
 };
 
 class InterpolationCellGrouperTest_IndicesCFBorderBulkTest : public testing::Test
 {
 protected:
-    CFBorderBulk cf;
+    CoarseToFineBorderBulk cf;
     SPtr<Parameter> para;
     std::unique_ptr<InterpolationCellGrouper> testSubject;
 
@@ -105,15 +105,15 @@ private:
         std::shared_ptr<LevelGridBuilderDouble> builder = std::make_shared<LevelGridBuilderDouble>(grid);
 
         para = testingVF::createParameterForLevel(cf.level);
-        para->getParH(cf.level)->intCF.ICellCFC = &(cf.iCellCFC.front());
-        para->getParH(cf.level)->intCF.ICellCFF = &(cf.iCellCFF.front());
+        para->getParH(cf.level)->coarseToFine.coarseCellIndices = &(cf.intCtoFcoarse.front());
+        para->getParH(cf.level)->coarseToFine.fineCellIndices = &(cf.fineCellIndices.front());
         para->getParH(cf.level)->neighborX = cf.neighborX;
         para->getParH(cf.level)->neighborY = cf.neighborY;
         para->getParH(cf.level)->neighborZ = cf.neighborZ;
-        para->getParH(cf.level)->intCF.kCF = cf.sizeOfICellCf;
-        para->getParH(cf.level)->offCF.xOffCF = &(cf.offsetCFx.front());
-        para->getParH(cf.level)->offCF.yOffCF = &(cf.offsetCFy.front());
-        para->getParH(cf.level)->offCF.zOffCF = &(cf.offsetCFz.front());
+        para->getParH(cf.level)->coarseToFine.numberOfCells = cf.sizeOfInterpolationCoarseToFine;
+        para->getParH(cf.level)->neighborCoarseToFine.x = &(cf.neighborCFx.front());
+        para->getParH(cf.level)->neighborCoarseToFine.y = &(cf.neighborCFy.front());
+        para->getParH(cf.level)->neighborCoarseToFine.z = &(cf.neighborCFz.front());
 
         return std::make_unique<InterpolationCellGrouper>(para->getParHallLevels(), para->getParDallLevels(), builder);
     };
@@ -128,65 +128,65 @@ TEST_F(InterpolationCellGrouperTest_IndicesCFBorderBulkTest, splitCoarseToFineIn
 {
     testSubject->splitCoarseToFineIntoBorderAndBulk(cf.level);
 
-    EXPECT_THAT(para->getParH(cf.level)->intCFBorder.kCF + para->getParH(cf.level)->intCFBulk.kCF,
-                testing::Eq(cf.sizeOfICellCf))
+    EXPECT_THAT(para->getParH(cf.level)->coarseToFineBorder.numberOfCells + para->getParH(cf.level)->coarseToFineBulk.numberOfCells,
+                testing::Eq(cf.sizeOfInterpolationCoarseToFine))
         << "The number of interpolation cells from coarse to fine changed during reordering.";
 
     // check coarse to fine border (coarse nodes)
-    EXPECT_THAT(para->getParH(cf.level)->intCFBorder.kCF, testing::Eq((uint)cf.iCellCfcBorder_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->intCFBorder.ICellCFC, cf.iCellCfcBorder_expected))
-        << "intCFBorder.ICellCFC does not match the expected border vector";
+    EXPECT_THAT(para->getParH(cf.level)->coarseToFineBorder.numberOfCells, testing::Eq((uint)cf.intCtoFcoarseBorder_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->coarseToFineBorder.coarseCellIndices, cf.intCtoFcoarseBorder_expected))
+        << "coarseToFineBorder.intCtoFcoarse does not match the expected border vector";
     // check coarse to fine border (fine nodes)
-    EXPECT_THAT(para->getParH(cf.level)->intCFBorder.kCF, testing::Eq((uint)cf.iCellCffBorder_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->intCFBorder.ICellCFF, cf.iCellCffBorder_expected))
-        << "intCFBorder.ICellCFF does not match the expected border vector";
+    EXPECT_THAT(para->getParH(cf.level)->coarseToFineBorder.numberOfCells, testing::Eq((uint)cf.fineCellIndicesBorder_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->coarseToFineBorder.fineCellIndices, cf.fineCellIndicesBorder_expected))
+        << "coarseToFineBorder.fineCellIndices does not match the expected border vector";
 
     // check coarse to fine bulk (coarse nodes)
-    EXPECT_THAT(para->getParH(cf.level)->intCFBulk.kCF, testing::Eq((uint)cf.iCellCfcBulk_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->intCFBulk.ICellCFC, cf.iCellCfcBulk_expected))
-        << "intCFBulk.ICellCFC does not match the expected bulk vector";
+    EXPECT_THAT(para->getParH(cf.level)->coarseToFineBulk.numberOfCells, testing::Eq((uint)cf.intCtoFcoarseBulk_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->coarseToFineBulk.coarseCellIndices, cf.intCtoFcoarseBulk_expected))
+        << "coarseToFineBulk.intCtoFcoarse does not match the expected bulk vector";
     // check coarse to fine bulk (fine nodes)
-    EXPECT_THAT(para->getParH(cf.level)->intCFBulk.kCF, testing::Eq((uint)cf.iCellCffBulk_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->intCFBulk.ICellCFF, cf.iCellCffBulk_expected))
-        << "intCFBulk.ICellCFF does not match the expected bulk vector";
-
-    // check offset cells
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->offCF.xOffCF, cf.offsetCFx_Border_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->offCFBulk.xOffCF, cf.offsetCFx_Bulk_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->offCF.yOffCF, cf.offsetCFy_Border_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->offCFBulk.yOffCF, cf.offsetCFy_Bulk_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->offCF.zOffCF, cf.offsetCFz_Border_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->offCFBulk.zOffCF, cf.offsetCFz_Bulk_expected));
+    EXPECT_THAT(para->getParH(cf.level)->coarseToFineBulk.numberOfCells, testing::Eq((uint)cf.fineCellIndicesBulk_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->coarseToFineBulk.fineCellIndices, cf.fineCellIndicesBulk_expected))
+        << "coarseToFineBulk.fineCellIndices does not match the expected bulk vector";
+
+    // check neighbor cells
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->neighborCoarseToFine.x, cf.neighborCFx_Border_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->neighborCoarseToFineBulk.x, cf.neighborCFx_Bulk_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->neighborCoarseToFine.y, cf.neighborCFy_Border_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->neighborCoarseToFineBulk.y, cf.neighborCFy_Bulk_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->neighborCoarseToFine.z, cf.neighborCFz_Border_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(cf.level)->neighborCoarseToFineBulk.z, cf.neighborCFz_Bulk_expected));
 }
 
-struct FCBorderBulk {
+struct FineToCoarseBorderBulk {
     // data to work on
     std::vector<uint> fluidNodeIndicesBorder = { 110, 111, 112, 113, 114, 115, 116 };
-    std::vector<uint> iCellFCC = { 11, 111, 13, 113, 15, 115, 17 };
-    std::vector<uint> iCellFCF = { 12, 112, 14, 114, 16, 116, 18 };
-    const uint sizeOfICellFC = (uint)iCellFCC.size();
+    std::vector<uint> coarseCellIndices = { 11, 111, 13, 113, 15, 115, 17 };
+    std::vector<uint> fineCellIndices = { 12, 112, 14, 114, 16, 116, 18 };
+    const uint sizeOfIntFineToCoarse = (uint)coarseCellIndices.size();
     const int level = 1;
-    std::vector<real> offsetFCx = { 11, 111, 13, 113, 15, 115, 17 };
-    std::vector<real> offsetFCy = { 1101, 1111, 1103, 1113, 1105, 1115, 1107 };
-    std::vector<real> offsetFCz = { 11001, 11011, 11003, 11013, 11005, 11015, 11007 };
+    std::vector<real> neighborx = { 11, 111, 13, 113, 15, 115, 17 };
+    std::vector<real> neighbory = { 1101, 1111, 1103, 1113, 1105, 1115, 1107 };
+    std::vector<real> neighborz = { 11001, 11011, 11003, 11013, 11005, 11015, 11007 };
 
     // expected data
-    std::vector<uint> iCellFccBorder_expected = { 111, 113, 115 };
-    std::vector<uint> iCellFccBulk_expected = { 11, 13, 15, 17 };
-    std::vector<uint> iCellFcfBorder_expected = { 112, 114, 116 };
-    std::vector<uint> iCellFcfBulk_expected = { 12, 14, 16, 18 };
-    std::vector<real> offsetFCx_Border_expected = { 111, 113, 115 };
-    std::vector<real> offsetFCx_Bulk_expected = { 11, 13, 15, 17 };
-    std::vector<real> offsetFCy_Border_expected = { 1111, 1113, 1115 };
-    std::vector<real> offsetFCy_Bulk_expected = { 1101, 1103, 1105, 1107 };
-    std::vector<real> offsetFCz_Border_expected = { 11011, 11013, 11015 };
-    std::vector<real> offsetFCz_Bulk_expected = { 11001, 11003, 11005, 11007 };
+    std::vector<uint> coarseCellIndicesBorder_expected = { 111, 113, 115 };
+    std::vector<uint> coarseCellIndicesBulk_expected = { 11, 13, 15, 17 };
+    std::vector<uint> fineCellIndicesBorder_expected = { 112, 114, 116 };
+    std::vector<uint> fineCellIndicesBulk_expected = { 12, 14, 16, 18 };
+    std::vector<real> neighborx_Border_expected = { 111, 113, 115 };
+    std::vector<real> neighborx_Bulk_expected = { 11, 13, 15, 17 };
+    std::vector<real> neighbory_Border_expected = { 1111, 1113, 1115 };
+    std::vector<real> neighbory_Bulk_expected = { 1101, 1103, 1105, 1107 };
+    std::vector<real> neighborz_Border_expected = { 11011, 11013, 11015 };
+    std::vector<real> neighborz_Bulk_expected = { 11001, 11003, 11005, 11007 };
 };
 
 class InterpolationCellGrouperTest_IndicesFCBorderBulkTest : public testing::Test
 {
 protected:
-    FCBorderBulk fc;
+    FineToCoarseBorderBulk fc;
     SPtr<Parameter> para;
     std::unique_ptr<InterpolationCellGrouper> testSubject;
 
@@ -199,12 +199,12 @@ private:
         std::shared_ptr<LevelGridBuilderDouble> builder = std::make_shared<LevelGridBuilderDouble>(grid);
 
         para = testingVF::createParameterForLevel(fc.level);
-        para->getParH(fc.level)->intFC.ICellFCC = &(fc.iCellFCC.front());
-        para->getParH(fc.level)->intFC.ICellFCF = &(fc.iCellFCF.front());
-        para->getParH(fc.level)->intFC.kFC = fc.sizeOfICellFC;
-        para->getParH(fc.level)->offFC.xOffFC = &(fc.offsetFCx.front());
-        para->getParH(fc.level)->offFC.yOffFC = &(fc.offsetFCy.front());
-        para->getParH(fc.level)->offFC.zOffFC = &(fc.offsetFCz.front());
+        para->getParH(fc.level)->fineToCoarse.coarseCellIndices = &(fc.coarseCellIndices.front());
+        para->getParH(fc.level)->fineToCoarse.fineCellIndices = &(fc.fineCellIndices.front());
+        para->getParH(fc.level)->fineToCoarse.numberOfCells = fc.sizeOfIntFineToCoarse;
+        para->getParH(fc.level)->neighborFineToCoarse.x = &(fc.neighborx.front());
+        para->getParH(fc.level)->neighborFineToCoarse.y = &(fc.neighbory.front());
+        para->getParH(fc.level)->neighborFineToCoarse.z = &(fc.neighborz.front());
 
         return std::make_unique<InterpolationCellGrouper>(para->getParHallLevels(), para->getParDallLevels(), builder);
     };
@@ -219,33 +219,33 @@ TEST_F(InterpolationCellGrouperTest_IndicesFCBorderBulkTest, splitFineToCoarseIn
 {
     testSubject->splitFineToCoarseIntoBorderAndBulk(fc.level);
 
-    EXPECT_THAT(para->getParH(fc.level)->intFCBorder.kFC + para->getParH(fc.level)->intFCBulk.kFC,
-                testing::Eq(fc.sizeOfICellFC))
+    EXPECT_THAT(para->getParH(fc.level)->fineToCoarseBorder.numberOfCells + para->getParH(fc.level)->fineToCoarseBulk.numberOfCells,
+                testing::Eq(fc.sizeOfIntFineToCoarse))
         << "The number of interpolation cells from coarse to fine changed during reordering.";
 
     // check coarse to fine border (coarse nodes)
-    EXPECT_THAT(para->getParH(fc.level)->intFCBorder.kFC, testing::Eq((uint)fc.iCellFccBorder_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->intFCBorder.ICellFCC, fc.iCellFccBorder_expected))
-        << "intFCBorder.ICellFCC does not match the expected border vector";
+    EXPECT_THAT(para->getParH(fc.level)->fineToCoarseBorder.numberOfCells, testing::Eq((uint)fc.coarseCellIndicesBorder_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->fineToCoarseBorder.coarseCellIndices, fc.coarseCellIndicesBorder_expected))
+        << "fineToCoarseBorder.coarseCellIndices does not match the expected border vector";
     // check coarse to fine border (fine nodes)
-    EXPECT_THAT(para->getParH(fc.level)->intFCBorder.kFC, testing::Eq((uint)fc.iCellFcfBorder_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->intFCBorder.ICellFCF, fc.iCellFcfBorder_expected))
-        << "intFCBorder.ICellFCF does not match the expected border vector";
+    EXPECT_THAT(para->getParH(fc.level)->fineToCoarseBorder.numberOfCells, testing::Eq((uint)fc.fineCellIndicesBorder_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->fineToCoarseBorder.fineCellIndices, fc.fineCellIndicesBorder_expected))
+        << "fineToCoarseBorder.fineCellIndices does not match the expected border vector";
 
     // check coarse to fine bulk (coarse nodes)
-    EXPECT_THAT(para->getParH(fc.level)->intFCBulk.kFC, testing::Eq((uint)fc.iCellFccBulk_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->intFCBulk.ICellFCC, fc.iCellFccBulk_expected))
-        << "intFCBulk.ICellFCC does not match the expected bulk vector";
+    EXPECT_THAT(para->getParH(fc.level)->fineToCoarseBulk.numberOfCells, testing::Eq((uint)fc.coarseCellIndicesBulk_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->fineToCoarseBulk.coarseCellIndices, fc.coarseCellIndicesBulk_expected))
+        << "fineToCoarseBulk.coarseCellIndices does not match the expected bulk vector";
     // check coarse to fine bulk (fine nodes)
-    EXPECT_THAT(para->getParH(fc.level)->intFCBulk.kFC, testing::Eq((uint)fc.iCellFcfBulk_expected.size()));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->intFCBulk.ICellFCF, fc.iCellFcfBulk_expected))
-        << "intFCBulk.ICellFCF does not match the expected bulk vector";
-
-    // check offset cells
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->offFC.xOffFC, fc.offsetFCx_Border_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->offFCBulk.xOffFC, fc.offsetFCx_Bulk_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->offFC.yOffFC, fc.offsetFCy_Border_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->offFCBulk.yOffFC, fc.offsetFCy_Bulk_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->offFC.zOffFC, fc.offsetFCz_Border_expected));
-    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->offFCBulk.zOffFC, fc.offsetFCz_Bulk_expected));
+    EXPECT_THAT(para->getParH(fc.level)->fineToCoarseBulk.numberOfCells, testing::Eq((uint)fc.fineCellIndicesBulk_expected.size()));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->fineToCoarseBulk.fineCellIndices, fc.fineCellIndicesBulk_expected))
+        << "fineToCoarseBulk.fineCellIndices does not match the expected bulk vector";
+
+    // check neighbor cells
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->neighborFineToCoarse.x, fc.neighborx_Border_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->neighborFineToCoarseBulk.x, fc.neighborx_Bulk_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->neighborFineToCoarse.y, fc.neighbory_Border_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->neighborFineToCoarseBulk.y, fc.neighbory_Bulk_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->neighborFineToCoarse.z, fc.neighborz_Border_expected));
+    EXPECT_TRUE(vectorsAreEqual(para->getParH(fc.level)->neighborFineToCoarseBulk.z, fc.neighborz_Bulk_expected));
 }
diff --git a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp
index 49a6887ef2e462aba190023d334caa0012e2254e..297e2ac9c05fd225811f40439a26e0b3b4ce4811 100644
--- a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp
+++ b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp
@@ -3,13 +3,13 @@
 
 void GridScalingFactory::setScalingFactory(const GridScalingFactory::GridScaling gridScalingType)
 {
-    this->gridScaling = gridScalingType;
+    this->gridScalingType = gridScalingType;
 }
 
-gridScalingFC GridScalingFactory::getGridScalingFC(bool hasTurbulentViscosity) const
+gridScaling GridScalingFactory::getGridScalingFC(bool hasTurbulentViscosity) const
 {
     // for descriptions of the scaling types refer to the header
-    switch (gridScaling) {
+    switch (gridScalingType) {
         case GridScaling::ScaleRhoSq:
             return ScaleFC_RhoSq_comp_27;
             break;
@@ -22,10 +22,10 @@ gridScalingFC GridScalingFactory::getGridScalingFC(bool hasTurbulentViscosity) c
     }
 }
 
-gridScalingCF GridScalingFactory::getGridScalingCF(bool hasTurbulentViscosity) const
+gridScaling GridScalingFactory::getGridScalingCF(bool hasTurbulentViscosity) const
 {
     // for descriptions of the scaling types refer to the header
-    switch (gridScaling) {
+    switch (gridScalingType) {
         case GridScaling::ScaleRhoSq:
             return ScaleCF_RhoSq_comp_27;
             break;
diff --git a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h
index d760240c2c5ed429799cd89e57704464515a92f5..f8729b0ed9df784eb8d409b6ea97a0ab0f9cbb5a 100644
--- a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h
+++ b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h
@@ -42,8 +42,7 @@ struct LBMSimulationParameter;
 class Parameter;
 struct CUstream_st;
 
-using gridScalingFC = std::function<void(LBMSimulationParameter *, LBMSimulationParameter *, ICellFC *, OffFC&, CUstream_st *stream)>;
-using gridScalingCF = std::function<void(LBMSimulationParameter *, LBMSimulationParameter *, ICellCF *, OffCF&, CUstream_st *stream)>;
+using gridScaling = std::function<void(LBMSimulationParameter *, LBMSimulationParameter *, ICells *, ICellNeigh&, CUstream_st *stream)>;
 
 class GridScalingFactory
 {
@@ -59,11 +58,11 @@ public:
 
     void setScalingFactory(const GridScalingFactory::GridScaling gridScalingType);
 
-    [[nodiscard]] gridScalingFC getGridScalingFC(bool hasTurbulentViscosity) const;
-    [[nodiscard]] gridScalingCF getGridScalingCF(bool hasTurbulentViscosity) const;
+    [[nodiscard]] gridScaling getGridScalingFC(bool hasTurbulentViscosity) const;
+    [[nodiscard]] gridScaling getGridScalingCF(bool hasTurbulentViscosity) const;
 
 private:
-    GridScaling gridScaling = GridScaling::NotSpecified;
+    GridScaling gridScalingType = GridScaling::NotSpecified;
 };
 
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.cpp b/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.cpp
index ec435f0647ba973dbb405aefad069b285e09d6b5..9a0eae2282ca0abf11c77e6e8503c2a5b2bcc0b7 100644
--- a/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.cpp
+++ b/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.cpp
@@ -1,11 +1,11 @@
 #include "FindInterface/FindInterface.h"
 
-void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC, 
+void interpolation(InterpolationCells &intCF, InterpolationCells &intFC, 
                    unsigned int LxCoarse, unsigned int LyCoarse, unsigned int LzCoarse, 
                    unsigned int LxFine, unsigned int LyFine, unsigned int LzFine, 
                    unsigned int dNx, unsigned int dNy, unsigned int dNz, 
                    unsigned int *kCoarse, unsigned int *kFine, bool* needInterface,
-                   OffsetCF &offCF, OffsetFC &offFC)
+                   InterpolationCellNeighbor &offCF, InterpolationCellNeighbor &offFC)
 {
    unsigned int iC,iF,jC,jF,hC,hF;
    unsigned int posCSWB, posFSWB;
@@ -13,8 +13,8 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
    real xOff = (real)0.0f;
    real yOff = (real)0.0f; 
    real zOff = (real)0.0f;
-   intCF.kCF    = 0;
-   intFC.kFC    = 0;
+   intCF.numberOfCells    = 0;
+   intFC.numberOfCells    = 0;
 
    ///////////////////////////////////////////////////////////////////////////
    //Defines
@@ -125,12 +125,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {
             posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-            intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-            intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-            offCF.xOffCF[intCF.kCF]   = xOff;
-            offCF.yOffCF[intCF.kCF]   = yOff;
-            offCF.zOffCF[intCF.kCF]   = zOff;
-            intCF.kCF++;
+            intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+            intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+            offCF.x[intCF.numberOfCells]   = xOff;
+            offCF.y[intCF.numberOfCells]   = yOff;
+            offCF.z[intCF.numberOfCells]   = zOff;
+            intCF.numberOfCells++;
          }
       }
       //////////////////////////   fine->coarse   ////////////////////////////
@@ -142,12 +142,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -166,12 +166,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {
             posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-            intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-            offCF.xOffCF[intCF.kCF]   = xOff;
-            offCF.yOffCF[intCF.kCF]   = yOff;
-            offCF.zOffCF[intCF.kCF]   = zOff;
-            intCF.kCF++;
+            intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+            intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+            offCF.x[intCF.numberOfCells]   = xOff;
+            offCF.y[intCF.numberOfCells]   = yOff;
+            offCF.z[intCF.numberOfCells]   = zOff;
+            intCF.numberOfCells++;
          }
       }
       //////////////////////////   fine->coarse   ////////////////////////////
@@ -183,12 +183,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -207,12 +207,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {
             posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-            intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-            offCF.xOffCF[intCF.kCF]   = xOff;
-            offCF.yOffCF[intCF.kCF]   = yOff;
-            offCF.zOffCF[intCF.kCF]   = zOff;
-            intCF.kCF++;
+            intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+            intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+            offCF.x[intCF.numberOfCells]   = xOff;
+            offCF.y[intCF.numberOfCells]   = yOff;
+            offCF.z[intCF.numberOfCells]   = zOff;
+            intCF.numberOfCells++;
          }
       }
       //////////////////////////   fine->coarse   ////////////////////////////
@@ -224,12 +224,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -248,12 +248,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {
             posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-            intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-            offCF.xOffCF[intCF.kCF]   = xOff;
-            offCF.yOffCF[intCF.kCF]   = yOff;
-            offCF.zOffCF[intCF.kCF]   = zOff;
-            intCF.kCF++;
+            intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+            intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+            offCF.x[intCF.numberOfCells]   = xOff;
+            offCF.y[intCF.numberOfCells]   = yOff;
+            offCF.z[intCF.numberOfCells]   = zOff;
+            intCF.numberOfCells++;
          }
       }
       //////////////////////////   fine->coarse   ////////////////////////////
@@ -265,12 +265,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -289,12 +289,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {
             posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-            intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-            offCF.xOffCF[intCF.kCF]   = xOff;
-            offCF.yOffCF[intCF.kCF]   = yOff;
-            offCF.zOffCF[intCF.kCF]   = zOff;
-            intCF.kCF++;
+            intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+            intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+            offCF.x[intCF.numberOfCells]   = xOff;
+            offCF.y[intCF.numberOfCells]   = yOff;
+            offCF.z[intCF.numberOfCells]   = zOff;
+            intCF.numberOfCells++;
          }
       }
       //////////////////////////   fine->coarse   ////////////////////////////
@@ -306,12 +306,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   =xOff;
-            offFC.yOffFC[intFC.kFC]   =yOff;
-            offFC.zOffFC[intFC.kFC]   =zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   =xOff;
+            offFC.y[intFC.numberOfCells]   =yOff;
+            offFC.z[intFC.numberOfCells]   =zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -330,12 +330,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {
             posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-            intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-            intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-            offCF.xOffCF[intCF.kCF]   = xOff;
-            offCF.yOffCF[intCF.kCF]   = yOff;
-            offCF.zOffCF[intCF.kCF]   = zOff;
-            intCF.kCF++;
+            intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+            intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+            offCF.x[intCF.numberOfCells]   = xOff;
+            offCF.y[intCF.numberOfCells]   = yOff;
+            offCF.z[intCF.numberOfCells]   = zOff;
+            intCF.numberOfCells++;
          }
       }
       //////////////////////////   fine->coarse   ////////////////////////////
@@ -347,12 +347,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -401,12 +401,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -427,12 +427,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_E]==false)
       {
@@ -443,12 +443,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
       else if (needInterface[INTERFACE_N]==false)
@@ -460,12 +460,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -506,12 +506,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -532,12 +532,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_E]==false)
       {
@@ -548,12 +548,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
       else if (needInterface[INTERFACE_S]==false)
@@ -565,12 +565,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -611,12 +611,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -637,12 +637,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_E]==false)
       {
@@ -653,12 +653,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[INTERFACE_T]==false)
@@ -670,12 +670,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -716,12 +716,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -742,12 +742,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_E]==false)
       {
@@ -758,12 +758,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[INTERFACE_B]==false)
@@ -775,12 +775,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -821,12 +821,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -847,12 +847,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_W]==false)
       {
@@ -863,12 +863,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
       else if (needInterface[INTERFACE_N]==false)
@@ -880,12 +880,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -926,12 +926,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -952,12 +952,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_W]==false)
       {
@@ -968,12 +968,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
       else if (needInterface[INTERFACE_S]==false)
@@ -985,12 +985,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1031,12 +1031,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -1057,12 +1057,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_W]==false)
       {
@@ -1073,12 +1073,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[INTERFACE_T]==false)
@@ -1090,12 +1090,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1136,12 +1136,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -1162,12 +1162,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_W]==false)
       {
@@ -1178,12 +1178,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[INTERFACE_B]==false)
@@ -1195,12 +1195,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1241,12 +1241,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -1267,12 +1267,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[ INTERFACE_N]==false)
       {
@@ -1283,12 +1283,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[ INTERFACE_T]==false)
@@ -1300,12 +1300,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1346,12 +1346,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -1372,12 +1372,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[ INTERFACE_N]==false)
       {
@@ -1388,12 +1388,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[ INTERFACE_B]==false)
@@ -1405,12 +1405,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1451,12 +1451,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -1477,12 +1477,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[ INTERFACE_S]==false)
       {
@@ -1493,12 +1493,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[ INTERFACE_T]==false)
@@ -1510,12 +1510,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1556,12 +1556,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {
          posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-         intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-         offCF.xOffCF[intCF.kCF]   = xOff;
-         offCF.yOffCF[intCF.kCF]   = yOff;
-         offCF.zOffCF[intCF.kCF]   = zOff;
-         intCF.kCF++;
+         intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+         intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+         offCF.x[intCF.numberOfCells]   = xOff;
+         offCF.y[intCF.numberOfCells]   = yOff;
+         offCF.z[intCF.numberOfCells]   = zOff;
+         intCF.numberOfCells++;
       }
 
       //////////////////////////////////////////////////////////////////////////
@@ -1582,12 +1582,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       {			
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[ INTERFACE_S]==false)
       {
@@ -1598,12 +1598,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       } 
       else if (needInterface[ INTERFACE_B]==false)
@@ -1615,12 +1615,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
          {			
             posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
             posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-            intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-            intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-            offFC.xOffFC[intFC.kFC]   = xOff;
-            offFC.yOffFC[intFC.kFC]   = yOff;
-            offFC.zOffFC[intFC.kFC]   = zOff;
-            intFC.kFC++;
+            intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+            intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+            offFC.x[intFC.numberOfCells]   = xOff;
+            offFC.y[intFC.numberOfCells]   = yOff;
+            offFC.z[intFC.numberOfCells]   = zOff;
+            intFC.numberOfCells++;
          }
       }
    }
@@ -1665,12 +1665,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -1691,12 +1691,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_E]==false)
       {
@@ -1706,12 +1706,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_N]==false)
       {
@@ -1721,12 +1721,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_T]==false)
       {
@@ -1736,12 +1736,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_N]==false))
       {
@@ -1751,12 +1751,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -1766,12 +1766,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_N]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -1781,12 +1781,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -1822,12 +1822,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -1848,12 +1848,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_E]==false)
       {
@@ -1863,12 +1863,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_N]==false)
       {
@@ -1878,12 +1878,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_B]==false)
       {
@@ -1893,12 +1893,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_N]==false))
       {
@@ -1908,12 +1908,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -1923,12 +1923,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_N]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -1938,12 +1938,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -1979,12 +1979,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -2005,12 +2005,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_E]==false)
       {
@@ -2020,12 +2020,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_S]==false)
       {
@@ -2035,12 +2035,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_T]==false)
       {
@@ -2050,12 +2050,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_S]==false))
       {
@@ -2065,12 +2065,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -2080,12 +2080,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_S]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -2095,12 +2095,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -2136,12 +2136,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -2162,12 +2162,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_E]==false)
       {
@@ -2177,12 +2177,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_S]==false)
       {
@@ -2192,12 +2192,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_B]==false)
       {
@@ -2207,12 +2207,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_S]==false))
       {
@@ -2222,12 +2222,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_E]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -2237,12 +2237,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_S]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -2252,12 +2252,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -2293,12 +2293,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -2319,12 +2319,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_W]==false)
       {
@@ -2334,12 +2334,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_N]==false)
       {
@@ -2349,12 +2349,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_T]==false)
       {
@@ -2364,12 +2364,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_N]==false))
       {
@@ -2379,12 +2379,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -2394,12 +2394,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_N]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -2409,12 +2409,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -2450,12 +2450,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -2476,12 +2476,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_W]==false)
       {
@@ -2491,12 +2491,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_N]==false)
       {
@@ -2506,12 +2506,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_B]==false)
       {
@@ -2521,12 +2521,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_N]==false))
       {
@@ -2536,12 +2536,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -2551,12 +2551,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_N]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -2566,12 +2566,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -2607,12 +2607,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -2633,12 +2633,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_W]==false)
       {
@@ -2648,12 +2648,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_S]==false)
       {
@@ -2663,12 +2663,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_T]==false)
       {
@@ -2678,12 +2678,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_S]==false))
       {
@@ -2693,12 +2693,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -2708,12 +2708,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_S]==false) && (needInterface[INTERFACE_T]==false))
       {
@@ -2723,12 +2723,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
@@ -2764,12 +2764,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
       //////////////////////////////////////////////////////////////////////////
       posCSWB=vectorPosition(iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine  , LyFine);
-      intCF.ICellCFC[intCF.kCF] = kCoarse[posCSWB];
-      intCF.ICellCFF[intCF.kCF] = kFine[posFSWB];
-      offCF.xOffCF[intCF.kCF]   = xOff;
-      offCF.yOffCF[intCF.kCF]   = yOff;
-      offCF.zOffCF[intCF.kCF]   = zOff;
-      intCF.kCF++;
+      intCF.coarseCellIndices[intCF.numberOfCells] = kCoarse[posCSWB];
+      intCF.fineCellIndices[intCF.numberOfCells] = kFine[posFSWB];
+      offCF.x[intCF.numberOfCells]   = xOff;
+      offCF.y[intCF.numberOfCells]   = yOff;
+      offCF.z[intCF.numberOfCells]   = zOff;
+      intCF.numberOfCells++;
       //////////////////////////////////////////////////////////////////////////
 
 
@@ -2790,12 +2790,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
       posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
       posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-      intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-      intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-      offFC.xOffFC[intFC.kFC]   = xOff;
-      offFC.yOffFC[intFC.kFC]   = yOff;
-      offFC.zOffFC[intFC.kFC]   = zOff;
-      intFC.kFC++;
+      intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+      intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+      offFC.x[intFC.numberOfCells]   = xOff;
+      offFC.y[intFC.numberOfCells]   = yOff;
+      offFC.z[intFC.numberOfCells]   = zOff;
+      intFC.numberOfCells++;
 
       if (needInterface[INTERFACE_W]==false)
       {
@@ -2805,12 +2805,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_S]==false)
       {
@@ -2820,12 +2820,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if (needInterface[INTERFACE_B]==false)
       {
@@ -2835,12 +2835,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_S]==false))
       {
@@ -2850,12 +2850,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_W]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -2865,12 +2865,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
       if ((needInterface[INTERFACE_S]==false) && (needInterface[INTERFACE_B]==false))
       {
@@ -2880,12 +2880,12 @@ void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC,
 
          posC=vectorPosition(   iC, jC, hC, LxCoarse, LyCoarse);
          posFSWB=vectorPosition(iF, jF, hF, LxFine,   LyFine);
-         intFC.ICellFCC[intFC.kFC] = kCoarse[posC];
-         intFC.ICellFCF[intFC.kFC] = kFine[posFSWB];
-         offFC.xOffFC[intFC.kFC]   = xOff;
-         offFC.yOffFC[intFC.kFC]   = yOff;
-         offFC.zOffFC[intFC.kFC]   = zOff;
-         intFC.kFC++;
+         intFC.coarseCellIndices[intFC.numberOfCells] = kCoarse[posC];
+         intFC.fineCellIndices[intFC.numberOfCells] = kFine[posFSWB];
+         offFC.x[intFC.numberOfCells]   = xOff;
+         offFC.y[intFC.numberOfCells]   = yOff;
+         offFC.z[intFC.numberOfCells]   = zOff;
+         intFC.numberOfCells++;
       }
    }
 
diff --git a/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.h b/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.h
index 3be49570b33d99f9517796b33934dee1e2f31221..17e63824f930161656291bf2d7ecc05e23af9161 100644
--- a/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.h
+++ b/src/gpu/VirtualFluids_GPU/FindInterface/FindInterface.h
@@ -5,11 +5,11 @@
 #include "lbm/constants/D3Q27.h"
 
 
-void interpolation(InterpolationCellCF &intCF, InterpolationCellFC &intFC, 
+void interpolation(InterpolationCells &intCF, InterpolationCells &intFC, 
                                unsigned int LxCoarse, unsigned int LyCoarse, unsigned int LzCoarse, 
                                unsigned int LxFine, unsigned int LyFine, unsigned int LzFine, 
                                unsigned int dNx, unsigned int dNy, unsigned int dNz, 
                                unsigned int *kCoarse, unsigned int *kFine, bool* needInterface,
-                               OffsetCF &offCF, OffsetFC &offFC);
+                               InterpolationCellNeighbor &offCF, InterpolationCellNeighbor &offFC);
 
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
index a1797e4358e203f9de017f5cbc3c85f71a4d9641..e9d40ddf71f2e72d68f01fe333df16cf1c7b49d9 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
@@ -1106,116 +1106,131 @@ void CudaMemoryManager::cudaFreeMedianOut(int lev)
 //Interface CF
 void CudaMemoryManager::cudaAllocInterfaceCF(int lev)
 {
+    uint mem_size_kCF = sizeof(uint) * parameter->getParH(lev)->coarseToFine.numberOfCells;
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->intCF.ICellCFC), parameter->getParH(lev)->mem_size_kCF  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->intCF.ICellCFF), parameter->getParH(lev)->mem_size_kCF  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coarseToFine.coarseCellIndices), mem_size_kCF  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coarseToFine.fineCellIndices), mem_size_kCF  ));
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->intCF.ICellCFC), parameter->getParD(lev)->mem_size_kCF  ));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->intCF.ICellCFF), parameter->getParD(lev)->mem_size_kCF  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coarseToFine.coarseCellIndices), mem_size_kCF  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coarseToFine.fineCellIndices), mem_size_kCF  ));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = 2. * (double)parameter->getParH(lev)->mem_size_kCF;
+    double tmp = 2. * (double)mem_size_kCF;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyInterfaceCF(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->intCF.ICellCFC, parameter->getParH(lev)->intCF.ICellCFC, parameter->getParH(lev)->mem_size_kCF, cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->intCF.ICellCFF, parameter->getParH(lev)->intCF.ICellCFF, parameter->getParH(lev)->mem_size_kCF, cudaMemcpyHostToDevice));
+    uint mem_size_kCF = sizeof(uint) * parameter->getParH(lev)->coarseToFine.numberOfCells;
+
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->coarseToFine.coarseCellIndices, parameter->getParH(lev)->coarseToFine.coarseCellIndices, mem_size_kCF, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->coarseToFine.fineCellIndices, parameter->getParH(lev)->coarseToFine.fineCellIndices, mem_size_kCF, cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeInterfaceCF(int lev)
 {
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->intCF.ICellCFC));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->intCF.ICellCFF));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coarseToFine.coarseCellIndices));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coarseToFine.fineCellIndices));
 }
 //Interface FC
 void CudaMemoryManager::cudaAllocInterfaceFC(int lev)
 {
+    uint mem_size_kFC = sizeof(uint) * parameter->getParH(lev)->fineToCoarse.numberOfCells;
+
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->intFC.ICellFCF), parameter->getParH(lev)->mem_size_kFC  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->intFC.ICellFCC), parameter->getParH(lev)->mem_size_kFC  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->fineToCoarse.fineCellIndices), mem_size_kFC  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->fineToCoarse.coarseCellIndices), mem_size_kFC  ));
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->intFC.ICellFCF), parameter->getParD(lev)->mem_size_kFC  ));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->intFC.ICellFCC), parameter->getParD(lev)->mem_size_kFC  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->fineToCoarse.fineCellIndices), mem_size_kFC  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->fineToCoarse.coarseCellIndices), mem_size_kFC  ));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = 2. * (double)parameter->getParH(lev)->mem_size_kFC;
+    double tmp = 2. * (double)mem_size_kFC;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyInterfaceFC(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->intFC.ICellFCF, parameter->getParH(lev)->intFC.ICellFCF, parameter->getParH(lev)->mem_size_kFC, cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->intFC.ICellFCC, parameter->getParH(lev)->intFC.ICellFCC, parameter->getParH(lev)->mem_size_kFC, cudaMemcpyHostToDevice));
+    uint mem_size_kFC = sizeof(uint) * parameter->getParH(lev)->fineToCoarse.numberOfCells;
+
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->fineToCoarse.fineCellIndices, parameter->getParH(lev)->fineToCoarse.fineCellIndices, mem_size_kFC, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->fineToCoarse.coarseCellIndices, parameter->getParH(lev)->fineToCoarse.coarseCellIndices, mem_size_kFC, cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaCheckInterfaceFCBulk(int lev)
 {
     // only use for testing!
-    size_t memsize = sizeof(uint) * parameter->getParH(lev)->intFCBulk.kFC;
-    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->intFCBulk.ICellFCC, parameter->getParH(lev)->intFCBulk.ICellFCC, memsize, cudaMemcpyDeviceToDevice));
-    for (uint i = 0; i < parameter->getParH(lev)->intFCBulk.kFC; i++)
-        printf("%d %d\n", i, parameter->getParH(lev)->intFCBulk.ICellFCC[i]);
+    size_t memsize = sizeof(uint) * parameter->getParH(lev)->fineToCoarseBulk.numberOfCells;
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->fineToCoarseBulk.coarseCellIndices, parameter->getParH(lev)->fineToCoarseBulk.coarseCellIndices, memsize, cudaMemcpyDeviceToDevice));
+    for (uint i = 0; i < parameter->getParH(lev)->fineToCoarseBulk.numberOfCells; i++)
+        printf("%d %d\n", i, parameter->getParH(lev)->fineToCoarseBulk.coarseCellIndices[i]);
 }
 void CudaMemoryManager::cudaFreeInterfaceFC(int lev)
 {
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->intFC.ICellFCF));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->intFC.ICellFCC));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->fineToCoarse.fineCellIndices));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->fineToCoarse.coarseCellIndices));
 }
 //Interface Offset CF
 void CudaMemoryManager::cudaAllocInterfaceOffCF(int lev)
 {
+    uint mem_size_kCF_off = sizeof(real) * parameter->getParH(lev)->coarseToFine.numberOfCells;
+
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->offCF.xOffCF),   parameter->getParH(lev)->mem_size_kCF_off  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->offCF.yOffCF),   parameter->getParH(lev)->mem_size_kCF_off  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->offCF.zOffCF),   parameter->getParH(lev)->mem_size_kCF_off  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborCoarseToFine.x), mem_size_kCF_off  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborCoarseToFine.y), mem_size_kCF_off  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborCoarseToFine.z), mem_size_kCF_off  ));
     getLastCudaError("Allocate host memory");
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->offCF.xOffCF),   parameter->getParD(lev)->mem_size_kCF_off  ));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->offCF.yOffCF),   parameter->getParD(lev)->mem_size_kCF_off  ));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->offCF.zOffCF),   parameter->getParD(lev)->mem_size_kCF_off  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborCoarseToFine.x), mem_size_kCF_off  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborCoarseToFine.y), mem_size_kCF_off  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborCoarseToFine.z), mem_size_kCF_off  ));
     getLastCudaError("Allocate device memory");
     //////////////////////////////////////////////////////////////////////////
-    double tmp = 3. * (double)parameter->getParH(lev)->mem_size_kCF_off;
+    double tmp = 3. * (double)mem_size_kCF_off;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyInterfaceOffCF(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->offCF.xOffCF,   parameter->getParH(lev)->offCF.xOffCF,   parameter->getParH(lev)->mem_size_kCF_off, cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->offCF.yOffCF,   parameter->getParH(lev)->offCF.yOffCF,   parameter->getParH(lev)->mem_size_kCF_off, cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->offCF.zOffCF,   parameter->getParH(lev)->offCF.zOffCF,   parameter->getParH(lev)->mem_size_kCF_off, cudaMemcpyHostToDevice));
+    uint mem_size_kCF_off = sizeof(real) * parameter->getParH(lev)->coarseToFine.numberOfCells;
+
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->neighborCoarseToFine.x, parameter->getParH(lev)->neighborCoarseToFine.x, mem_size_kCF_off, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->neighborCoarseToFine.y, parameter->getParH(lev)->neighborCoarseToFine.y, mem_size_kCF_off, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->neighborCoarseToFine.z, parameter->getParH(lev)->neighborCoarseToFine.z, mem_size_kCF_off, cudaMemcpyHostToDevice));
     getLastCudaError("Copy host memory to device");
 }
 void CudaMemoryManager::cudaFreeInterfaceOffCF(int lev)
 {
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->offCF.xOffCF));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->offCF.yOffCF));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->offCF.zOffCF));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborCoarseToFine.x));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborCoarseToFine.y));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborCoarseToFine.z));
 }
 //Interface Offset FC
 void CudaMemoryManager::cudaAllocInterfaceOffFC(int lev)
 {
+    uint mem_size_kFC_off = sizeof(real) * parameter->getParH(lev)->fineToCoarse.numberOfCells;
+
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->offFC.xOffFC),   parameter->getParH(lev)->mem_size_kFC_off  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->offFC.yOffFC),   parameter->getParH(lev)->mem_size_kFC_off  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->offFC.zOffFC),   parameter->getParH(lev)->mem_size_kFC_off  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborFineToCoarse.x), mem_size_kFC_off  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborFineToCoarse.y), mem_size_kFC_off  ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborFineToCoarse.z), mem_size_kFC_off  ));
     getLastCudaError("Allocate host memory");
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->offFC.xOffFC),   parameter->getParD(lev)->mem_size_kFC_off  ));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->offFC.yOffFC),   parameter->getParD(lev)->mem_size_kFC_off  ));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->offFC.zOffFC),   parameter->getParD(lev)->mem_size_kFC_off  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborFineToCoarse.x), mem_size_kFC_off  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborFineToCoarse.y), mem_size_kFC_off  ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborFineToCoarse.z), mem_size_kFC_off  ));
     getLastCudaError("Allocate device memory");
     //////////////////////////////////////////////////////////////////////////
-    double tmp = 3. * (double)parameter->getParH(lev)->mem_size_kFC_off;
+    double tmp = 3. * (double)mem_size_kFC_off;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyInterfaceOffFC(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->offFC.xOffFC,   parameter->getParH(lev)->offFC.xOffFC,   parameter->getParH(lev)->mem_size_kFC_off, cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->offFC.yOffFC,   parameter->getParH(lev)->offFC.yOffFC,   parameter->getParH(lev)->mem_size_kFC_off, cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->offFC.zOffFC,   parameter->getParH(lev)->offFC.zOffFC,   parameter->getParH(lev)->mem_size_kFC_off, cudaMemcpyHostToDevice));
+    uint mem_size_kFC_off = sizeof(real) * parameter->getParH(lev)->fineToCoarse.numberOfCells;
+
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->neighborFineToCoarse.x, parameter->getParH(lev)->neighborFineToCoarse.x, mem_size_kFC_off, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->neighborFineToCoarse.y, parameter->getParH(lev)->neighborFineToCoarse.y, mem_size_kFC_off, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->neighborFineToCoarse.z, parameter->getParH(lev)->neighborFineToCoarse.z, mem_size_kFC_off, cudaMemcpyHostToDevice));
     getLastCudaError("Copy host memory to device");
 }
 void CudaMemoryManager::cudaFreeInterfaceOffFC(int lev)
 {
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->offFC.xOffFC));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->offFC.yOffFC));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->offFC.zOffFC));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborFineToCoarse.x));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborFineToCoarse.y));
+    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborFineToCoarse.z));
 }
 
 //Inlet
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
index 4a5b7816c1b6591e4193639bcdf71242e77688c0..47ca867e5340595d41b2a2694c7c7e477f794184 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
@@ -1353,7 +1353,7 @@ void ScaleCFEff27(real* DC,
                              unsigned int nxF, 
                              unsigned int nyF,
                              unsigned int numberOfThreads,
-                             OffCF offCF);
+                             ICellNeigh neighborCoarseToFine);
 
 void ScaleFCEff27(real* DC, 
                              real* DF, 
@@ -1377,7 +1377,7 @@ void ScaleFCEff27(real* DC,
                              unsigned int nxF, 
                              unsigned int nyF,
                              unsigned int numberOfThreads,
-                             OffFC offFC);
+                             ICellNeigh neighborFineToCoarse);
 
 void ScaleCFLast27(real* DC, 
                               real* DF, 
@@ -1401,7 +1401,7 @@ void ScaleCFLast27(real* DC,
                               unsigned int nxF, 
                               unsigned int nyF,
                               unsigned int numberOfThreads,
-                              OffCF offCF);
+                              ICellNeigh neighborCoarseToFine);
 
 void ScaleFCLast27(real* DC, 
                               real* DF, 
@@ -1425,7 +1425,7 @@ void ScaleFCLast27(real* DC,
                               unsigned int nxF, 
                               unsigned int nyF,
                               unsigned int numberOfThreads,
-                              OffFC offFC);
+                              ICellNeigh neighborFineToCoarse);
 
 void ScaleCFpress27(real* DC, 
                               real* DF, 
@@ -1449,7 +1449,7 @@ void ScaleCFpress27(real* DC,
                               unsigned int nxF, 
                               unsigned int nyF,
                               unsigned int numberOfThreads,
-                              OffCF offCF);
+                              ICellNeigh neighborCoarseToFine);
 
 void ScaleFCpress27(  real* DC, 
                                  real* DF, 
@@ -1473,7 +1473,7 @@ void ScaleFCpress27(  real* DC,
                                  unsigned int nxF, 
                                  unsigned int nyF,
                                  unsigned int numberOfThreads,
-                                 OffFC offFC);
+                                 ICellNeigh neighborFineToCoarse);
 
 void ScaleCF_Fix_27(real* DC, 
                               real* DF, 
@@ -1497,7 +1497,7 @@ void ScaleCF_Fix_27(real* DC,
                               unsigned int nxF, 
                               unsigned int nyF,
                               unsigned int numberOfThreads,
-                              OffCF offCF);
+                              ICellNeigh neighborCoarseToFine);
 
 void ScaleCF_Fix_comp_27(   real* DC, 
 									   real* DF, 
@@ -1521,7 +1521,7 @@ void ScaleCF_Fix_comp_27(   real* DC,
 									   unsigned int nxF, 
 									   unsigned int nyF,
 									   unsigned int numberOfThreads,
-									   OffCF offCF);
+									   ICellNeigh neighborCoarseToFine);
 
 void ScaleCF_0817_comp_27(  real* DC, 
 									   real* DF, 
@@ -1545,7 +1545,7 @@ void ScaleCF_0817_comp_27(  real* DC,
 									   unsigned int nxF, 
 									   unsigned int nyF,
 									   unsigned int numberOfThreads,
-									   OffCF offCF,
+									   ICellNeigh neighborCoarseToFine,
 									   CUstream_st* stream);
 
 void ScaleCF_comp_D3Q27F3_2018(	real* DC,
@@ -1571,7 +1571,7 @@ void ScaleCF_comp_D3Q27F3_2018(	real* DC,
 											unsigned int nxF, 
 											unsigned int nyF,
 											unsigned int numberOfThreads,
-											OffCF offCF);
+											ICellNeigh neighborCoarseToFine);
 
 void ScaleCF_comp_D3Q27F3(real* DC,
 									 real* DF,
@@ -1596,7 +1596,7 @@ void ScaleCF_comp_D3Q27F3(real* DC,
 									 unsigned int nxF, 
 									 unsigned int nyF,
 									 unsigned int numberOfThreads,
-									 OffCF offCF,
+									 ICellNeigh neighborCoarseToFine,
 									 CUstream_st *stream);
 
 void ScaleCF_staggered_time_comp_27( real* DC, 
@@ -1621,11 +1621,11 @@ void ScaleCF_staggered_time_comp_27( real* DC,
 												unsigned int nxF, 
 												unsigned int nyF,
 												unsigned int numberOfThreads,
-												OffCF offCF);
+												ICellNeigh neighborCoarseToFine);
 
-void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF &offsetCF, CUstream_st *stream);
+void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * interpolationCellsCoarseToFine, ICellNeigh &neighborCoarseToFine, CUstream_st *stream);
 
-template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF &offsetCF, CUstream_st *stream);
+template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * interpolationCellsCoarseToFine, ICellNeigh &neighborCoarseToFine, CUstream_st *stream);
 
 void ScaleCF_RhoSq_3rdMom_comp_27( real* DC, 
 											  real* DF, 
@@ -1649,7 +1649,7 @@ void ScaleCF_RhoSq_3rdMom_comp_27( real* DC,
 											  unsigned int nxF, 
 											  unsigned int nyF,
 											  unsigned int numberOfThreads,
-											  OffCF offCF,
+											  ICellNeigh neighborCoarseToFine,
 											  CUstream_st *stream);
 
 void ScaleCF_AA2016_comp_27( real* DC, 
@@ -1674,7 +1674,7 @@ void ScaleCF_AA2016_comp_27( real* DC,
 										unsigned int nxF, 
 										unsigned int nyF,
 										unsigned int numberOfThreads,
-										OffCF offCF,
+										ICellNeigh neighborCoarseToFine,
 										CUstream_st *stream);
 
 void ScaleCF_NSPress_27(real* DC, 
@@ -1699,7 +1699,7 @@ void ScaleCF_NSPress_27(real* DC,
 								  unsigned int nxF, 
 								  unsigned int nyF,
 								  unsigned int numberOfThreads,
-								  OffCF offCF);
+								  ICellNeigh neighborCoarseToFine);
 
 void ScaleFC_Fix_27(  real* DC, 
                                  real* DF, 
@@ -1723,7 +1723,7 @@ void ScaleFC_Fix_27(  real* DC,
                                  unsigned int nxF, 
                                  unsigned int nyF,
                                  unsigned int numberOfThreads,
-                                 OffFC offFC);
+                                 ICellNeigh neighborFineToCoarse);
 
 void ScaleFC_Fix_comp_27(   real* DC, 
 									   real* DF, 
@@ -1747,7 +1747,7 @@ void ScaleFC_Fix_comp_27(   real* DC,
 									   unsigned int nxF, 
 									   unsigned int nyF,
 									   unsigned int numberOfThreads,
-									   OffFC offFC);
+									   ICellNeigh neighborFineToCoarse);
 
 void ScaleFC_0817_comp_27(  real* DC, 
 									   real* DF, 
@@ -1771,7 +1771,7 @@ void ScaleFC_0817_comp_27(  real* DC,
 									   unsigned int nxF, 
 									   unsigned int nyF,
 									   unsigned int numberOfThreads,
-									   OffFC offFC,
+									   ICellNeigh neighborFineToCoarse,
 									   CUstream_st *stream);
 
 void ScaleFC_comp_D3Q27F3_2018(real* DC,
@@ -1797,7 +1797,7 @@ void ScaleFC_comp_D3Q27F3_2018(real* DC,
 										  unsigned int nxF, 
 										  unsigned int nyF,
 										  unsigned int numberOfThreads,
-										  OffFC offFC);
+										  ICellNeigh neighborFineToCoarse);
 
 void ScaleFC_comp_D3Q27F3( real* DC,
 									  real* DF,
@@ -1822,7 +1822,7 @@ void ScaleFC_comp_D3Q27F3( real* DC,
 									  unsigned int nxF, 
 									  unsigned int nyF,
 									  unsigned int numberOfThreads,
-									  OffFC offFC,
+									  ICellNeigh neighborFineToCoarse,
 									  CUstream_st *stream);
 
 void ScaleFC_staggered_time_comp_27( real* DC, 
@@ -1847,11 +1847,11 @@ void ScaleFC_staggered_time_comp_27( real* DC,
 												unsigned int nxF, 
 												unsigned int nyF,
 												unsigned int numberOfThreads,
-												OffFC offFC);
+												ICellNeigh neighborFineToCoarse);
 
-void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC& offsetFC, CUstream_st *stream);
+void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * interpolationCellsFineToCoarse, ICellNeigh& neighborFineToCoarse, CUstream_st *stream);
 
-template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC& offsetFC, CUstream_st *stream);
+template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * icellFC, ICellNeigh& neighborFineToCoarse, CUstream_st *stream);
 
 void ScaleFC_RhoSq_3rdMom_comp_27( real* DC, 
 											  real* DF, 
@@ -1875,7 +1875,7 @@ void ScaleFC_RhoSq_3rdMom_comp_27( real* DC,
 											  unsigned int nxF, 
 											  unsigned int nyF,
 											  unsigned int numberOfThreads,
-											  OffFC offFC,
+											  ICellNeigh neighborFineToCoarse,
 											  CUstream_st *stream);
 
 void ScaleFC_AA2016_comp_27( real* DC, 
@@ -1900,7 +1900,7 @@ void ScaleFC_AA2016_comp_27( real* DC,
 										unsigned int nxF, 
 										unsigned int nyF,
 										unsigned int numberOfThreads,
-										OffFC offFC,
+										ICellNeigh neighborFineToCoarse,
 										CUstream_st *stream);
 
 void ScaleFC_NSPress_27(  real* DC, 
@@ -1925,7 +1925,7 @@ void ScaleFC_NSPress_27(  real* DC,
 									 unsigned int nxF, 
 									 unsigned int nyF,
 									 unsigned int numberOfThreads,
-									 OffFC offFC);
+									 ICellNeigh neighborFineToCoarse);
 
 void ScaleCFThS7(  real* DC, 
                               real* DF, 
@@ -1986,7 +1986,7 @@ void ScaleCFThSMG7(   real* DC,
                                  real nu,
                                  real diffusivity_fine,
                                  unsigned int numberOfThreads,
-                                 OffCF offCF);
+                                 ICellNeigh neighborCoarseToFine);
 
 void ScaleFCThSMG7(real* DC, 
                               real* DF,
@@ -2007,7 +2007,7 @@ void ScaleFCThSMG7(real* DC,
                               real nu,
                               real diffusivity_coarse,
                               unsigned int numberOfThreads,
-                              OffFC offFC);
+                              ICellNeigh neighborFineToCoarse);
 
 void ScaleCFThS27( real* DC, 
                               real* DF, 
@@ -2028,7 +2028,7 @@ void ScaleCFThS27( real* DC,
                               real nu,
                               real diffusivity_fine,
 							  unsigned int numberOfThreads,
-							  OffCF offCF);
+							  ICellNeigh neighborCoarseToFine);
 
 void ScaleFCThS27( real* DC, 
                               real* DF,
@@ -2049,7 +2049,7 @@ void ScaleFCThS27( real* DC,
                               real nu,
                               real diffusivity_coarse,
 							  unsigned int numberOfThreads,
-							  OffFC offFC);
+							  ICellNeigh neighborFineToCoarse);
 
 void DragLiftPostD27(real* DD, 
 								int* k_Q, 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
index 0c3c7fcefc2bbb7bc87d7d95863c8c74f14735a3..399bbe35d58d2d3f055325aa8e3ee87bb2bcb63a 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
@@ -1648,7 +1648,7 @@ __global__ void scaleCFEff27(real* DC,
                                                  unsigned int nyC,
                                                  unsigned int nxF,
                                         unsigned int nyF,
-                                        OffCF offCF);
+                                        ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCFLast27( real* DC,
                                           real* DF,
@@ -1671,7 +1671,7 @@ __global__ void scaleCFLast27( real* DC,
                                           unsigned int nyC,
                                           unsigned int nxF,
                                           unsigned int nyF,
-                                          OffCF offCF);
+                                          ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCFpress27(real* DC,
                                           real* DF,
@@ -1694,7 +1694,7 @@ __global__ void scaleCFpress27(real* DC,
                                           unsigned int nyC,
                                           unsigned int nxF,
                                           unsigned int nyF,
-                                          OffCF offCF);
+                                          ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_Fix_27(real* DC,
                                           real* DF,
@@ -1717,7 +1717,7 @@ __global__ void scaleCF_Fix_27(real* DC,
                                           unsigned int nyC,
                                           unsigned int nxF,
                                           unsigned int nyF,
-                                          OffCF offCF);
+                                          ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_Fix_comp_27(   real* DC,
                                                   real* DF,
@@ -1740,7 +1740,7 @@ __global__ void scaleCF_Fix_comp_27(   real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffCF offCF);
+                                                  ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_0817_comp_27(  real* DC,
                                                   real* DF,
@@ -1763,7 +1763,7 @@ __global__ void scaleCF_0817_comp_27(  real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffCF offCF);
+                                                  ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_comp_D3Q27F3_2018( real* DC,
                                                       real* DF,
@@ -1787,7 +1787,7 @@ __global__ void scaleCF_comp_D3Q27F3_2018( real* DC,
                                                       unsigned int nyC,
                                                       unsigned int nxF,
                                                       unsigned int nyF,
-                                                      OffCF offCF);
+                                                      ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_comp_D3Q27F3( real* DC,
                                                  real* DF,
@@ -1811,7 +1811,7 @@ __global__ void scaleCF_comp_D3Q27F3( real* DC,
                                                  unsigned int nyC,
                                                  unsigned int nxF,
                                                  unsigned int nyF,
-                                                 OffCF offCF);
+                                                 ICellNeigh neighborCoarseToFine);
 
 
 __global__ void scaleCF_staggered_time_comp_27(real* DC,
@@ -1835,7 +1835,7 @@ __global__ void scaleCF_staggered_time_comp_27(real* DC,
                                                           unsigned int nyC,
                                                           unsigned int nxF,
                                                           unsigned int nyF,
-                                                          OffCF offCF);
+                                                          ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_RhoSq_comp_27( real* DC,
                                                   real* DF,
@@ -1858,7 +1858,7 @@ __global__ void scaleCF_RhoSq_comp_27( real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffCF offCF);
+                                                  ICellNeigh neighborCoarseToFine);
 
 template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
     real* distributionsCoarse,
@@ -1879,7 +1879,7 @@ template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
     real omegaFine,
     real* turbulentViscosityCoarse,
     real* turbulentViscosityFine,
-    OffCF offsetCF);
+    ICellNeigh offsetCF);
 
 __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
                                                         real* DF,
@@ -1902,7 +1902,7 @@ __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
                                                         unsigned int nyC,
                                                         unsigned int nxF,
                                                         unsigned int nyF,
-                                                        OffCF offCF);
+                                                        ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_AA2016_comp_27(real* DC,
                                                   real* DF,
@@ -1925,7 +1925,7 @@ __global__ void scaleCF_AA2016_comp_27(real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffCF offCF);
+                                                  ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCF_NSPress_27(real* DC,
                                               real* DF,
@@ -1948,7 +1948,7 @@ __global__ void scaleCF_NSPress_27(real* DC,
                                               unsigned int nyC,
                                               unsigned int nxF,
                                               unsigned int nyF,
-                                              OffCF offCF);
+                                              ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCFThSMG7( real* DC,
                                           real* DF,
@@ -1968,7 +1968,7 @@ __global__ void scaleCFThSMG7( real* DC,
                                           unsigned int kCF,
                                           real nu,
                                           real diffusivity_fine,
-                                          OffCF offCF);
+                                          ICellNeigh neighborCoarseToFine);
 
 __global__ void scaleCFThS7(real* DC,
                                        real* DF,
@@ -2007,7 +2007,7 @@ __global__ void scaleCFThS27(real* DC,
                                         unsigned int kCF,
                                         real nu,
                                         real diffusivity_fine,
-                                        OffCF offCF);
+                                        ICellNeigh neighborCoarseToFine);
 
 //fine to coarse
 __global__ void scaleFC27(real* DC,
@@ -2053,7 +2053,7 @@ __global__ void scaleFCEff27(real* DC,
                                         unsigned int nyC,
                                         unsigned int nxF,
                                         unsigned int nyF,
-                                        OffFC offFC);
+                                        ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFCLast27( real* DC,
                                           real* DF,
@@ -2076,7 +2076,7 @@ __global__ void scaleFCLast27( real* DC,
                                           unsigned int nyC,
                                           unsigned int nxF,
                                           unsigned int nyF,
-                                          OffFC offFC);
+                                          ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFCpress27( real* DC,
                                           real* DF,
@@ -2099,7 +2099,7 @@ __global__ void scaleFCpress27( real* DC,
                                           unsigned int nyC,
                                           unsigned int nxF,
                                           unsigned int nyF,
-                                          OffFC offFC);
+                                          ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_Fix_27( real* DC,
                                           real* DF,
@@ -2122,7 +2122,7 @@ __global__ void scaleFC_Fix_27( real* DC,
                                           unsigned int nyC,
                                           unsigned int nxF,
                                           unsigned int nyF,
-                                          OffFC offFC);
+                                          ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_Fix_comp_27(   real* DC,
                                                   real* DF,
@@ -2145,7 +2145,7 @@ __global__ void scaleFC_Fix_comp_27(   real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffFC offFC);
+                                                  ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_0817_comp_27(  real* DC,
                                                   real* DF,
@@ -2168,7 +2168,7 @@ __global__ void scaleFC_0817_comp_27(  real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffFC offFC);
+                                                  ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_comp_D3Q27F3_2018( real* DC,
                                                       real* DF,
@@ -2192,7 +2192,7 @@ __global__ void scaleFC_comp_D3Q27F3_2018( real* DC,
                                                       unsigned int nyC,
                                                       unsigned int nxF,
                                                       unsigned int nyF,
-                                                      OffFC offFC);
+                                                      ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_comp_D3Q27F3( real* DC,
                                                  real* DF,
@@ -2216,7 +2216,7 @@ __global__ void scaleFC_comp_D3Q27F3( real* DC,
                                                  unsigned int nyC,
                                                  unsigned int nxF,
                                                  unsigned int nyF,
-                                                 OffFC offFC);
+                                                 ICellNeigh neighborFineToCoarse);
 
 
 __global__ void scaleFC_staggered_time_comp_27(real* DC,
@@ -2240,7 +2240,7 @@ __global__ void scaleFC_staggered_time_comp_27(real* DC,
                                                           unsigned int nyC,
                                                           unsigned int nxF,
                                                           unsigned int nyF,
-                                                          OffFC offFC);
+                                                          ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_RhoSq_comp_27( real* DC,
                                                   real* DF,
@@ -2263,7 +2263,7 @@ __global__ void scaleFC_RhoSq_comp_27( real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffFC offFC);
+                                                  ICellNeigh neighborFineToCoarse);
 
 template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     real *distributionsCoarse,
@@ -2284,7 +2284,7 @@ template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     real omegaFine,
     real* turbulentViscosityCoarse,
     real* turbulentViscosityFine,
-    OffFC offsetFC);
+    ICellNeigh offsetFC);
 
 __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
                                                         real* DF,
@@ -2307,7 +2307,7 @@ __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
                                                         unsigned int nyC,
                                                         unsigned int nxF,
                                                         unsigned int nyF,
-                                                        OffFC offFC);
+                                                        ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_AA2016_comp_27(real* DC,
                                                   real* DF,
@@ -2330,7 +2330,7 @@ __global__ void scaleFC_AA2016_comp_27(real* DC,
                                                   unsigned int nyC,
                                                   unsigned int nxF,
                                                   unsigned int nyF,
-                                                  OffFC offFC);
+                                                  ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFC_NSPress_27(real* DC,
                                               real* DF,
@@ -2353,7 +2353,7 @@ __global__ void scaleFC_NSPress_27(real* DC,
                                               unsigned int nyC,
                                               unsigned int nxF,
                                               unsigned int nyF,
-                                              OffFC offFC);
+                                              ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFCThSMG7( real* DC,
                                           real* DF,
@@ -2373,7 +2373,7 @@ __global__ void scaleFCThSMG7( real* DC,
                                           unsigned int kFC,
                                           real nu,
                                           real diffusivity_coarse,
-                                          OffFC offFC);
+                                          ICellNeigh neighborFineToCoarse);
 
 __global__ void scaleFCThS7(real* DC,
                                        real* DF,
@@ -2412,7 +2412,7 @@ __global__ void scaleFCThS27(  real* DC,
                                           unsigned int kFC,
                                           real nu,
                                           real diffusivity_coarse,
-                                          OffFC offFC);
+                                          ICellNeigh neighborFineToCoarse);
 
 __global__ void DragLiftPost27(  real* DD,
                                             int* k_Q,
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu
index 641d6519669b1522430fe88990c00d0630d00e9b..d720a87c9b9a123739c60439a2b5ef1490eef6f7 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu
@@ -35,7 +35,7 @@ __global__ void scaleCF_0817_comp_27( real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffCF offCF)
+												 ICellNeigh offCF)
 {
 	real
 		*fP00dest, *fM00dest, *f0P0dest, *f0M0dest, *f00Pdest, *f00Mdest, *fPP0dest, *fMM0dest, *fPM0dest,
@@ -188,9 +188,9 @@ __global__ void scaleCF_0817_comp_27( real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -4104,7 +4104,7 @@ __global__ void scaleCF_AA2016_comp_27(real* DC,
 												  unsigned int nyC, 
 												  unsigned int nxF, 
 												  unsigned int nyF,
-												  OffCF offCF)
+												  ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -4270,9 +4270,9 @@ __global__ void scaleCF_AA2016_comp_27(real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -10987,7 +10987,7 @@ __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
 														unsigned int nyC, 
 														unsigned int nxF, 
 														unsigned int nyF,
-														OffCF offCF)
+														ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -11153,9 +11153,9 @@ __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -17862,7 +17862,7 @@ __global__ void scaleCF_RhoSq_comp_27(real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffCF offCF)
+												 ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -18008,9 +18008,9 @@ __global__ void scaleCF_RhoSq_comp_27(real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -22146,7 +22146,7 @@ __global__ void scaleCF_staggered_time_comp_27(   real* DC,
 															 unsigned int nyC, 
 															 unsigned int nxF, 
 															 unsigned int nyF,
-															 OffCF offCF)
+															 ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -22292,9 +22292,9 @@ __global__ void scaleCF_staggered_time_comp_27(   real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -26382,7 +26382,7 @@ __global__ void scaleCF_Fix_comp_27(  real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffCF offCF)
+												 ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -26531,9 +26531,9 @@ __global__ void scaleCF_Fix_comp_27(  real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -31149,7 +31149,7 @@ __global__ void scaleCF_NSPress_27(   real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffCF offCF)
+												 ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -31294,9 +31294,9 @@ __global__ void scaleCF_NSPress_27(   real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -35093,7 +35093,7 @@ __global__ void scaleCF_Fix_27(   real* DC,
                                              unsigned int nyC, 
                                              unsigned int nxF, 
                                              unsigned int nyF,
-                                             OffCF offCF)
+                                             ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -35239,9 +35239,9 @@ __global__ void scaleCF_Fix_27(   real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -39351,7 +39351,7 @@ __global__ void scaleCFpress27(   real* DC,
                                              unsigned int nyC, 
                                              unsigned int nxF, 
                                              unsigned int nyF,
-                                             OffCF offCF)
+                                             ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -39496,9 +39496,9 @@ __global__ void scaleCFpress27(   real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -41025,7 +41025,7 @@ __global__ void scaleCFLast27( real* DC,
                                           unsigned int nyC, 
                                           unsigned int nxF, 
                                           unsigned int nyF,
-                                          OffCF offCF)
+                                          ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -41170,9 +41170,9 @@ __global__ void scaleCFLast27( real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -43257,7 +43257,7 @@ __global__ void scaleCFThSMG7(    real* DC,
                                              unsigned int kCF, 
                                              real nu,
                                              real diffusivity_fine,
-                                             OffCF offCF)
+                                             ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, /**fzeroF,*/ *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
@@ -43425,9 +43425,9 @@ __global__ void scaleCFThSMG7(    real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      real xoff = offCF.xOffCF[k];
-      real yoff = offCF.yOffCF[k];
-      real zoff = offCF.zOffCF[k];      
+      real xoff = offCF.x[k];
+      real yoff = offCF.y[k];
+      real zoff = offCF.z[k];      
       real xoff_sq = xoff * xoff;
       real yoff_sq = yoff * yoff;
       real zoff_sq = zoff * zoff;
@@ -45607,7 +45607,7 @@ __global__ void scaleCFThS27(     real* DC,
                                              unsigned int kCF, 
                                              real nu,
                                              real diffusivity_fine,
-											 OffCF offCF)
+											 ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, /**fzeroF,*/ *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
@@ -45835,9 +45835,9 @@ __global__ void scaleCFThS27(     real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -47300,7 +47300,7 @@ __global__ void scaleCFEff27(real* DC,
 									             unsigned int nyC, 
 									             unsigned int nxF, 
                                         unsigned int nyF,
-                                        OffCF offCF)
+                                        ICellNeigh offCF)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -47445,9 +47445,9 @@ __global__ void scaleCFEff27(real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu
index 386493280fd71fff93c117483e754a248bb0830d..fba54269c6d8c2bc3092c52833c98c78e87b988b 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu
@@ -36,7 +36,7 @@ __global__ void scaleCF_comp_D3Q27F3_2018(real* DC,
 													 unsigned int nyC, 
 													 unsigned int nxF, 
 													 unsigned int nyF,
-													 OffCF offCF)
+													 ICellNeigh offCF)
 {
 	real
 		*fP00dest, *fM00dest, *f0P0dest, *f0M0dest, *f00Pdest, *f00Mdest, *fPP0dest, *fMM0dest, *fPM0dest,
@@ -198,9 +198,9 @@ __global__ void scaleCF_comp_D3Q27F3_2018(real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -4383,7 +4383,7 @@ __global__ void scaleCF_comp_D3Q27F3( real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffCF offCF)
+												 ICellNeigh offCF)
 {
 	real
 		*fP00dest, *fM00dest, *f0P0dest, *f0M0dest, *f00Pdest, *f00Mdest, *fPP0dest, *fMM0dest, *fPM0dest,
@@ -4545,9 +4545,9 @@ __global__ void scaleCF_comp_D3Q27F3( real* DC,
    if(k<kCF)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offCF.xOffCF[k];
-      yoff    = offCF.yOffCF[k];
-      zoff    = offCF.zOffCF[k];
+      xoff    = offCF.x[k];
+      yoff    = offCF.y[k];
+      zoff    = offCF.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu
index b37ab44d81d15fbbde46c875c860acd7198b8041..48f5041ce12df3e0a219087a2bcda735ea28afd7 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu
@@ -35,7 +35,7 @@ __global__ void scaleFC_0817_comp_27( real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffFC offFC)
+												 ICellNeigh offFC)
 {
    real 
 	   *fP00source, *fM00source, *f0P0source, *f0M0source, *f00Psource, *f00Msource, *fPP0source, *fMM0source, *fPM0source,
@@ -183,9 +183,9 @@ __global__ void scaleFC_0817_comp_27( real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -1231,7 +1231,7 @@ __global__ void scaleFC_AA2016_comp_27(real* DC,
 												  unsigned int nyC, 
 												  unsigned int nxF, 
 												  unsigned int nyF,
-												  OffFC offFC)
+												  ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -1393,9 +1393,9 @@ __global__ void scaleFC_AA2016_comp_27(real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -5420,7 +5420,7 @@ __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
 														unsigned int nyC, 
 														unsigned int nxF, 
 														unsigned int nyF,
-														OffFC offFC)
+														ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -5582,9 +5582,9 @@ __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -9608,7 +9608,7 @@ __device__ void scaleFC_RhoSq_comp_27_Calculation(
     unsigned int nyC,
     unsigned int nxF,
     unsigned int nyF,
-    OffFC offFC,
+    ICellNeigh offFC,
     const unsigned k)
 {
     real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF,
@@ -9741,9 +9741,9 @@ __device__ void scaleFC_RhoSq_comp_27_Calculation(
 
     if (k < kFC) {
         //////////////////////////////////////////////////////////////////////////
-        xoff    = offFC.xOffFC[k];
-        yoff    = offFC.yOffFC[k];
-        zoff    = offFC.zOffFC[k];
+        xoff    = offFC.x[k];
+        yoff    = offFC.y[k];
+        zoff    = offFC.z[k];
         xoff_sq = xoff * xoff;
         yoff_sq = yoff * yoff;
         zoff_sq = zoff * zoff;
@@ -11094,7 +11094,7 @@ __global__ void scaleFC_RhoSq_comp_27(real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffFC offFC)
+												 ICellNeigh offFC)
 {
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -11187,7 +11187,7 @@ __global__ void scaleFC_staggered_time_comp_27(   real* DC,
 															 unsigned int nyC, 
 															 unsigned int nxF, 
 															 unsigned int nyF,
-															 OffFC offFC)
+															 ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -11329,9 +11329,9 @@ __global__ void scaleFC_staggered_time_comp_27(   real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -12487,7 +12487,7 @@ __global__ void scaleFC_Fix_comp_27(  real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffFC offFC)
+												 ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -12631,9 +12631,9 @@ __global__ void scaleFC_Fix_comp_27(  real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -14347,7 +14347,7 @@ __global__ void scaleFC_NSPress_27(   real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffFC offFC)
+												 ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -14488,9 +14488,9 @@ __global__ void scaleFC_NSPress_27(   real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -15553,7 +15553,7 @@ __global__ void scaleFC_Fix_27(   real* DC,
                                              unsigned int nyC, 
                                              unsigned int nxF, 
                                              unsigned int nyF,
-                                             OffFC offFC)
+                                             ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -15695,9 +15695,9 @@ __global__ void scaleFC_Fix_27(   real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -16913,7 +16913,7 @@ __global__ void scaleFCpress27(real* DC,
                                           unsigned int nyC, 
                                           unsigned int nxF, 
                                           unsigned int nyF,
-                                          OffFC offFC)
+                                          ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -17057,9 +17057,9 @@ __global__ void scaleFCpress27(real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -17838,7 +17838,7 @@ __global__ void scaleFCLast27( real* DC,
                                           unsigned int nyC, 
                                           unsigned int nxF, 
                                           unsigned int nyF,
-                                          OffFC offFC)
+                                          ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -17982,9 +17982,9 @@ __global__ void scaleFCLast27( real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -19231,7 +19231,7 @@ __global__ void scaleFCThSMG7(    real* DC,
                                              unsigned int kFC, 
                                              real nu,
                                              real diffusivity_coarse,
-                                             OffFC offFC)
+                                             ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, //*fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -19392,9 +19392,9 @@ __global__ void scaleFCThSMG7(    real* DC,
 
    if(k<kFC){
       //////////////////////////////////////////////////////////////////////////
-      real xoff = offFC.xOffFC[k];
-      real yoff = offFC.yOffFC[k];
-      real zoff = offFC.zOffFC[k];      
+      real xoff = offFC.x[k];
+      real yoff = offFC.y[k];
+      real zoff = offFC.z[k];      
       real xoff_sq = xoff * xoff;
       real yoff_sq = yoff * yoff;
       real zoff_sq = zoff * zoff;
@@ -20889,7 +20889,7 @@ __global__ void scaleFCThS27(     real* DC,
                                              unsigned int kFC, 
                                              real nu,
                                              real diffusivity_coarse,
-											 OffFC offFC)
+											 ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, //*fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -21110,9 +21110,9 @@ __global__ void scaleFCThS27(     real* DC,
 
    if(k<kFC){
       //////////////////////////////////////////////////////////////////////////
-      xoff    = offFC.xOffFC[k];
-      yoff    = offFC.yOffFC[k];
-      zoff    = offFC.zOffFC[k];
+      xoff    = offFC.x[k];
+      yoff    = offFC.y[k];
+      zoff    = offFC.z[k];
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -22012,7 +22012,7 @@ __global__ void scaleFCEff27(real* DC,
                                         unsigned int nyC, 
                                         unsigned int nxF, 
                                         unsigned int nyF,
-                                        OffFC offFC)
+                                        ICellNeigh offFC)
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
@@ -22156,9 +22156,9 @@ __global__ void scaleFCEff27(real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu
index 3b108ad4ae43bd63698f3516a207630214695797..c83da28dfe1781342ea747cfc4b7bc342cbe1dec 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu
@@ -36,7 +36,7 @@ __global__ void scaleFC_comp_D3Q27F3_2018(real* DC,
 													 unsigned int nyC, 
 													 unsigned int nxF, 
 													 unsigned int nyF,
-													 OffFC offFC)
+													 ICellNeigh offFC)
 {
    real 
 	   *fP00source, *fM00source, *f0P0source, *f0M0source, *f00Psource, *f00Msource, *fPP0source, *fMM0source, *fPM0source,
@@ -205,9 +205,9 @@ __global__ void scaleFC_comp_D3Q27F3_2018(real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
@@ -1283,7 +1283,7 @@ __global__ void scaleFC_comp_D3Q27F3( real* DC,
 												 unsigned int nyC, 
 												 unsigned int nxF, 
 												 unsigned int nyF,
-												 OffFC offFC)
+												 ICellNeigh offFC)
 {
    real 
 	   *fP00source, *fM00source, *f0P0source, *f0M0source, *f00Psource, *f00Msource, *fPP0source, *fMM0source, *fPM0source,
@@ -1452,9 +1452,9 @@ __global__ void scaleFC_comp_D3Q27F3( real* DC,
    if(k<kFC)
    {
       //////////////////////////////////////////////////////////////////////////
-      xoff = offFC.xOffFC[k];
-      yoff = offFC.yOffFC[k];
-      zoff = offFC.zOffFC[k];      
+      xoff = offFC.x[k];
+      yoff = offFC.y[k];
+      zoff = offFC.z[k];      
       xoff_sq = xoff * xoff;
       yoff_sq = yoff * yoff;
       zoff_sq = zoff * zoff;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu
index 84529ef2694b57448291957f7792360088bd954f..726e31888658d78562913cd2b386481cd69abbc6 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu
@@ -237,7 +237,7 @@ template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
     real omegaFine, 
     real* turbulentViscosityCoarse,
     real* turbulentViscosityFine,
-    OffCF offsetCF)
+    ICellNeigh neighborCoarseToFine)
 {
     ////////////////////////////////////////////////////////////////////////////////
     //! - Get the node index coordinates from threadId_100, blockId_100, blockDim and gridDim.
@@ -758,9 +758,9 @@ template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
     ////////////////////////////////////////////////////////////////////////////////
     //! - Set the relative position of the offset cell {-1, 0, 1}
     //!
-    real xoff    = offsetCF.xOffCF[nodeIndex];
-    real yoff    = offsetCF.yOffCF[nodeIndex];
-    real zoff    = offsetCF.zOffCF[nodeIndex];
+    real xoff    = neighborCoarseToFine.x[nodeIndex];
+    real yoff    = neighborCoarseToFine.y[nodeIndex];
+    real zoff    = neighborCoarseToFine.z[nodeIndex];
 
     real xoff_sq = xoff * xoff;
     real yoff_sq = yoff * yoff;
@@ -1487,6 +1487,6 @@ template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
     (distFine.f[DIR_MMM])[k_MMM] = f_MMM;
 }
 
-template __global__ void scaleCF_compressible<true>( real* distributionsCoarse, real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int* indicesCoarseMMM, unsigned int* indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffCF offsetCF);
+template __global__ void scaleCF_compressible<true>( real* distributionsCoarse, real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int* indicesCoarseMMM, unsigned int* indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, ICellNeigh offsetCF);
 
-template __global__ void scaleCF_compressible<false>( real* distributionsCoarse, real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int* indicesCoarseMMM, unsigned int* indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffCF offsetCF);
\ No newline at end of file
+template __global__ void scaleCF_compressible<false>( real* distributionsCoarse, real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int* indicesCoarseMMM, unsigned int* indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, ICellNeigh offsetCF);
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu
index c89a524c1dd63f426254c395d1e4881a7e96ce7a..4ed8273589001b9d4c87e4774310424274631e2d 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu
@@ -65,7 +65,7 @@ template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     real omegaFine,
     real* turbulentViscosityCoarse,
     real* turbulentViscosityFine,
-    OffFC offsetFC)
+    ICellNeigh neighborFineToCoarse)
 {
     ////////////////////////////////////////////////////////////////////////////////
     //! - Get the node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
@@ -424,9 +424,9 @@ template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     ////////////////////////////////////////////////////////////////////////////////
     //! - Set the relative position of the offset cell {-1, 0, 1}
     //!
-    real xoff    = offsetFC.xOffFC[nodeIndex];
-    real yoff    = offsetFC.yOffFC[nodeIndex];
-    real zoff    = offsetFC.zOffFC[nodeIndex];
+    real xoff    = neighborFineToCoarse.x[nodeIndex];
+    real yoff    = neighborFineToCoarse.y[nodeIndex];
+    real zoff    = neighborFineToCoarse.z[nodeIndex];
      
     real xoff_sq = xoff * xoff;
     real yoff_sq = yoff * yoff;
@@ -708,6 +708,6 @@ template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     ////////////////////////////////////////////////////////////////////////////////////
 }
 
-template __global__ void scaleFC_compressible<true>( real *distributionsCoarse, real *distributionsFine, unsigned int *neighborXcoarse, unsigned int *neighborYcoarse, unsigned int *neighborZcoarse, unsigned int *neighborXfine, unsigned int *neighborYfine, unsigned int *neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int *indicesCoarse000, unsigned int *indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffFC offsetFC);
+template __global__ void scaleFC_compressible<true>( real *distributionsCoarse, real *distributionsFine, unsigned int *neighborXcoarse, unsigned int *neighborYcoarse, unsigned int *neighborZcoarse, unsigned int *neighborXfine, unsigned int *neighborYfine, unsigned int *neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int *indicesCoarse000, unsigned int *indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, ICellNeigh neighborFineToCoarse);
 
-template __global__ void scaleFC_compressible<false>( real *distributionsCoarse, real *distributionsFine, unsigned int *neighborXcoarse, unsigned int *neighborYcoarse, unsigned int *neighborZcoarse, unsigned int *neighborXfine, unsigned int *neighborYfine, unsigned int *neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int *indicesCoarse000, unsigned int *indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffFC offsetFC);
\ No newline at end of file
+template __global__ void scaleFC_compressible<false>( real *distributionsCoarse, real *distributionsFine, unsigned int *neighborXcoarse, unsigned int *neighborYcoarse, unsigned int *neighborZcoarse, unsigned int *neighborXfine, unsigned int *neighborYfine, unsigned int *neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int *indicesCoarse000, unsigned int *indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, ICellNeigh neighborFineToCoarse);
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
index 9abac27969e74dc90ecdcc707f4fcb2234010d07..c0372741061735b58579a85fbeff7351d1408b07 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
@@ -3563,7 +3563,7 @@ void ScaleCFEff27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -3589,7 +3589,7 @@ void ScaleCFEff27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCFEff27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3616,7 +3616,7 @@ void ScaleCFLast27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -3642,7 +3642,7 @@ void ScaleCFLast27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCFLast27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3669,7 +3669,7 @@ void ScaleCFpress27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -3695,7 +3695,7 @@ void ScaleCFpress27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCFpress27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3722,7 +3722,7 @@ void ScaleCF_Fix_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -3748,7 +3748,7 @@ void ScaleCF_Fix_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_Fix_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3775,7 +3775,7 @@ void ScaleCF_Fix_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -3801,7 +3801,7 @@ void ScaleCF_Fix_comp_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_Fix_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3828,7 +3828,7 @@ void ScaleCF_0817_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF,
+    ICellNeigh neighborCoarseToFine,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
@@ -3855,7 +3855,7 @@ void ScaleCF_0817_comp_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_0817_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3883,7 +3883,7 @@ void ScaleCF_comp_D3Q27F3_2018(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -3910,7 +3910,7 @@ void ScaleCF_comp_D3Q27F3_2018(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_comp_D3Q27F3_2018 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3938,7 +3938,7 @@ void ScaleCF_comp_D3Q27F3(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF,
+    ICellNeigh neighborCoarseToFine,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
@@ -3966,7 +3966,7 @@ void ScaleCF_comp_D3Q27F3(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_comp_D3Q27F3 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3993,7 +3993,7 @@ void ScaleCF_staggered_time_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -4019,13 +4019,13 @@ void ScaleCF_staggered_time_comp_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_staggered_time_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream)
+void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * coarseToFine, ICellNeigh& neighborCoarseToFine, CUstream_st *stream)
 {
-    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellCF->kCF);
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  coarseToFine->numberOfCells);
     dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
 
     scaleCF_RhoSq_comp_27<<<grid, threads, 0, stream>>>(
@@ -4040,23 +4040,23 @@ void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulat
         parameterDeviceC->numberOfNodes,
         parameterDeviceF->numberOfNodes,
         parameterDeviceC->isEvenTimestep,
-        icellCF->ICellCFC,
-        icellCF->ICellCFF,
-        icellCF->kCF,
+        coarseToFine->coarseCellIndices,
+        coarseToFine->fineCellIndices,
+        coarseToFine->numberOfCells,
         parameterDeviceC->omega,
         parameterDeviceF->omega,
-        parameterDeviceC->vis,
+        parameterDeviceC->viscosity,
         parameterDeviceC->nx,
         parameterDeviceC->ny,
         parameterDeviceF->nx,
         parameterDeviceF->ny,
-        offsetCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_RhoSq_27 execution failed");
 }
 
-template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream)
+template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * coarseToFine, ICellNeigh& neighborCoarseToFine, CUstream_st *stream)
 {
-    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellCF->kCF);
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  coarseToFine->numberOfCells);
     dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
 
     scaleCF_compressible<hasTurbulentViscosity><<<grid, threads, 0, stream>>>(
@@ -4071,19 +4071,19 @@ template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationPara
         parameterDeviceC->numberOfNodes,
         parameterDeviceF->numberOfNodes,
         parameterDeviceC->isEvenTimestep,
-        icellCF->ICellCFC,
-        icellCF->ICellCFF,
-        icellCF->kCF,
+        coarseToFine->coarseCellIndices,
+        coarseToFine->fineCellIndices,
+        coarseToFine->numberOfCells,
         parameterDeviceC->omega,
         parameterDeviceF->omega,
         parameterDeviceC->turbViscosity,
         parameterDeviceF->turbViscosity,
-        offsetCF);
+        neighborCoarseToFine);
 
     getLastCudaError("scaleCF_compressible execution failed");
 }
-template void ScaleCF_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream);
-template void ScaleCF_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream);
+template void ScaleCF_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * coarseToFine, ICellNeigh& neighborCoarseToFine, CUstream_st *stream);
+template void ScaleCF_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * coarseToFine, ICellNeigh& neighborCoarseToFine, CUstream_st *stream);
 
 //////////////////////////////////////////////////////////////////////////
 void ScaleCF_RhoSq_3rdMom_comp_27(
@@ -4109,7 +4109,7 @@ void ScaleCF_RhoSq_3rdMom_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF,
+    ICellNeigh neighborCoarseToFine,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
@@ -4136,7 +4136,7 @@ void ScaleCF_RhoSq_3rdMom_comp_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_RhoSq_3rdMom_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4163,7 +4163,7 @@ void ScaleCF_AA2016_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF,
+    ICellNeigh neighborCoarseToFine,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
@@ -4190,7 +4190,7 @@ void ScaleCF_AA2016_comp_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_AA2016_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4217,7 +4217,7 @@ void ScaleCF_NSPress_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -4243,7 +4243,7 @@ void ScaleCF_NSPress_27(
         nyC,
         nxF,
         nyF,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCF_NSPress_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4267,7 +4267,7 @@ void ScaleCFThSMG7(
     real nu,
     real diffusivity_fine,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -4290,7 +4290,7 @@ void ScaleCFThSMG7(
         kCF,
         nu,
         diffusivity_fine,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCFThSMG7 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4359,7 +4359,7 @@ void ScaleCFThS27(
     real nu,
     real diffusivity_fine,
     unsigned int numberOfThreads,
-    OffCF offCF)
+    ICellNeigh neighborCoarseToFine)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
 
@@ -4382,7 +4382,7 @@ void ScaleCFThS27(
         kCF,
         nu,
         diffusivity_fine,
-        offCF);
+        neighborCoarseToFine);
     getLastCudaError("scaleCFThS27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4460,7 +4460,7 @@ void ScaleFCEff27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4486,7 +4486,7 @@ void ScaleFCEff27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFCEff27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4513,7 +4513,7 @@ void ScaleFCLast27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4539,7 +4539,7 @@ void ScaleFCLast27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("Kernel execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4566,7 +4566,7 @@ void ScaleFCpress27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4592,7 +4592,7 @@ void ScaleFCpress27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFCpress27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4619,7 +4619,7 @@ void ScaleFC_Fix_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4645,7 +4645,7 @@ void ScaleFC_Fix_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_Fix_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4672,7 +4672,7 @@ void ScaleFC_Fix_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4698,7 +4698,7 @@ void ScaleFC_Fix_comp_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_Fix_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4725,7 +4725,7 @@ void ScaleFC_0817_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC,
+    ICellNeigh neighborFineToCoarse,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
@@ -4752,7 +4752,7 @@ void ScaleFC_0817_comp_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_0817_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4780,7 +4780,7 @@ void ScaleFC_comp_D3Q27F3_2018(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4807,7 +4807,7 @@ void ScaleFC_comp_D3Q27F3_2018(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_comp_D3Q27F3_2018 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4835,7 +4835,7 @@ void ScaleFC_comp_D3Q27F3(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC,
+    ICellNeigh neighborFineToCoarse,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
@@ -4863,7 +4863,7 @@ void ScaleFC_comp_D3Q27F3(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_comp_D3Q27F3 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4890,7 +4890,7 @@ void ScaleFC_staggered_time_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -4916,13 +4916,13 @@ void ScaleFC_staggered_time_comp_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_staggered_time_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream)
+void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * fineToCoarse, ICellNeigh &neighborFineToCoarse, CUstream_st *stream)
 {
-    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellFC->kFC);
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  fineToCoarse->numberOfCells);
     dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
 
     scaleFC_RhoSq_comp_27<<<grid, threads, 0, stream>>>(
@@ -4937,23 +4937,23 @@ void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulat
         parameterDeviceC->numberOfNodes,
         parameterDeviceF->numberOfNodes,
         parameterDeviceC->isEvenTimestep,
-        icellFC->ICellFCC,
-        icellFC->ICellFCF,
-        icellFC->kFC,
+        fineToCoarse->coarseCellIndices,
+        fineToCoarse->fineCellIndices,
+        fineToCoarse->numberOfCells,
         parameterDeviceC->omega,
         parameterDeviceF->omega,
-        parameterDeviceC->vis,
+        parameterDeviceC->viscosity,
         parameterDeviceC->nx,
         parameterDeviceC->ny,
         parameterDeviceF->nx,
         parameterDeviceF->ny,
-        offsetFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_RhoSq_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream)
+template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * fineToCoarse, ICellNeigh &neighborFineToCoarse, CUstream_st *stream)
 {
-    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellFC->kFC);
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  fineToCoarse->numberOfCells);
     dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
 
     scaleFC_compressible<hasTurbulentViscosity><<<grid, threads, 0, stream>>>(
@@ -4968,19 +4968,19 @@ template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationPara
         parameterDeviceC->numberOfNodes,
         parameterDeviceF->numberOfNodes,
         parameterDeviceC->isEvenTimestep,
-        icellFC->ICellFCC,
-        icellFC->ICellFCF,
-        icellFC->kFC,
+        fineToCoarse->coarseCellIndices,
+        fineToCoarse->fineCellIndices,
+        fineToCoarse->numberOfCells,
         parameterDeviceC->omega,
         parameterDeviceF->omega,
         parameterDeviceC->turbViscosity,
         parameterDeviceF->turbViscosity,
-        offsetFC);
+        neighborFineToCoarse);
 
     getLastCudaError("scaleFC_compressible execution failed");
 }
-template void ScaleFC_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream);
-template void ScaleFC_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream);
+template void ScaleFC_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * fineToCoarse, ICellNeigh &neighborFineToCoarse, CUstream_st *stream);
+template void ScaleFC_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * fineToCoarse, ICellNeigh &neighborFineToCoarse, CUstream_st *stream);
 
 //////////////////////////////////////////////////////////////////////////
 void ScaleFC_RhoSq_3rdMom_comp_27(
@@ -5006,7 +5006,7 @@ void ScaleFC_RhoSq_3rdMom_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC,
+    ICellNeigh neighborFineToCoarse,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
@@ -5033,7 +5033,7 @@ void ScaleFC_RhoSq_3rdMom_comp_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_RhoSq_3rdMom_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -5060,7 +5060,7 @@ void ScaleFC_AA2016_comp_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC,
+    ICellNeigh neighborFineToCoarse,
     CUstream_st *stream)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
@@ -5087,7 +5087,7 @@ void ScaleFC_AA2016_comp_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_AA2016_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -5114,7 +5114,7 @@ void ScaleFC_NSPress_27(
     unsigned int nxF,
     unsigned int nyF,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -5140,7 +5140,7 @@ void ScaleFC_NSPress_27(
         nyC,
         nxF,
         nyF,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFC_NSPress_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -5164,7 +5164,7 @@ void ScaleFCThSMG7(
     real nu,
     real diffusivity_coarse,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -5187,7 +5187,7 @@ void ScaleFCThSMG7(
         kFC,
         nu,
         diffusivity_coarse,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFCThSMG7 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -5256,7 +5256,7 @@ void ScaleFCThS27(
     real nu,
     real diffusivity_coarse,
     unsigned int numberOfThreads,
-    OffFC offFC)
+    ICellNeigh neighborFineToCoarse)
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
 
@@ -5279,7 +5279,7 @@ void ScaleFCThS27(
         kFC,
         nu,
         diffusivity_coarse,
-        offFC);
+        neighborFineToCoarse);
     getLastCudaError("scaleFCThS27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp
index 8a42c5201cd32a6ce51c09e06ccaf9bbb65eda1c..229922b1ec1654e7ca664f9d19a7b7c6e264fd83 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp
@@ -47,8 +47,8 @@ GridScalingKernelManager::GridScalingKernelManager(SPtr<Parameter> parameter, Gr
         if(!gridScalingFactory){
             throw std::runtime_error("There is more than one level, but no scalingFactory was provided.");
         }
-        checkScalingFunction(gridScalingFactory->getGridScalingFC(parameter->getUseTurbulentViscosity()), this->para->getParD(0)->intFC, "scalingFineToCoarse");
-        checkScalingFunction(gridScalingFactory->getGridScalingCF(parameter->getUseTurbulentViscosity()), this->para->getParD(0)->intCF, "scalingCoarseToFine");
+        checkScalingFunction(gridScalingFactory->getGridScalingFC(parameter->getUseTurbulentViscosity()), this->para->getParD(0)->fineToCoarse, "scalingFineToCoarse");
+        checkScalingFunction(gridScalingFactory->getGridScalingCF(parameter->getUseTurbulentViscosity()), this->para->getParD(0)->coarseToFine, "scalingCoarseToFine");
         this->scalingFineToCoarse = gridScalingFactory->getGridScalingFC(parameter->getUseTurbulentViscosity());
         this->scalingCoarseToFine = gridScalingFactory->getGridScalingCF(parameter->getUseTurbulentViscosity());
     }
@@ -59,11 +59,11 @@ GridScalingKernelManager::GridScalingKernelManager(SPtr<Parameter> parameter, Gr
         VF_LOG_TRACE("Function for scalingCoarseToFine is nullptr");
 }
 
-void GridScalingKernelManager::runFineToCoarseKernelLB(const int level, InterpolationCellFC *icellFC, OffFC &offFC, CudaStreamIndex streamIndex) const
+void GridScalingKernelManager::runFineToCoarseKernelLB(const int level, InterpolationCells *fineToCoarse, ICellNeigh &neighborFineToCoarse, CudaStreamIndex streamIndex) const
 {
     cudaStream_t stream = para->getStreamManager()->getStream(streamIndex);
 
-    this->scalingFineToCoarse(para->getParD(level).get(), para->getParD(level+1).get(), icellFC, offFC, stream);
+    this->scalingFineToCoarse(para->getParD(level).get(), para->getParD(level+1).get(), fineToCoarse, neighborFineToCoarse, stream);
 
     // ScaleFC_comp_D3Q27F3(
     //     para->getParD(level)->distributions.f[0],
@@ -294,13 +294,13 @@ void GridScalingKernelManager::runFineToCoarseKernelAD(const int level) const
             para->getParD(level)->numberOfNodes,
             para->getParD(level+1)->numberOfNodes,
             para->getParD(level)->isEvenTimestep,
-            para->getParD(level)->intFC.ICellFCC,
-            para->getParD(level)->intFC.ICellFCF,
-            para->getParD(level)->K_FC,
-            para->getParD(level)->vis,
+            para->getParD(level)->fineToCoarse.coarseCellIndices,
+            para->getParD(level)->fineToCoarse.fineCellIndices,
+            para->getParD(level)->fineToCoarse.numberOfCells,
+            para->getParD(level)->viscosity,
             para->getParD(level)->diffusivity,
             para->getParD(level)->numberofthreads,
-            para->getParD(level)->offFC);
+            para->getParD(level)->neighborFineToCoarse);
     }
     else if (para->getDiffMod() == 27)
     {
@@ -318,20 +318,20 @@ void GridScalingKernelManager::runFineToCoarseKernelAD(const int level) const
             para->getParD(level)->numberOfNodes,
             para->getParD(level+1)->numberOfNodes,
             para->getParD(level)->isEvenTimestep,
-            para->getParD(level)->intFC.ICellFCC,
-            para->getParD(level)->intFC.ICellFCF,
-            para->getParD(level)->K_FC,
-            para->getParD(level)->vis,
+            para->getParD(level)->fineToCoarse.coarseCellIndices,
+            para->getParD(level)->fineToCoarse.fineCellIndices,
+            para->getParD(level)->fineToCoarse.numberOfCells,
+            para->getParD(level)->viscosity,
             para->getParD(level)->diffusivity,
             para->getParD(level)->numberofthreads,
-            para->getParD(level)->offFC);
+            para->getParD(level)->neighborFineToCoarse);
     }
 }
 
-void GridScalingKernelManager::runCoarseToFineKernelLB(const int level, InterpolationCellCF* icellCF, OffCF &offCF, CudaStreamIndex streamIndex) const
+void GridScalingKernelManager::runCoarseToFineKernelLB(const int level, InterpolationCells* coarseToFine, ICellNeigh &neighborFineToCoarse, CudaStreamIndex streamIndex) const
 {
     cudaStream_t stream = para->getStreamManager()->getStream(streamIndex);
-    this->scalingCoarseToFine(para->getParD(level).get(), para->getParD(level+1).get(), icellCF, offCF, stream);
+    this->scalingCoarseToFine(para->getParD(level).get(), para->getParD(level+1).get(), coarseToFine, neighborFineToCoarse, stream);
 
     // ScaleCF_comp_D3Q27F3(
     //     para->getParD(level)->distributions.f[0],
@@ -563,13 +563,13 @@ void GridScalingKernelManager::runCoarseToFineKernelAD(const int level) const
             para->getParD(level)->numberOfNodes,
             para->getParD(level+1)->numberOfNodes,
             para->getParD(level)->isEvenTimestep,
-            para->getParD(level)->intCF.ICellCFC,
-            para->getParD(level)->intCF.ICellCFF,
-            para->getParD(level)->K_CF,
-            para->getParD(level)->vis,
+            para->getParD(level)->coarseToFine.coarseCellIndices,
+            para->getParD(level)->coarseToFine.fineCellIndices,
+            para->getParD(level)->coarseToFine.numberOfCells,
+            para->getParD(level)->viscosity,
             para->getParD(level+1)->diffusivity,
             para->getParD(level)->numberofthreads,
-            para->getParD(level)->offCF);
+            para->getParD(level)->neighborCoarseToFine);
     }
     else if (para->getDiffMod() == 27)
     {
@@ -587,12 +587,12 @@ void GridScalingKernelManager::runCoarseToFineKernelAD(const int level) const
             para->getParD(level)->numberOfNodes,
             para->getParD(level+1)->numberOfNodes,
             para->getParD(level)->isEvenTimestep,
-            para->getParD(level)->intCF.ICellCFC,
-            para->getParD(level)->intCF.ICellCFF,
-            para->getParD(level)->K_CF,
-            para->getParD(level)->vis,
+            para->getParD(level)->coarseToFine.coarseCellIndices,
+            para->getParD(level)->coarseToFine.fineCellIndices,
+            para->getParD(level)->coarseToFine.numberOfCells,
+            para->getParD(level)->viscosity,
             para->getParD(level+1)->diffusivity,
             para->getParD(level)->numberofthreads,
-            para->getParD(level)->offCF);
+            para->getParD(level)->neighborCoarseToFine);
     }
 }
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.h b/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.h
index 3c78ee7f9db254556e8ec6dbbafaf51cd995f10b..ef1e175ed149e6a89016c76249ce31aa1f1828f9 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.h
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.h
@@ -48,10 +48,8 @@ enum class CudaStreamIndex;
 struct LBMSimulationParameter;
 struct CUstream_st;
 
-using gridScalingFC =
-    std::function<void(LBMSimulationParameter *, LBMSimulationParameter *, ICellFC *, OffFC &, CUstream_st *stream)>;
-using gridScalingCF =
-    std::function<void(LBMSimulationParameter *, LBMSimulationParameter *, ICellCF *, OffCF &, CUstream_st *stream)>;
+using gridScaling =
+    std::function<void(LBMSimulationParameter *, LBMSimulationParameter *, ICells *, ICellNeigh &, CUstream_st *stream)>;
 
 //! \class GridScalingKernelManager
 //! \brief manage the cuda kernel calls
@@ -64,13 +62,13 @@ public:
     GridScalingKernelManager(SPtr<Parameter> parameter, GridScalingFactory *gridScalingFactory);
 
     //! \brief calls the device function of the fine to coarse grid interpolation kernelH
-    void runFineToCoarseKernelLB(const int level, InterpolationCellFC *icellFC, OffFC &offFC, CudaStreamIndex streamIndex) const;
+    void runFineToCoarseKernelLB(const int level, InterpolationCells *fineToCoarse, ICellNeigh &neighborFineToCoarse, CudaStreamIndex streamIndex) const;
 
     //! \brief calls the device function of the fine to coarse grid interpolation kernel (advection diffusion)
     void runFineToCoarseKernelAD(const int level) const;
 
     //! \brief calls the device function of the coarse to fine grid interpolation kernel
-    void runCoarseToFineKernelLB(const int level, InterpolationCellCF *icellCF, OffCF &offCF, CudaStreamIndex streamIndex) const;
+    void runCoarseToFineKernelLB(const int level, InterpolationCells *coarseToFine, ICellNeigh &neighborCoarseToFine, CudaStreamIndex streamIndex) const;
 
     //! \brief calls the device function of the coarse to fine grid interpolation kernel (advection diffusion)
     void runCoarseToFineKernelAD(const int level) const;
@@ -78,35 +76,21 @@ public:
 private:
     //! \brief check if grid scaling was set
     //! \throws std::runtime_error if interpolation nodes were assigned, but no scaling function was set in the grid
-    //! scaling factory \param scalingFunctionFC: a kernel function for the grid scaling \param scalingStruct: a struct
+    //! scaling factory \param scalingFunction: a kernel function for the grid scaling \param scalingStruct: a struct
     //! containing the grid nodes which are part of the interpolation \param scalingName: the name of the checked
     //! scaling function
-    void checkScalingFunction(const gridScalingFC &scalingFunctionFC, const InterpolationCellFC &scalingStruct,
+    void checkScalingFunction(const gridScaling &scalingFunction, const InterpolationCells &scalingStruct,
                               const std::string &scalingName)
     {
-        if (!scalingFunctionFC && scalingStruct.kFC > 0)
+        if (!scalingFunction && scalingStruct.numberOfCells > 0)
             throw std::runtime_error("The scaling function " + scalingName + " was not set!");
-        if (scalingFunctionFC && scalingStruct.kFC == 0)
-            VF_LOG_WARNING("The scaling function {} was set, although there is no refinement", scalingName);
-    }
-
-    //! \brief check if grid scaling was set
-    //! \throws std::runtime_error if interpolation nodes were assigned, but no scaling function was set in the grid
-    //! scaling factory \param scalingFunctionCF: a kernel function for the grid scaling \param scalingStruct: a struct
-    //! containing the grid nodes which are part of the interpolation \param scalingName: the name of the checked
-    //! scaling function
-    void checkScalingFunction(const gridScalingCF &scalingFunctionCF, const InterpolationCellCF &scalingStruct,
-                              const std::string &scalingName)
-    {
-        if (!scalingFunctionCF && scalingStruct.kCF > 0)
-            throw std::runtime_error("The scaling function " + scalingName + " was not set!");
-        if (scalingFunctionCF && scalingStruct.kCF == 0)
+        if (scalingFunction && scalingStruct.numberOfCells == 0)
             VF_LOG_WARNING("The scaling function {} was set, although there is no refinement", scalingName);
     }
 
     SPtr<Parameter> para;
 
-    gridScalingFC scalingFineToCoarse = nullptr;
-    gridScalingCF scalingCoarseToFine = nullptr;
+    gridScaling scalingFineToCoarse = nullptr;
+    gridScaling scalingCoarseToFine = nullptr;
 };
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/LBM/LB.h b/src/gpu/VirtualFluids_GPU/LBM/LB.h
index cfdbbbae040a13f94e97d40d702b93d5a1e19c86..d01c2c80cdb252be72f442505133a1382c816b30 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/LB.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/LB.h
@@ -164,30 +164,19 @@ struct InitCondition
 };
 
 //Interface Cells
-typedef struct ICellCF{
-   uint* ICellCFF;
-   uint* ICellCFC;
-   uint kCF;
-} InterpolationCellCF;
-
-typedef struct ICellFC{
-   uint* ICellFCF;
-   uint* ICellFCC;
-   uint kFC;
-} InterpolationCellFC;
-
-//Offset of the interface cells at the wall
-typedef struct OffCF{
-   real* xOffCF;
-   real* yOffCF;
-   real* zOffCF;
-} OffsetCF;
-
-typedef struct OffFC{
-   real* xOffFC;
-   real* yOffFC;
-   real* zOffFC;
-} OffsetFC;
+// example of old names (pre 2023) ICellCFC: interpolation from Coarse (C) to Fine (F), indices of the Coarse cells (C)
+typedef struct ICells{
+   uint* fineCellIndices;
+   uint* coarseCellIndices;
+   uint numberOfCells;
+} InterpolationCells;
+
+//! \brief stores location of neighboring cell (necessary for refinement into the wall)
+typedef struct ICellNeigh{
+   real* x;
+   real* y;
+   real* z;
+} InterpolationCellNeighbor;
 
 // Distribution functions g 6
 typedef struct  Distri6 {
diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
index 4d5895b323efa1b94a5780a59c882fd5ce1be7eb..1989f93159c4b00b340f2b8dd184f6e6c215f679 100644
--- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
@@ -46,8 +46,7 @@ void writeInterfaceLinesDebugCF(Parameter *para)
 {
     for (int level = 0; level < para->getMaxLevel(); level++) {
         const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_OffDebugCF.vtk";
-        writeGridInterfaceLines(para, level, para->getParH(level)->intCF.ICellCFC, para->getParH(level)->intCF.ICellCFF,
-                                para->getParH(level)->K_CF, fileName);
+        writeGridInterfaceLines(para, level, para->getParH(level)->coarseToFine.coarseCellIndices, para->getParH(level)->coarseToFine.fineCellIndices, para->getParH(level)->coarseToFine.numberOfCells, fileName);
     }
 }
 
@@ -55,8 +54,7 @@ void writeInterfaceLinesDebugFC(Parameter *para)
 {
     for (int level = 0; level < para->getMaxLevel(); level++) {
         const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_OffDebugFC.vtk";
-        writeGridInterfaceLines(para, level, para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.ICellFCF,
-                                para->getParH(level)->K_FC, fileName);
+        writeGridInterfaceLines(para, level, para->getParH(level)->fineToCoarse.coarseCellIndices, para->getParH(level)->fineToCoarse.fineCellIndices, para->getParH(level)->fineToCoarse.numberOfCells, fileName);
     }
 }
 
@@ -90,7 +88,7 @@ void writeInterfaceLinesDebugCFCneighbor(Parameter *para)
 {
     for (int level = 0; level < para->getMaxLevel(); level++) {
         std::string filename = para->getFName() + "_" + StringUtil::toString<int>(level) + "_CFCneighbor.vtk";
-        writeGridInterfaceLinesNeighbors(para, level, para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_CF,
+        writeGridInterfaceLinesNeighbors(para, level, para->getParH(level)->coarseToFine.coarseCellIndices, para->getParH(level)->coarseToFine.numberOfCells,
                                          filename);
     }
 }
@@ -100,8 +98,7 @@ void writeInterfaceLinesDebugCFFneighbor(Parameter *para)
 {
     for (int level = 0; level < para->getMaxLevel(); level++) {
         std::string filename = para->getFName() + "_" + StringUtil::toString<int>(level) + "_CFFneighbor.vtk";
-        writeGridInterfaceLinesNeighbors(para, level + 1, para->getParH(level)->intCF.ICellCFF,
-                                         para->getParH(level)->K_CF, filename);
+        writeGridInterfaceLinesNeighbors(para, level + 1, para->getParH(level)->coarseToFine.fineCellIndices, para->getParH(level)->coarseToFine.numberOfCells, filename);
     }
 }
 
@@ -110,7 +107,7 @@ void writeInterfaceLinesDebugFCCneighbor(Parameter *para)
 {
     for (int level = 0; level < para->getMaxLevel(); level++) {
         std::string filename = para->getFName() + "_" + StringUtil::toString<int>(level) + "_FCCneighbor.vtk";
-        writeGridInterfaceLinesNeighbors(para, level, para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_FC,
+        writeGridInterfaceLinesNeighbors(para, level, para->getParH(level)->fineToCoarse.coarseCellIndices, para->getParH(level)->fineToCoarse.numberOfCells,
                                          filename);
     }
 }
@@ -120,8 +117,7 @@ void writeInterfaceLinesDebugFCFneighbor(Parameter *para)
 {
     for (int level = 0; level < para->getMaxLevel(); level++) {
         std::string filename = para->getFName() + "_" + StringUtil::toString<int>(level) + "_FCFneighbor.vtk";
-        writeGridInterfaceLinesNeighbors(para, level + 1, para->getParH(level)->intFC.ICellFCF,
-                                         para->getParH(level)->K_FC, filename);
+        writeGridInterfaceLinesNeighbors(para, level + 1, para->getParH(level)->fineToCoarse.fineCellIndices, para->getParH(level)->fineToCoarse.numberOfCells, filename);
     }
 }
 
@@ -134,17 +130,17 @@ void writeInterfaceLinesDebugOff(Parameter *para)
 
     for (int level = 0; level < para->getMaxLevel(); level++) // evtl. Maxlevel + 1
     {
-        nodeNumberVec += (int)para->getParH(level)->K_CF;
+        nodeNumberVec += (int)para->getParH(level)->coarseToFine.numberOfCells;
     }
     nodesVec.resize(nodeNumberVec * 8);
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->K_CF; u++) {
-            double xoff = para->getParH(level)->offCF.xOffCF[u];
-            double yoff = para->getParH(level)->offCF.yOffCF[u];
-            double zoff = para->getParH(level)->offCF.zOffCF[u];
+        for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++) {
+            double xoff = para->getParH(level)->neighborCoarseToFine.x[u];
+            double yoff = para->getParH(level)->neighborCoarseToFine.y[u];
+            double zoff = para->getParH(level)->neighborCoarseToFine.z[u];
 
-            int posFine = para->getParH(level)->intCF.ICellCFF[u];
+            int posFine = para->getParH(level)->coarseToFine.fineCellIndices[u];
 
             double x1Fine = para->getParH(level + 1)->coordinateX[posFine];
             double x2Fine = para->getParH(level + 1)->coordinateY[posFine];
@@ -175,13 +171,13 @@ void writeInterfacePointsDebugCFC(Parameter *para)
 
     for (int level = 0; level < para->getMaxLevel(); level++) // evtl. Maxlevel + 1
     {
-        nodeNumberVec += (int)para->getParH(level)->K_CF;
+        nodeNumberVec += (int)para->getParH(level)->coarseToFine.numberOfCells;
     }
     nodesVec2.resize(nodeNumberVec * 8);
     int nodeCount2 = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->K_CF; u++) {
-            int pos = para->getParH(level)->intCF.ICellCFC[u];
+        for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++) {
+            int pos = para->getParH(level)->coarseToFine.coarseCellIndices[u];
 
             double x1 = para->getParH(level)->coordinateX[pos];
             double x2 = para->getParH(level)->coordinateY[pos];
@@ -467,13 +463,13 @@ void writeInterfaceCellsDebugCFC(Parameter *para)
     int nodeNumberVec = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) // evtl. Maxlevel + 1
     {
-        nodeNumberVec += (int)para->getParH(level)->K_CF;
+        nodeNumberVec += (int)para->getParH(level)->coarseToFine.numberOfCells;
     }
     nodesVec.resize(nodeNumberVec * 8);
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->K_CF; u++) {
-            int pos = para->getParH(level)->intCF.ICellCFC[u];
+        for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++) {
+            int pos = para->getParH(level)->coarseToFine.coarseCellIndices[u];
 
             double x1             = para->getParH(level)->coordinateX[pos];
             double x2             = para->getParH(level)->coordinateY[pos];
@@ -508,13 +504,13 @@ void writeInterfaceCellsDebugCFF(Parameter *para)
     int nodeNumberVec = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) // evtl. Maxlevel + 1
     {
-        nodeNumberVec += (int)para->getParH(level)->K_CF;
+        nodeNumberVec += (int)para->getParH(level)->coarseToFine.numberOfCells;
     }
     nodesVec.resize(nodeNumberVec * 8);
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->K_CF; u++) {
-            int pos = para->getParH(level)->intCF.ICellCFF[u];
+        for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++) {
+            int pos = para->getParH(level)->coarseToFine.fineCellIndices[u];
 
             double x1             = para->getParH(level + 1)->coordinateX[pos];
             double x2             = para->getParH(level + 1)->coordinateY[pos];
@@ -620,7 +616,7 @@ void writeInterfaceFCC_Send(Parameter *para)
     std::vector<std::vector<double>> nodedata;
 
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        nodeNumberVec += (int)para->getParH(level)->intFC.kFC;
+        nodeNumberVec += (int)para->getParH(level)->fineToCoarse.numberOfCells;
     }
 
     nodesVec.resize(nodeNumberVec);
@@ -628,8 +624,8 @@ void writeInterfaceFCC_Send(Parameter *para)
 
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->intFC.kFC; u++) {
-            int pos                = para->getParH(level)->intFC.ICellFCC[u];
+        for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++) {
+            int pos                = para->getParH(level)->fineToCoarse.coarseCellIndices[u];
             nodedata[0][nodeCount] = pos;
 
             // coordinate section
@@ -639,7 +635,7 @@ void writeInterfaceFCC_Send(Parameter *para)
             nodesVec[nodeCount] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
 
             // nodedata section
-            nodedata[1][nodeCount]           = u < para->getParH(level)->intFCBorder.kFC;
+            nodedata[1][nodeCount]           = u < para->getParH(level)->fineToCoarseBorder.numberOfCells;
             int sendDir                      = 0.0;
             int sendDirectionInCommAfterFtoC = 0.0;
             int sendIndex                    = 0.0;
@@ -674,7 +670,7 @@ void writeInterfaceCFC_Recv(Parameter *para)
     std::vector<std::vector<double>> nodedata;
 
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        nodeNumberVec += (int)para->getParH(level)->intCF.kCF;
+        nodeNumberVec += (int)para->getParH(level)->coarseToFine.numberOfCells;
     }
 
     nodesVec.resize(nodeNumberVec);
@@ -682,8 +678,8 @@ void writeInterfaceCFC_Recv(Parameter *para)
 
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->intCF.kCF; u++) {
-            int pos                = para->getParH(level)->intCF.ICellCFC[u];
+        for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++) {
+            int pos                = para->getParH(level)->coarseToFine.coarseCellIndices[u];
             nodedata[0][nodeCount] = pos;
 
             // coordinate section
@@ -693,7 +689,7 @@ void writeInterfaceCFC_Recv(Parameter *para)
             nodesVec[nodeCount] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
 
             // nodedata section
-            nodedata[1][nodeCount]           = u < para->getParH(level)->intCFBorder.kCF;
+            nodedata[1][nodeCount]           = u < para->getParH(level)->coarseToFineBorder.numberOfCells;
             int recvDir                      = 0.0;
             int recvDirectionInCommAfterFtoC = 0.0;
             int recvIndex                    = 0.0;
@@ -799,12 +795,12 @@ void writeSendNodesStream(Parameter *para)
             }
         }
 
-        // check if node is in iCellFCC
+        // check if node is in a coarse cell for the interpolation from fine to coarse
         nodedata[4].resize(nodedata[0].size());
         for (int i = 0; i < (int)nodedata[0].size(); i++) {
             pos = nodedata[0][i];
-            for (unsigned int u = 0; u < para->getParH(level)->intFC.kFC; u++) {
-                if (para->getParH(level)->intFC.ICellFCC[u] == (uint)pos) {
+            for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++) {
+                if (para->getParH(level)->fineToCoarse.coarseCellIndices[u] == (uint)pos) {
                     nodedata[4][i] = 1.0;
                     break;
                 }
@@ -895,7 +891,7 @@ void writeRecvNodesStream(Parameter *para)
             }
         }
 
-        // Recv are nodes ghost nodes and therefore they can't be iCellCFCs
+        // Recv are nodes ghost nodes and therefore they can't be coarse cells for the interpolation from coarse to fine
 
         std::string filenameVec = para->getFName() + "_writeRecvNodesStreams_PID_" +
                                   std::to_string(vf::gpu::Communicator::getInstance().getPID()) + "_" +
diff --git a/src/gpu/VirtualFluids_GPU/Output/OffsetWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/OffsetWriter.hpp
index 7aa660fa33d8ad31a19053e3511241de3ee07c07..fb04951db68ae509dddc7d2fe52250489b54bde2 100644
--- a/src/gpu/VirtualFluids_GPU/Output/OffsetWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/OffsetWriter.hpp
@@ -21,13 +21,13 @@ public:
 		{
 			for (int level = 0; level < para->getMaxLevel(); level++)
 			{
-				out.writeInteger(para->getParH(level)->K_CF);
+                out.writeInteger(para->getParH(level)->coarseToFine.numberOfCells);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->K_CF; u++)
+                for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++)
 				{
-					out.writeDouble(para->getParH(level)->offCF.xOffCF[u]);
-					out.writeDouble(para->getParH(level)->offCF.yOffCF[u]);
-					out.writeDouble(para->getParH(level)->offCF.zOffCF[u]);
+					out.writeDouble(para->getParH(level)->neighborCoarseToFine.x[u]);
+					out.writeDouble(para->getParH(level)->neighborCoarseToFine.y[u]);
+					out.writeDouble(para->getParH(level)->neighborCoarseToFine.z[u]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -36,13 +36,13 @@ public:
 		{
 			for (int level = 0; level < para->getMaxLevel(); level++)
 			{
-				out.writeInteger(para->getParH(level)->K_FC);
+                out.writeInteger(para->getParH(level)->fineToCoarse.numberOfCells);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->K_FC; u++)
+                for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++)
 				{
-					out.writeDouble(para->getParH(level)->offFC.xOffFC[u]);
-					out.writeDouble(para->getParH(level)->offFC.yOffFC[u]);
-					out.writeDouble(para->getParH(level)->offFC.zOffFC[u]);
+					out.writeDouble(para->getParH(level)->neighborFineToCoarse.x[u]);
+					out.writeDouble(para->getParH(level)->neighborFineToCoarse.y[u]);
+					out.writeDouble(para->getParH(level)->neighborFineToCoarse.z[u]);
 				}
 				out.writeLine();
 			} //end levelloop
diff --git a/src/gpu/VirtualFluids_GPU/Output/PosVecIntWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/PosVecIntWriter.hpp
index a9207ed231e8d9667e57636a5a5fdd6b5aeab94f..d7eab31d639d23d2356263aa8b152d69b3c042b8 100644
--- a/src/gpu/VirtualFluids_GPU/Output/PosVecIntWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/PosVecIntWriter.hpp
@@ -38,11 +38,11 @@ public:
 		{
 			for (int level = 0; level < para->getMaxLevel(); level++)
 			{
-				out.writeInteger(para->getParH(level)->K_CF);
+                out.writeInteger(para->getParH(level)->coarseToFine.numberOfCells);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->K_CF; u++)
+                for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++)
 				{
-					out.writeInteger(para->getParH(level)->intCF.ICellCFC[u]);
+					out.writeInteger(para->getParH(level)->coarseToFine.coarseCellIndices[u]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -51,11 +51,11 @@ public:
 		{
 			for (int level = 0; level < para->getMaxLevel(); level++)
 			{
-				out.writeInteger(para->getParH(level)->K_CF);
+                out.writeInteger(para->getParH(level)->coarseToFine.numberOfCells);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->K_CF; u++)
+                for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++)
 				{
-					out.writeInteger(para->getParH(level)->intCF.ICellCFF[u]);
+					out.writeInteger(para->getParH(level)->coarseToFine.fineCellIndices[u]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -64,11 +64,11 @@ public:
 		{
 			for (int level = 0; level < para->getMaxLevel(); level++)
 			{
-				out.writeInteger(para->getParH(level)->K_FC);
+                out.writeInteger(para->getParH(level)->fineToCoarse.numberOfCells);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->K_FC; u++)
+                for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++)
 				{
-					out.writeInteger(para->getParH(level)->intFC.ICellFCC[u]);
+					out.writeInteger(para->getParH(level)->fineToCoarse.coarseCellIndices[u]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -77,11 +77,11 @@ public:
 		{
 			for (int level = 0; level < para->getMaxLevel(); level++)
 			{
-				out.writeInteger(para->getParH(level)->K_FC);
+                out.writeInteger(para->getParH(level)->fineToCoarse.numberOfCells);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->K_FC; u++)
+                for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++)
 				{
-					out.writeInteger(para->getParH(level)->intFC.ICellFCF[u]);
+					out.writeInteger(para->getParH(level)->fineToCoarse.fineCellIndices[u]);
 				}
 				out.writeLine();
 			} //end levelloop
diff --git a/src/gpu/VirtualFluids_GPU/Output/interfaceWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/interfaceWriter.hpp
index f140b15a6b7595a959139da2a35ed58f01b2a307..bf35411b93fd1f126cfdde1f3739f1baa33a4d83 100644
--- a/src/gpu/VirtualFluids_GPU/Output/interfaceWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/interfaceWriter.hpp
@@ -32,11 +32,11 @@ public:
 		{
 			if ((Type == "_InterfaceCFC") || (Type == "_InterfaceCFF"))
 			{
-				nodeNumberVec += para->getParH(level)->K_CF;
+                nodeNumberVec += para->getParH(level)->coarseToFine.numberOfCells;
 			}
 			else if (Type == "_InterfaceFCF")
 			{
-				nodeNumberVec += para->getParH(level)->K_FC;
+                nodeNumberVec += para->getParH(level)->fineToCoarse.numberOfCells;
 			}
 		}
 		nodesVec.resize(nodeNumberVec*8);
@@ -55,9 +55,9 @@ public:
 			//std::vector<unsigned int>& posVec = posIndexVec[level];
 			if (Type == "_InterfaceCFC")
 			{
-				for(unsigned int u=0;u<para->getParH(level)->K_CF;u++)
+                for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++)
 				{
-					int pos = para->getParH(level)->intCF.ICellCFC[u];
+					int pos = para->getParH(level)->coarseToFine.coarseCellIndices[u];
 					int ix1 = pos % nx1lev;
 					int wertDurchNx1 = pos / nx1lev;
 					int ix2 = wertDurchNx1 % nx2lev;
@@ -82,9 +82,9 @@ public:
 			}
 			else if (Type == "_InterfaceCFF")
 			{
-				for(unsigned int u=0;u<para->getParH(level)->K_CF;u++)
+                for (unsigned int u = 0; u < para->getParH(level)->coarseToFine.numberOfCells; u++)
 				{
-					int pos = para->getParH(level)->intCF.ICellCFF[u];
+					int pos = para->getParH(level)->coarseToFine.fineCellIndices[u];
 					int ix1 = pos % nx1lev;
 					int wertDurchNx1 = pos / nx1lev;
 					int ix2 = wertDurchNx1 % nx2lev;
@@ -109,9 +109,9 @@ public:
 			}
 			else if (Type == "_InterfaceFCF")
 			{
-				for(unsigned int u=0;u<para->getParH(level)->K_FC;u++)
+                for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++)
 				{
-					int pos = para->getParH(level)->intFC.ICellFCF[u];
+					int pos = para->getParH(level)->fineToCoarse.fineCellIndices[u];
 					int ix1 = pos % nx1lev;
 					int wertDurchNx1 = pos / nx1lev;
 					int ix2 = wertDurchNx1 % nx2lev;
@@ -146,7 +146,7 @@ public:
 		int nodeNumberVec = 0;
 		for (int level = 0; level < para->getMaxLevel(); level++)
 		{
-			nodeNumberVec += para->getParH(level)->K_FC;
+            nodeNumberVec += para->getParH(level)->fineToCoarse.numberOfCells;
 		}
 		nodesVec.resize(nodeNumberVec*8);
 		int nodeCount = 0;
@@ -163,9 +163,9 @@ public:
 			double achtelNodeDelta = 0.125*nodeDeltaLevel;
 			//int count = 0;
 			//std::vector<unsigned int>& posVec = posIndexVec[level];
-			for(unsigned int u=0;u<para->getParH(level)->K_FC;u++)
+            for (unsigned int u = 0; u < para->getParH(level)->fineToCoarse.numberOfCells; u++)
 			{
-				int pos = para->getParH(level)->intFC.ICellFCC[u];//posVec[u];
+				int pos = para->getParH(level)->fineToCoarse.coarseCellIndices[u];//posVec[u];
 				int ix1 = pos % nx1lev;
 				int wertDurchNx1 = pos / nx1lev;
 				int ix2 = wertDurchNx1 % nx2lev;
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
index e593d16d6ed1f69ca65a22606a157e7ea9e6b111..9a7f92a96e51cb1fb9c2138721ba5e3143b84ebe 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
@@ -493,9 +493,9 @@ void Parameter::initLBMSimulationParameter()
         parH[i]->gridNX           = getGridX().at(i);
         parH[i]->gridNY           = getGridY().at(i);
         parH[i]->gridNZ           = getGridZ().at(i);
-        parH[i]->vis              = ic.vis * pow(2.f, i);
-        parH[i]->diffusivity      = ic.Diffusivity * pow(2.f, i);
-        parH[i]->omega            = 1.0f / (3.0f * parH[i]->vis + 0.5f); // omega :-) not s9 = -1.0f/(3.0f*parH[i]->vis+0.5f);//
+        parH[i]->viscosity        = ic.vis * pow((real)2.0, i);
+        parH[i]->diffusivity      = ic.Diffusivity * pow((real)2.0, i);
+        parH[i]->omega            = (real)1.0 / (real(3.0) * parH[i]->viscosity + real(0.5)); // omega :-) not s9 = -1.0f/(3.0f*parH[i]->vis+0.5f);//
         parH[i]->nx               = parH[i]->gridNX + 2 * STARTOFFX;
         parH[i]->ny               = parH[i]->gridNY + 2 * STARTOFFY;
         parH[i]->nz               = parH[i]->gridNZ + 2 * STARTOFFZ;
@@ -510,10 +510,10 @@ void Parameter::initLBMSimulationParameter()
         parH[i]->isEvenTimestep        = true;
         parH[i]->startz           = parH[i]->gridNZ * ic.myProcessId;
         parH[i]->endz             = parH[i]->gridNZ * ic.myProcessId + parH[i]->gridNZ;
-        parH[i]->Lx               = (real)((1.f * parH[i]->gridNX - 1.f) / (pow(2.f, i)));
-        parH[i]->Ly               = (real)((1.f * parH[i]->gridNY - 1.f) / (pow(2.f, i)));
-        parH[i]->Lz               = (real)((1.f * parH[i]->gridNZ - 1.f) / (pow(2.f, i)));
-        parH[i]->dx               = (real)(1.f / (pow(2.f, i)));
+        parH[i]->Lx               = ((real)1.0 * parH[i]->gridNX - (real)1.0) / (pow((real)2.0, i));
+        parH[i]->Ly               = ((real)1.0 * parH[i]->gridNY - (real)1.0) / (pow((real)2.0, i));
+        parH[i]->Lz               = ((real)1.0 * parH[i]->gridNZ - (real)1.0) / (pow((real)2.0, i));
+        parH[i]->dx               = (real)1.0 / pow((real)2.0, i);
         parH[i]->XdistKn          = getDistX().at(i);
         parH[i]->YdistKn          = getDistY().at(i);
         parH[i]->ZdistKn          = getDistZ().at(i);
@@ -521,12 +521,12 @@ void Parameter::initLBMSimulationParameter()
             parH[i]->distX  = (real)getDistX().at(i);
             parH[i]->distY  = (real)getDistY().at(i);
             parH[i]->distZ  = (real)getDistZ().at(i);
-            parH[i]->mTtoWx = (real)1.0f;
-            parH[i]->mTtoWy = (real)1.0f;
-            parH[i]->mTtoWz = (real)1.0f;
-            parH[i]->cTtoWx = (real)0.0f;
-            parH[i]->cTtoWy = (real)0.0f;
-            parH[i]->cTtoWz = (real)0.0f;
+            parH[i]->mTtoWx = (real)1.0;
+            parH[i]->mTtoWy = (real)1.0;
+            parH[i]->mTtoWz = (real)1.0;
+            parH[i]->cTtoWx = (real)0.0;
+            parH[i]->cTtoWy = (real)0.0;
+            parH[i]->cTtoWz = (real)0.0;
             ////MGs Trafo///////////////////////////////////////////////////////////////
             // parH[i]->cStartx               = (real)parH[i]->XdistKn;
             // parH[i]->cStarty               = (real)parH[i]->XdistKn;
@@ -534,9 +534,9 @@ void Parameter::initLBMSimulationParameter()
             ////////////////////////////////////////////////////////////////////////////
         } else {
             // Geller
-            parH[i]->distX = ((real)getDistX().at(i) + 0.25f) * parH[i - 1]->dx;
-            parH[i]->distY = ((real)getDistY().at(i) + 0.25f) * parH[i - 1]->dx;
-            parH[i]->distZ = ((real)getDistZ().at(i) + 0.25f) * parH[i - 1]->dx;
+            parH[i]->distX = ((real)getDistX().at(i) + (real)0.25) * parH[i - 1]->dx;
+            parH[i]->distY = ((real)getDistY().at(i) + (real)0.25) * parH[i - 1]->dx;
+            parH[i]->distZ = ((real)getDistZ().at(i) + (real)0.25) * parH[i - 1]->dx;
             // parH[i]->distX                 = ((real)getDistX().at(i) + 0.25f) * parH[i-1]->dx + parH[i-1]->distX;
             // parH[i]->distY                 = ((real)getDistY().at(i) + 0.25f) * parH[i-1]->dx + parH[i-1]->distY;
             // parH[i]->distZ                 = ((real)getDistZ().at(i) + 0.25f) * parH[i-1]->dx + parH[i-1]->distZ;
@@ -561,7 +561,7 @@ void Parameter::initLBMSimulationParameter()
         parD[i]->gridNX           = parH[i]->gridNX;
         parD[i]->gridNY           = parH[i]->gridNY;
         parD[i]->gridNZ           = parH[i]->gridNZ;
-        parD[i]->vis              = parH[i]->vis;
+        parD[i]->viscosity        = parH[i]->viscosity;
         parD[i]->diffusivity      = parH[i]->diffusivity;
         parD[i]->omega            = parH[i]->omega;
         parD[i]->nx               = parH[i]->nx;
@@ -598,7 +598,7 @@ void Parameter::checkParameterValidityCumulantK17() const
     if (this->mainKernel != "CumulantK17")
         return;
 
-    const real viscosity = this->parH[maxlevel]->vis;
+    const real viscosity = this->parH[maxlevel]->viscosity;
     const real viscosityLimit = 1.0 / 42.0;
     if (viscosity > viscosityLimit) {
         VF_LOG_WARNING("The viscosity (in LB units) at level {} is {:1.3g}. It is recommended to keep it smaller than {:1.3g} "
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index 24e0475ba516de82f9fb8bba40a9aab31415c6bd..cfd13d62be45135d40f69e1f9c6b6d69303b6c9c 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -85,6 +85,8 @@ struct LBMSimulationParameter {
     real *velocityX, *velocityY, *velocityZ, *rho, *pressure;
     //! \brief stores the value for omega
     real omega;
+    //! \brief stores the value for viscosity
+    real viscosity;
     //////////////////////////////////////////////////////////////////////////
     //! \brief stores the number of nodes (based on indirect addressing scheme)
     unsigned long long numberOfNodes;
@@ -128,6 +130,8 @@ struct LBMSimulationParameter {
     //! \brief can be used for pressure correction at outflow boundary condition
     real outflowPressureCorrectionFactor;
     //////////////////////////////////////////////////////////////////////////
+    //! \brief store the values of body forces for all 3 dimensions
+    real *forceX_SP, *forceY_SP, *forceZ_SP;
 
 
     //////////////////////////////////////////////////////////////////////////
@@ -141,8 +145,28 @@ struct LBMSimulationParameter {
     real *concentration;
     //! \brief store all distribution functions for the D3Q27 advection diffusion field
     Distributions27 distributionsAD;
+    //////////////////////////////////////////////////////////////////////////
 
 
+    //////////////////////////////////////////////////////////////////////////
+    // Grid Refinement
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief stores the base-node-indices of coarse and fine refinement cells
+    InterpolationCells coarseToFine;
+    InterpolationCells fineToCoarse;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief distinguish between bulk and border interpolation cells (necessary for communication hiding)
+    InterpolationCells fineToCoarseBorder;
+    InterpolationCells fineToCoarseBulk;
+    InterpolationCells coarseToFineBorder;
+    InterpolationCells coarseToFineBulk;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief stores location of neighboring cell (necessary for refinement into the wall)
+    InterpolationCellNeighbor neighborCoarseToFine;
+    InterpolationCellNeighbor neighborCoarseToFineBulk;
+    InterpolationCellNeighbor neighborFineToCoarse;
+    InterpolationCellNeighbor neighborFineToCoarseBulk;
+    //////////////////////////////////////////////////////////////////////////
 
 
 
@@ -151,9 +175,31 @@ struct LBMSimulationParameter {
 
 
 
+    //////////////////////////////////////////////////////////////////////////
+    // potential additional logic
+    //////////////////////////////////////////////////////////////////////////
+
+    // distributions F3////////
+    Distributions6 g6;
+
+    unsigned int size_Array_SP; //?? Deprecated
+
+    // BC NoSlip
+    TempforBoundaryConditions Temp;
+    // BC Velocity
+    TempVelforBoundaryConditions TempVel;
+    // BC Pressure
+    TempPressforBoundaryConditions TempPress;
+
+
+
+
+
+
+
 
     //////////////////////////////////////////////////////////////////////////
-    // DEPRECATED
+    // DEPRECATED - planed to be taken out for next open source release
     //////////////////////////////////////////////////////////////////////////
 
     // distributions///////////
@@ -210,41 +256,58 @@ struct LBMSimulationParameter {
     real cStartx, cStarty, cStartz;
     real cFx, cFy, cFz;
 
+    // interface////////////////
+    bool need_interface[6];
+    unsigned int XdistKn, YdistKn, ZdistKn;
 
-    //////////////////////////////////////////////////////////////////////////
+    // vel parab///////////////
+    real *vParab;
+
+    // macroscopic values//////
+    // real *vx, *vy, *vz, *rho;  // DEPRECATED: macroscopic values for full matrix
+
+    // derivations for iso test
+    real *dxxUx, *dyyUy, *dzzUz;
 
+    // grid////////////////////
+    unsigned int nx, ny, nz;
+    unsigned int gridNX, gridNY, gridNZ;
 
+    // size of matrix//////////
+    unsigned int size_Mat;
+    unsigned int sizePlaneXY, sizePlaneYZ, sizePlaneXZ;
 
+    // size of Plane btw. 2 GPUs//////
+    unsigned int sizePlaneSB, sizePlaneRB, startB, endB;
+    unsigned int sizePlaneST, sizePlaneRT, startT, endT;
+    bool isSetSendB, isSetRecvB, isSetSendT, isSetRecvT;
+    int *SendT, *SendB, *RecvT, *RecvB;
+
+    // size of Plane for PressMess
+    unsigned int sizePlanePress, startP;
+    unsigned int sizePlanePressIN, startPIN;
+    unsigned int sizePlanePressOUT, startPOUT;
+    bool isSetPress;
+
+    // deltaPhi
+    real deltaPhi;
+
+    // particles
+    PathLineParticles plp;
 
 
-    //////////////////////////////////////////////////////////////////////////
-    // additional logic 
     //////////////////////////////////////////////////////////////////////////
 
-    // distributions F3////////
-    Distributions6 g6;
 
-    unsigned int size_Array_SP; //?? Deprecated
 
-    // BC NoSlip
-    TempforBoundaryConditions Temp;
-    // BC Velocity
-    TempVelforBoundaryConditions TempVel;
-    // BC Pressure
-    TempPressforBoundaryConditions TempPress;
 
-    // memory size of sparse matrix /////////////////
+
 
 
 
     //////////////////////////////////////////////////////////////////////////
 
 
-    // body forces////////////
-    real *forceX_SP, *forceY_SP, *forceZ_SP;
-
-    // vel parab///////////////
-    real *vParab;
 
     // turbulent viscosity ///
     real *turbViscosity;
@@ -255,13 +318,6 @@ struct LBMSimulationParameter {
     real *vxx, *vyy, *vzz, *vxy, *vxz, *vyz; // fluctuations
     std::vector<real> turbulenceIntensity;
 
-    // macroscopic values//////
-    // real *vx, *vy, *vz, *rho;  // DEPRECATED: macroscopic values for full matrix
-    //! \brief stores the value for viscosity (on level 0)
-    real vis;
-
-    // derivations for iso test
-    real *dxxUx, *dyyUy, *dzzUz;
 
     // median-macro-values/////
     real *vx_SP_Med, *vy_SP_Med, *vz_SP_Med, *rho_SP_Med, *press_SP_Med;
@@ -269,55 +325,12 @@ struct LBMSimulationParameter {
     // Advection-Diffusion
     real *Conc_Med, *Conc_Med_Out;
 
-    // grid////////////////////
-    unsigned int nx, ny, nz;
-    unsigned int gridNX, gridNY, gridNZ;
-
-    // size of matrix//////////
-    unsigned int size_Mat;
-    unsigned int sizePlaneXY, sizePlaneYZ, sizePlaneXZ;
-
-    // size of Plane btw. 2 GPUs//////
-    unsigned int sizePlaneSB, sizePlaneRB, startB, endB;
-    unsigned int sizePlaneST, sizePlaneRT, startT, endT;
-    bool isSetSendB, isSetRecvB, isSetSendT, isSetRecvT;
-    int *SendT, *SendB, *RecvT, *RecvB;
-
-    // size of Plane for PressMess
-    unsigned int sizePlanePress, startP;
-    unsigned int sizePlanePressIN, startPIN;
-    unsigned int sizePlanePressOUT, startPOUT;
-    bool isSetPress;
-
 
     // print///////////////////
     unsigned int startz, endz;
     real Lx, Ly, Lz, dx;
     real distX, distY, distZ;
 
-    // interface////////////////
-    bool need_interface[6];
-    unsigned int XdistKn, YdistKn, ZdistKn;
-    InterpolationCellCF intCF;
-    InterpolationCellFC intFC;
-    unsigned int K_CF;
-    unsigned int K_FC;
-    unsigned int mem_size_kCF;
-    unsigned int mem_size_kFC;
-
-    InterpolationCellFC intFCBorder;
-    InterpolationCellFC intFCBulk;
-    InterpolationCellCF intCFBorder;
-    InterpolationCellCF intCFBulk;
-
-    // offset//////////////////
-    OffsetCF offCF;
-    OffsetCF offCFBulk;
-    OffsetFC offFC;
-    OffsetFC offFCBulk;
-    unsigned int mem_size_kCF_off;
-    unsigned int mem_size_kFC_off;
-
     // testRoundoffError
     Distributions27 kDistTestRE;
 
@@ -376,13 +389,6 @@ struct LBMSimulationParameter {
     int *naschVelocity;
     uint numberOfStreetNodes;
 
-    // deltaPhi
-    real deltaPhi;
-
-    ////////////////////////////////////////////////////////////////////////////
-    // particles
-    PathLineParticles plp;
-    ////////////////////////////////////////////////////////////////////////////
 
     ////////////////////////////////////////////////////////////////////////////
     // 1D domain decomposition