diff --git a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
index c23e4d5dffd844ed363ef5255cc8229cab55cd0c..551e3ffd9cf3b5366ab78594008d0b3df609bdec 100644
--- a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
+++ b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
@@ -56,7 +56,6 @@
 
 #include "utilities/communication.h"
 
-#include "VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -110,7 +109,7 @@ void multipleLevel(const std::string& configPath)
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     bool useGridGenerator = true;
-    bool useMultiGPU = true;
+    bool useMultiGPU = false;
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -145,8 +144,8 @@ void multipleLevel(const std::string& configPath)
 
     // para->setMaxLevel(2);
 
-    // para->setMainKernel("CumulantK15Comp");
-    para->setMainKernel("CumulantK17CompChimSparse");
+    para->setMainKernel("CumulantK17CompChim");
+    //para->setMainKernel("CumulantK17CompChimSparse");
 
     if (useMultiGPU) {
         para->setDevices(std::vector<uint>{ (uint)0, (uint)1 });
@@ -241,14 +240,11 @@ void multipleLevel(const std::string& configPath)
             gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
             //////////////////////////////////////////////////////////////////////////
 
-            gridBuilder->writeGridsToVtk(path + "/" + bivalveType + "/grid/part" + std::to_string(generatePart) + "_");
+            //gridBuilder->writeGridsToVtk(path + "/" + bivalveType + "/grid/part" + std::to_string(generatePart) + "_");
             //gridBuilder->writeGridsToVtk(path + "/" + bivalveType + "/" + std::to_string(generatePart) + "/grid/");
             //gridBuilder->writeArrows(path + "/" + bivalveType + "/" + std::to_string(generatePart) + " /arrow");
 
             gridBuilder->findGeoFluidNodes();
-            std::shared_ptr<NodeIndicesMultiGPU> nodeIndicesMultiGPU = std::make_shared<NodeIndicesMultiGPU>(gridBuilder->getGeoFluidSizes(), 
-                                                                                                             gridBuilder->getGeoFluidNodeIndices());
-            para->setNodeIndicesMultiGPU(nodeIndicesMultiGPU);
 
             SimulationFileWriter::write(gridPath + "/" + std::to_string(generatePart) + "/", gridBuilder, FILEFORMAT::BINARY);
            
@@ -273,7 +269,9 @@ void multipleLevel(const std::string& configPath)
             gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
             //////////////////////////////////////////////////////////////////////////
 
-            gridBuilder->writeGridsToVtk("E:/temp/MusselOyster/" + bivalveType + "/grid/");
+            gridBuilder->findGeoFluidNodes();
+
+            //gridBuilder->writeGridsToVtk("E:/temp/MusselOyster/" + bivalveType + "/grid/");
             // gridBuilder->writeArrows ("E:/temp/MusselOyster/" + bivalveType + "/arrow");
 
             SimulationFileWriter::write(gridPath, gridBuilder, FILEFORMAT::BINARY);
diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index f964349315ef8ff8e143b82bf06c18f9fa5b509c..3a70c16add28cac2f717316ce53b1f735d04d7ec 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -142,10 +142,9 @@ public:
     virtual void repairCommunicationInices(int direction) = 0;
 
     // needed for CUDA Streams MultiGPU
-    virtual void findMatrixIDsGEO_FLUID()                     = 0;
-    virtual uint getGeoFluidSize() const                      = 0;
-    virtual const uint* getGeoFluidNodes() const = 0;
-
+    virtual void findFluidNodeIndices() = 0;
+    virtual uint getNumberOfFluidNodes() const = 0;
+    virtual void getFluidNodeIndices(uint *fluidNodeIndices) const = 0;
 };
 
 #endif
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
index 8136bd38d97820955be5b1210293b6abcd4b64ff..0d12590c18dc0b3de7b25a242f70a6439cb31310 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -84,6 +84,9 @@ public:
     virtual void getSendIndices( int* sendIndices, int direction, int level ) = 0;
     virtual void getReceiveIndices( int* sendIndices, int direction, int level ) = 0;
 
+    virtual uint getNumberOfFluidNodes(unsigned int level) const = 0;
+    virtual void getFluidNodeIndices(uint *fluidNodeIndices, const int level) const = 0;
+
 };
 
 #endif
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 92bb2040fdc963e1ba991b531fd91bc8ef14674e..46059f2e56c8572033f53f8641818c3ac437d759 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -263,6 +263,10 @@ uint LevelGridBuilder::getNumberOfNodes(unsigned int level) const
     return grids[level]->getSparseSize();
 }
 
+uint LevelGridBuilder::getNumberOfFluidNodes(unsigned int level) const 
+{ 
+    return grids[level]->getNumberOfFluidNodes(); 
+}
 
 std::shared_ptr<Grid> LevelGridBuilder::getGrid(int level, int box)
 {
@@ -294,6 +298,9 @@ void LevelGridBuilder::getNodeValues(real *xCoords, real *yCoords, real *zCoords
 
 //TODO: add getSlipSize...
 
+GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndices(uint *fluidNodeIndices, const int level) const { 
+    grids[level]->getFluidNodeIndices(fluidNodeIndices);
+}
 
 uint LevelGridBuilder::getVelocitySize(int level) const
 {
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index fe7b53f5270f7b5235fdb8a0419558fa106ef878..001c54e7169399907e6a4f108577f351732aa729 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -54,9 +54,10 @@ public:
 
     GRIDGENERATOR_EXPORT virtual std::shared_ptr<Grid> getGrid(int level, int box);
 
-
     GRIDGENERATOR_EXPORT virtual unsigned int getNumberOfNodes(unsigned int level) const override;
 
+    GRIDGENERATOR_EXPORT virtual uint getNumberOfFluidNodes(unsigned int level) const override;
+    GRIDGENERATOR_EXPORT virtual void getFluidNodeIndices(uint* fluidNodeIndices, const int level) const override;
 
     GRIDGENERATOR_EXPORT virtual void getNodeValues(real *xCoords, real *yCoords, real *zCoords,
                                          uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, 
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index ffa1aa776327493e94f030b36aa4f587f38713c9..2243ccd656c347a83560e32b61a619b9be5db92a 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -604,29 +604,10 @@ void MultipleGridBuilder::findGeoFluidNodes()
 {
     *logging::out << logging::Logger::INFO_HIGH << "Start findGeoFluidNodes()\n";
     for (uint i = 0; i < grids.size(); i++)
-        grids[i]->findMatrixIDsGEO_FLUID();
+        grids[i]->findFluidNodeIndices();
     *logging::out << logging::Logger::INFO_HIGH << "Done with findGeoFluidNodes()\n";
 }
 
-const std::vector<uint> *MultipleGridBuilder::getGeoFluidSizes() const
-{
-    std::vector<uint> geoFluidSizes;
-    for (uint level = 0; level < grids.size(); level++) {
-        geoFluidSizes.push_back(grids[level]->getGeoFluidSize());
-    }
-    return &geoFluidSizes;
-}
-
-const std::vector<const uint*> *MultipleGridBuilder::getGeoFluidNodeIndices() const
-{
-    std::vector<const uint*> getGeoFluidNodes;
-    for (uint level = 0; level < grids.size(); level++) {
-        getGeoFluidNodes.push_back(grids[level]->getGeoFluidNodes());
-    }
-    return &getGeoFluidNodes;
-}
-
-
 void MultipleGridBuilder::writeGridsToVtk(const std::string& path) const
 {
     for(uint level = 0; level < grids.size(); level++)
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
index d014613d1f647e184d0cd43eb8a784b3a1f592ac..8039aedd1619ab59f7a9968007b4ab206d679b7b 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
@@ -87,8 +87,6 @@ public:
 
     // needed for CUDA Streams MultiGPU
     void findGeoFluidNodes();
-    GRIDGENERATOR_EXPORT const std::vector<uint> *getGeoFluidSizes() const;
-    GRIDGENERATOR_EXPORT const std::vector<const uint*> *getGeoFluidNodeIndices() const;
 };
 
 #endif
diff --git a/src/gpu/GridGenerator/grid/GridImp.cu b/src/gpu/GridGenerator/grid/GridImp.cu
index 40d66190c1a1d9c495e7cbcfce11fee0061a5d1d..bbf0d4919c291422ce8f7309d93c039d3699a1b2 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -858,24 +858,18 @@ CUDA_HOST void GridImp::updateSparseIndices()
     sparseSize = size - removedNodes;
 }
 
-CUDA_HOST void GridImp::findMatrixIDsGEO_FLUID() // typeOfGridNode = para->getParD(level)->geoSP[index]
+CUDA_HOST void GridImp::findFluidNodeIndices() 
 {
     // auf Basis von getNodeValues und updateSparseIndices
-    int geoFluidSize = 0;
-    int geoFluidNodesIndex = 0;
     for (uint index = 0; index < size; index++) {
-        if (this->sparseIndices[index] == -1) //unnötig?
+        uint sparseIndex = sparseIndices[index];
+        if (sparseIndex == -1)
             continue;
 
-        if (this->field.isFluid(index)) {
-            // + 1 for numbering shift between GridGenerator and VF_GPU
-            geoFluidNodes[geoFluidNodesIndex] = index + 1; //+1 notwendig?
-            geoFluidNodesIndex++;
-            geoFluidSize++;
-        }
-        /*if (typeOfGridNode[index] == GEO_FLUID)            
-            geoFluidNodes.push_back(index);  */                 
+        if (this->field.isFluid(index))
+            fluidNodeIndices.push_back(sparseIndex);            
     }
+    numberOfFluidNodes = fluidNodeIndices.size();
 }
 
 HOSTDEVICE void GridImp::setNeighborIndices(uint index)
@@ -1767,12 +1761,8 @@ HOSTDEVICE uint GridImp::getSparseSize() const
     return this->sparseSize; 
 }
 
-HOSTDEVICE uint GridImp::getGeoFluidSize() const { 
-    return this->geoFluidSize; 
-}
-
-HOSTDEVICE const uint* GridImp::getGeoFluidNodes() const{ 
-    return this->geoFluidNodes; 
+HOSTDEVICE uint GridImp::getNumberOfFluidNodes() const { 
+    return this->numberOfFluidNodes; 
 }
 
 HOSTDEVICE Field GridImp::getField() const
@@ -1935,7 +1925,7 @@ CUDA_HOST void GridImp::getNodeValues(real *xCoords, real *yCoords, real *zCoord
     geo[0] = GEOSOLID;
 
     int nodeNumber = 0;
-    for (uint i = 0; i < this->getSize(); i++)
+    for (uint i = 0; i < this->size; i++)
     {
         if (this->sparseIndices[i] == -1)
             continue;
@@ -1967,6 +1957,12 @@ CUDA_HOST void GridImp::getNodeValues(real *xCoords, real *yCoords, real *zCoord
     }
 }
 
+CUDA_HOST void GridImp::getFluidNodeIndices(uint *fluidNodeIndices) const { 
+  for (uint nodeNumber = 0; nodeNumber < this->numberOfFluidNodes; nodeNumber++)
+        fluidNodeIndices[nodeNumber] = this->fluidNodeIndices[nodeNumber];
+}
+
+
 void GridImp::print() const
 {
     printf("min: (%2.4f, %2.4f, %2.4f), max: (%2.4f, %2.4f, %2.4f), size: %d, delta: %2.4f\n", startX, startY, startZ,
diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h
index 2f4d044fbb61b262f1170251f9415257a8de6e73..06dc501e210ce198903eed2661bdd917c8f30e14 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -86,8 +86,8 @@ private:
     int *neighborIndexX, *neighborIndexY, *neighborIndexZ, *neighborIndexNegative;
     int *sparseIndices;
 
-    uint *geoFluidNodes;
-    uint geoFluidSize;
+    std::vector<uint> fluidNodeIndices;
+    uint numberOfFluidNodes;
 
 	uint *qIndices;     //maps from matrix index to qIndex
 	real *qValues;
@@ -316,10 +316,10 @@ public:
 
     void repairCommunicationInices(int direction) override;
 
-    // needed for CUDA Streams MultiGPU
-    void findMatrixIDsGEO_FLUID() override;
-    uint getGeoFluidSize() const override;
-    const uint* getGeoFluidNodes() const override;
+    void findFluidNodeIndices() override;
+    uint getNumberOfFluidNodes() const override;
+    CUDA_HOST void getFluidNodeIndices(uint *fluidNodeIndices) const;
+
 
 public:
 
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
index 957935756163795945e9ac1c4762e0eb825239ee..22d3d3a38d1364205f2386e377b3a0502993387a 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
@@ -29,6 +29,12 @@ void GridProvider::setNumberOfNodes(const int numberOfNodes, const int level) co
     para->getParD(level)->mem_size_int_SP = sizeof(uint) * para->getParD(level)->size_Mat_SP;
 }
 
+void GridProvider::setNumberOfFluidNodes(const int numberOfNodes, const int level) const
+{
+    para->getParH(level)->numberOfFluidNodes = numberOfNodes;
+    para->getParD(level)->numberOfFluidNodes = numberOfNodes;
+}
+
 void GridProvider::setInitalNodeValues(const int numberOfNodes, const int level) const
 {
     for (int j = 1; j <= numberOfNodes; j++)
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
index 70a2a8ec629809689096ce0b33a197924cf000a2..d8f442115a965af58110dcc778768dc9f4210847 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
@@ -25,6 +25,8 @@ public:
 	virtual void allocArrays_BoundaryValues() = 0;
 	virtual void allocArrays_BoundaryQs() = 0;
     virtual void allocArrays_OffsetScale() = 0;
+    virtual void allocArrays_fluidNodeIndices() = 0;
+
 	virtual void setDimensions() = 0;
 	virtual void setBoundingBox() = 0;
 	virtual void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex, std::string way) = 0;
@@ -39,6 +41,7 @@ public:
 
 protected:
 	void setNumberOfNodes(const int numberOfNodes, const int level) const;
+    void setNumberOfFluidNodes(const int numberOfNodes, const int level) const;
     virtual void setInitalNodeValues(const int numberOfNodes, const int level) const;
 
 	void setPressSizePerLevel(int level, int sizePerLevel) const;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
index 940dbfa617ccd06f5d7b77527cc78b618062240a..c2e19b659d401ec94e14532a5b71fbb86e2d0fe6 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
@@ -216,6 +216,10 @@ void GridReader::allocArrays_OffsetScale()
     std::cout << "-----Ende OffsetScale------" << std::endl;
 }
 
+void GridReader::allocArrays_fluidNodeIndices() {
+	// TODO
+}
+
 
 void GridReader::setPressureValues(int channelSide) const
 {
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h
index f7a4c43062da79d39c43e6822688c51ad55e7442..cbb0fac42f2e5e62dea82c63552a0d524c858d83 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h
@@ -39,6 +39,7 @@ public:
 	void allocArrays_CoordNeighborGeo() override;
 	void allocArrays_BoundaryValues() override;
     void allocArrays_OffsetScale() override;
+    void allocArrays_fluidNodeIndices() override;
 
 	void initalValuesDomainDecompostion(int level);
 
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index 3ce1093d1847743962f3b76cbe62445cbacef312..ec7056460e58da0eca90024975c74701ef56531d 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -87,6 +87,16 @@ void GridGenerator::allocArrays_CoordNeighborGeo()
 	std::cout << "-----finish Coord, Neighbor, Geo------" << std::endl;
 }
 
+void GridGenerator::allocArrays_fluidNodeIndices() {
+    const uint numberOfLevels = builder->getNumberOfGridLevels();
+    for (uint level = 0; level < numberOfLevels; level++) {
+        setNumberOfFluidNodes(builder->getNumberOfFluidNodes(level), level);
+        cudaMemoryManager->cudaAllocFluidNodeIndices(level);
+        builder->getFluidNodeIndices(para->getParH(level)->fluidNodeIndices, level);
+        cudaMemoryManager->cudaCopyFluidNodeIndices(level);
+    }    
+}
+
 void GridGenerator::allocArrays_BoundaryValues()
 {
 	std::cout << "------read BoundaryValues------" << std::endl;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
index 79f7f2b6a1d1fc45217cf5e28df4f5b599f5c0e4..096bb424d19262186d9afb4f491b059be8e160a2 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
@@ -29,6 +29,7 @@ public:
 	void allocArrays_BoundaryValues() override;
 	void allocArrays_BoundaryQs() override;
     void allocArrays_OffsetScale() override;
+    void allocArrays_fluidNodeIndices() override;
 
 	virtual void setDimensions() override;
 	virtual void setBoundingBox() override;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
index 8e281818608ee3f7a222b5890d10bcae9544e9bf..c101b9295e4b261e5572775b37368a332d0c9a1e 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
@@ -2606,6 +2606,7 @@ void CudaMemoryManager::cudaFreeProcessNeighborADZ(int lev, unsigned int process
     checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->recvProcessNeighborADZ[processNeighbor].index  ));
     checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->recvProcessNeighborADZ[processNeighbor].f[0]     ));
 }
+
 void CudaMemoryManager::cudaAlloc2ndOrderDerivitivesIsoTest(int lev)
 {
     //Host
@@ -2644,9 +2645,27 @@ void CudaMemoryManager::cudaFree2ndOrderDerivitivesIsoTest(int lev)
     
 }
 
+void CudaMemoryManager::cudaAllocFluidNodeIndices(int lev) {
+    uint mem_size_geo_fluid_nodes = sizeof(uint) * parameter->getParH(lev)->numberOfFluidNodes;
+    // Host
+    checkCudaErrors(cudaMallocHost((void **)&(parameter->getParH(lev)->fluidNodeIndices), mem_size_geo_fluid_nodes));
+    // Device
+    checkCudaErrors(cudaMalloc((void **)&(parameter->getParD(lev)->fluidNodeIndices), mem_size_geo_fluid_nodes));
+    //////////////////////////////////////////////////////////////////////////
+    double tmp = (double)mem_size_geo_fluid_nodes;
+    setMemsizeGPU(tmp, false);
+}
 
+void CudaMemoryManager::cudaCopyFluidNodeIndices(int lev) {
+    uint mem_size_geo_fluid_nodes = sizeof(uint) * parameter->getParH(lev)->numberOfFluidNodes;
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->fluidNodeIndices,
+                               parameter->getParH(lev)->fluidNodeIndices,
+                               mem_size_geo_fluid_nodes, cudaMemcpyHostToDevice));
+}
 
-
+void CudaMemoryManager::cudaFreeFluidNodeIndices(int lev) {
+    checkCudaErrors(cudaFreeHost(parameter->getParH(lev)->fluidNodeIndices));
+}
 
 
 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
index 4853205f510348a954fbc8dcdaed72385a30d559..0588b2c3268b87664a5a4ce51d6de8bb16f580ed 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
@@ -323,7 +323,9 @@ public:
     void cudaFreeProcessNeighborADZ(int lev, unsigned int processNeighbor);
 
     
-    
+    void cudaAllocFluidNodeIndices(int lev);
+    void cudaCopyFluidNodeIndices(int lev);
+    void cudaFreeFluidNodeIndices(int lev);
     
     
     
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index b136ef7c6e2381dc42c1ed0b4bea79d138a11a3a..cbfc3072ac6b538efd36a91a50d53a5c39eb5aa7 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -86,6 +86,7 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std
 
    gridProvider->allocAndCopyForcing();
    gridProvider->allocAndCopyQuadricLimiters();
+   gridProvider->allocArrays_fluidNodeIndices();
    gridProvider->setDimensions();
    gridProvider->setBoundingBox();
 
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.cpp b/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.cpp
deleted file mode 100644
index 43884c93afb4108e9a0b1e08285be0b048dbacb3..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "NodeIndicesMultiGPU.h"
-
-NodeIndicesMultiGPU::NodeIndicesMultiGPU(const std::vector<uint> *geoFluidSizes,
-                                         const std::vector<const uint*> *geoFluidNodesIndices)
-{
-    this->geoFluidSizes = geoFluidSizes;
-    this->geoFluidNodeIndices = geoFluidNodesIndices;
-}
-
-uint NodeIndicesMultiGPU::getGeoFluidSize(uint level) 
-{ 
-    return (*this->geoFluidSizes)[level];
-}
-
-const uint* NodeIndicesMultiGPU::getGeoFluidNodeIndices(uint level)
-{
-    return (*this->geoFluidNodeIndices)[level];
-}
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h b/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h
deleted file mode 100644
index 817968f1b4a4c9a277ace3660cb6b94a69ab96eb..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef INDICES_MULTIGPU_H
-#define INDICES_MULTIGPU_H
-
-#include <vector>
-#include <memory>
-#include "basics/Core/DataTypes.h"
-
-class NodeIndicesMultiGPU
-{
-    const std::vector<uint> *geoFluidSizes;
-    const std::vector<const uint*> *geoFluidNodeIndices; 
-
-public:
-    NodeIndicesMultiGPU(const std::vector<uint> *geoFluidSizes, const std::vector<const uint*> * geoFluidNodes);
-
-    uint getGeoFluidSize(uint level);
-    const uint *getGeoFluidNodeIndices(uint level);
-};
-
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
index 1ce504c091f4ed75a6ed86dc8af34790765965c7..bf03b915e927ae484ac925eac968c9f5998f93a9 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
@@ -2485,15 +2485,4 @@ real Parameter::TrafoZtoMGsWorld(int CoordZ, int level)
 	return temp;
 }
 
-// CUDA Streams Multi GPU
-void Parameter::setNodeIndicesMultiGPU(std::shared_ptr<NodeIndicesMultiGPU> nodeIndicesMultiGPU)
-{
-    this->nodeIndicesMultiGPU = nodeIndicesMultiGPU;
-}
-
-std::shared_ptr<NodeIndicesMultiGPU> Parameter::getNodeIndicesMultiGPU()
-{
-    return this->nodeIndicesMultiGPU;
-}
-
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index 6665190a4023654f9ee4d0dc0d3f5fc675a7e6da..80b2fac298f6594f86fe34a1355c8ad594327908 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -41,8 +41,6 @@
 #include "LBM/D3Q27.h"
 #include "LBM/LB.h"
 
-#include "VirtualFluids_GPU/Parameter/NodeIndicesMultiGPU.h"
-
 #include "VirtualFluids_GPU_export.h"
 
 
@@ -309,6 +307,9 @@ struct LBMSimulationParameter
     std::vector<ProcessNeighborF3> recvProcessNeighborF3Y;
     std::vector<ProcessNeighborF3> recvProcessNeighborF3Z;
     ////////////////////////////////////////////////////////////////////////////
+
+    uint *fluidNodeIndices;
+    uint numberOfFluidNodes;
 };
 
 class VIRTUALFLUIDS_GPU_EXPORT Parameter
@@ -837,12 +838,6 @@ private:
     // initial condition
     std::function<void(real, real, real, real &, real &, real &, real &)> initialCondition;
 
-    
-    // CUDA Streams Multi GPU
-    std::shared_ptr<NodeIndicesMultiGPU> nodeIndicesMultiGPU;
-public:
-    void setNodeIndicesMultiGPU(std::shared_ptr<NodeIndicesMultiGPU> nodeIndicesMultiGPU);
-    std::shared_ptr<NodeIndicesMultiGPU> getNodeIndicesMultiGPU();
 };
 
 #endif