diff --git a/src/GridGenerator/geometries/Triangle/TriangleTest.cpp b/src/GridGenerator/geometries/Triangle/TriangleTest.cpp
index aabc83c8fbfa0dae5cd3b35ee8b41226da43867c..da300285e16c81504b4626a01476238525fb76c9 100644
--- a/src/GridGenerator/geometries/Triangle/TriangleTest.cpp
+++ b/src/GridGenerator/geometries/Triangle/TriangleTest.cpp
@@ -70,13 +70,13 @@ TEST(TriangleTest, getClosestPointsOnEdgesFromTriangle)
     EXPECT_TRUE(isP3OnEdge);
 }
 
-TEST(TriangleTest, PointIsNotWithinTriangle)
-{
-    Triangle t = Triangle(Vertex(0, 0, 0), Vertex(10, 0, 0), Vertex(0, 10, 0), Vertex(0, 0, 1));
-    Vertex P4 = Vertex(1, 1, -2);
-
-    EXPECT_FALSE(t.isNotNextToFace(P4));
-}
+//TEST(TriangleTest, PointIsNotWithinTriangle)
+//{
+//    Triangle t = Triangle(Vertex(0, 0, 0), Vertex(10, 0, 0), Vertex(0, 10, 0), Vertex(0, 0, 1));
+//    Vertex P4 = Vertex(1, 1, -2);
+//
+//    EXPECT_FALSE(t.isNotNextToFace(P4));
+//}
 
 TEST(TriangleTest, calculatePerpendicularPoint)
 {
diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
index 6cbee8a842aecad7c550618136db3c2bf3cfa65e..45b0bbbb009e635eaa0448c8f5b8ec78e9d5d703 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -49,7 +49,7 @@ public:
     virtual void writeSimulationFiles(std::string output, BoundingBox<int> &nodesDelete, bool writeFilesBinary, int level) = 0;
     virtual void writeArrows(std::string fileName, std::shared_ptr<ArrowTransformator> trans) const = 0;
 
-	virtual std::shared_ptr<Grid> getGrid(int level, int box) = 0;
+	virtual SPtr<Grid> getGrid(uint level) = 0;
 
     virtual void createBoundaryConditions() = 0;
     virtual std::vector<std::vector<std::vector<real> > > getQsValues() const = 0;
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 6e4ad2d1a8640c9287bbbbee10efac0a5eba507d..e0f0239418089512bab22ee073595b4ca564e105 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -36,7 +36,7 @@
 #define GEOFLUID 19
 #define GEOSOLID 16
 
-LevelGridBuilder::LevelGridBuilder()
+LevelGridBuilder::LevelGridBuilder(const std::string& device, const std::string& d3qxx) : device(device), d3qxx(d3qxx)
 {
     this->Qs.resize(QFILES);
     this->channelBoundaryConditions.resize(6);
@@ -48,6 +48,11 @@ LevelGridBuilder::LevelGridBuilder()
     channelBoundaryConditions[5] = "periodic";
 }
 
+std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(const std::string& device, const std::string& d3qxx)
+{
+    return SPtr<LevelGridBuilder>(new LevelGridBuilder(device, d3qxx));
+}
+
 
 void LevelGridBuilder::copyDataFromGpu()
 {
@@ -72,17 +77,36 @@ void LevelGridBuilder::verifyGridNeighbors()
     //    std::cout << grid->verifyNeighborIndices();
 }
 
-VF_PUBLIC void LevelGridBuilder::addGrid(real minX, real minY, real minZ, real maxX, real maxY, real maxZ, real delta, const std::string& device, const std::string& distribution, bool periodictyX, bool periodictyY, bool periodictyZ)
+void LevelGridBuilder::addGrid(real minX, real minY, real minZ, real maxX, real maxY, real maxZ, bool periodictyX, bool periodictyY, bool periodictyZ)
+{
+    const auto grid = GridFactory::makeGrid(minX, minY, minZ, maxX, maxY, maxZ, -1.0, device, d3qxx);
+    grid->setPeriodicity(periodictyX, periodictyY, periodictyZ);
+
+    grids.insert(grids.begin(), grid);
+}
+
+SPtr<Grid> LevelGridBuilder::getGrid(uint level)
+{
+    return grids[level];
+}
+
+void LevelGridBuilder::generateGrids()
+{
+
+}
+
+
+void LevelGridBuilder::addGrid(real minX, real minY, real minZ, real maxX, real maxY, real maxZ, real delta, const std::string& device, const std::string& distribution, bool periodictyX, bool periodictyY, bool periodictyZ)
 {
     const auto grid = GridFactory::makeGrid(minX, minY, minZ, maxX, maxY, maxZ, delta, device, distribution);
     grids.insert(grids.begin(), grid);
 
     grid->setPeriodicity(periodictyX, periodictyY, periodictyZ);
 
-
     this->removeOverlapNodes();
 }
 
+
 void LevelGridBuilder::getGridInformations(std::vector<int>& gridX, std::vector<int>& gridY,
     std::vector<int>& gridZ, std::vector<int>& distX, std::vector<int>& distY,
     std::vector<int>& distZ)
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 3cce3ec90e1e5f8a480771d1098e6401f5c2a518..fc3cfb1f7d56c13b32cc049e1389f7f0d48aba89 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -23,10 +23,14 @@ class BoundingBox;
 
 class LevelGridBuilder : public GridBuilder
 {
+private:
+    VF_PUBLIC LevelGridBuilder(const std::string& device, const std::string& d3qxx);
+
 public:
+    VF_PUBLIC static std::shared_ptr<LevelGridBuilder> makeShared(const std::string& device, const std::string& d3qxx);
 
-    VF_PUBLIC LevelGridBuilder();
-    VF_PUBLIC static std::shared_ptr<GridBuilder> make(std::string);
+    VF_PUBLIC void addGrid(real minX, real minY, real minZ, real maxX, real maxY, real maxZ, bool periodictyX, bool periodictyY, bool periodictyZ);
+    VF_PUBLIC SPtr<Grid> getGrid(uint level) override;
 
     VF_PUBLIC void copyDataFromGpu();
     VF_PUBLIC virtual ~LevelGridBuilder();
@@ -34,7 +38,7 @@ public:
 
     VF_PUBLIC virtual void addGrid(real minX, real minY, real minZ, real maxX, real maxY, real maxZ, real delta,
                                    const std::string& device, const std::string& distribution, bool periodictyX, bool periodictyY, bool periodictyZ);
-
+    VF_PUBLIC virtual void generateGrids();
 
     VF_PUBLIC virtual void meshGeometry(std::string input, int level);
     VF_PUBLIC virtual void deleteSolidNodes();
@@ -88,6 +92,11 @@ protected:
                     std::shared_ptr<const ArrowTransformator> trans/*, std::shared_ptr<PolyDataWriterWrapper> writer*/)
     const;
 
+private:
+
+    std::string device;
+    std::string d3qxx;
+
 public:
     VF_PUBLIC void getGridInformations(std::vector<int>& gridX, std::vector<int>& gridY,
                                        std::vector<int>& gridZ, std::vector<int>& distX, std::vector<int>& distY,
@@ -106,6 +115,7 @@ public:
 
     VF_PUBLIC void setOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) override;
     VF_PUBLIC void setOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) override;
+    
 };
 
 #endif
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilderTest.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilderTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..811882ba2540cdfa981d2c222bd68e21328ecf7b
--- /dev/null
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilderTest.cpp
@@ -0,0 +1,15 @@
+#include "gmock/gmock.h"
+
+//#include "LevelGridBuilder.h"
+//#include "../Grid.cuh"
+
+//TEST(LevelGridBuilderTest, addTwoGridsWithStartCoordinates_shouldMakeTheFistGridToLevel1)
+//{
+//    auto gridBuilder = LevelGridBuilder::makeShared("cpu", "D3Q27");
+//    gridBuilder->addGrid(12.0, 12.0, 12.0, 14.0, 14.0, 14.0, false, false, false);
+//    gridBuilder->addGrid(10.0, 10.0, 10.0, 20.0, 20.0, 20.0, true, true, true);
+//
+//    gridBuilder->generateGrids();
+//
+//    EXPECT_THAT(gridBuilder->getGrid(1)->startX, RealEq(12.25)); 
+//}
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4d808e1fb5423d3754765b5e0b59d7960c8ea252
--- /dev/null
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -0,0 +1,29 @@
+#include "MultipleGridBuilder.h"
+
+#include "../GridMocks.h"
+
+template<typename Grid>
+MultipleGridBuilder<Grid>::MultipleGridBuilder()
+{
+}
+
+template<typename Grid>
+SPtr<MultipleGridBuilder<Grid> > MultipleGridBuilder<Grid>::makeShared()
+{
+    return SPtr<MultipleGridBuilder>(new MultipleGridBuilder<Grid>());
+}
+
+template <typename Grid>
+void MultipleGridBuilder<Grid>::addGrid(real startX, real startY, real startZ, real endX, real endY, real endZ,
+    bool periodicityX, bool periodicityY, bool periodicityZ)
+{
+
+}
+
+template <typename Grid>
+uint MultipleGridBuilder<Grid>::getNumberOfLevels() const
+{
+    return 0;
+}
+
+template class MultipleGridBuilder<GridDummy>;
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
new file mode 100644
index 0000000000000000000000000000000000000000..8892966197747fbc94c0b9dd7ad50a600faaacf3
--- /dev/null
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
@@ -0,0 +1,26 @@
+#ifndef MULTIPLE_GRID_BUILDER_H
+#define MULTIPLE_GRID_BUILDER_H
+
+#include "GridGenerator/global.h"
+
+#include <vector>
+#include <string>
+#include <memory>
+
+template<typename Grid>
+class MultipleGridBuilder
+{
+private:
+    VF_PUBLIC MultipleGridBuilder();
+
+public:
+    VF_PUBLIC static SPtr<MultipleGridBuilder> makeShared();
+
+    VF_PUBLIC void addGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, bool periodicityX, bool periodicityY, bool periodicityZ);
+    VF_PUBLIC uint getNumberOfLevels() const;
+
+    
+};
+
+#endif
+
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5a2b25349f29fc313daba9daed68fb52a164e085
--- /dev/null
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp
@@ -0,0 +1,13 @@
+#include "gmock/gmock.h"
+
+#include "MultipleGridBuilder.h"
+#include "../GridMocks.h"
+
+TEST(MultipleGridBuilderTest, addOneGrid_numberOfLevelsShouldBeOne)
+{
+    auto gridBuilder = MultipleGridBuilder<GridDummy>::makeShared();
+
+    gridBuilder->addGrid(0.0, 0.0, 0.0, 10.0, 10.0, 10.0, true, true, true);
+
+    EXPECT_THAT(gridBuilder->getNumberOfLevels(), testing::Eq(1)); 
+}
\ No newline at end of file
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
new file mode 100644
index 0000000000000000000000000000000000000000..04517c6895138ccd3d817802c6b0cee24aba7e35
--- /dev/null
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -0,0 +1,11 @@
+#ifndef GRID_MOCKS_H
+#define GRID_MOCKS_H
+
+#include "GridGenerator/global.h"
+
+class GridDummy
+{
+    
+};
+
+#endif
diff --git a/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp b/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp
deleted file mode 100644
index 4a8e36b2a78669a2e27bf41a52b98d19697c76eb..0000000000000000000000000000000000000000
--- a/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-#include "GridWrapperCPU.h"
-
-#include <math.h>
-#include <time.h>
-#include <stdio.h>
-#include <omp.h>
-#include <stack>
-#include <vector>
-
-#include <GridGenerator/grid/NodeValues.h>
-#include <GridGenerator/grid/distributions/Distribution.h>
-      
-#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh>
-#include <GridGenerator/geometries/Triangle/Triangle.cuh>
-#include <GridGenerator/geometries/Geometry/Geometry.cuh>
-
-#include <utilities/logger/Logger.h>
-
-
-GridWrapperCPU::GridWrapperCPU(BoundingBox<int> &box, std::string direction)
-{
-    int nx = box.maxX - box.minX;
-    int ny = box.maxY - box.minY;
-    int nz = box.maxZ - box.minZ;
-    this->grid = Grid(NULL, box.minX, box.minY, box.minZ, nx, ny, nz, DistributionHelper::getDistribution(direction));
-	this->allocDistribution();
-	this->allocField();
-
-	float time = this->initalUniformGrid3d();
-    
-	*logging::out << logging::Logger::INTERMEDIATE << "Time CPU initial field: " + SSTR(time / 1000) + "sec\n";
-	*logging::out << logging::Logger::INTERMEDIATE << "-------------------------------------------\n";
-}
-
-GridWrapperCPU::GridWrapperCPU(uint minX, uint minY, uint minZ, uint maxX, uint maxY, uint maxZ, std::string d3Qxx)
-{
-    int nx = maxX - minX;
-    int ny = maxY - minY;
-    int nz = maxZ - minZ;
-    this->grid = Grid(NULL, minX, minY, minZ, nx, ny, nz, DistributionHelper::getDistribution(d3Qxx));
-    this->allocDistribution();
-    this->allocField();
-
-    float time = this->initalUniformGrid3d();
-
-    *logging::out << logging::Logger::INTERMEDIATE << "Time CPU initial field: " + SSTR(time / 1000) + "sec\n";
-    *logging::out << logging::Logger::INTERMEDIATE << "-------------------------------------------\n";
-}
-
-GridWrapperCPU::~GridWrapperCPU() 
-{
-    delete[] this->grid.field;
-
-    delete[] this->grid.neighborIndexX;
-    delete[] this->grid.neighborIndexY;
-    delete[] this->grid.neighborIndexZ;
-    delete[] this->grid.matrixIndex;
-
-    delete[] this->grid.d.f;
-}
-
-real GridWrapperCPU::initalUniformGrid3d()
-{
-	time_t begin = clock();
-
-	this->initialGridNodes();
-
-	time_t end = clock();
-	return (real)(real(end - begin) / CLOCKS_PER_SEC);
-}
-
-void GridWrapperCPU::initialGridNodes()
-{
-	#pragma omp parallel for
-    for (unsigned int index = 0; index < grid.size; index++)
-    {
-        grid.setNeighborIndices(index);
-        grid.matrixIndex[index] = index;
-        grid.setFieldEntryToFluid(index);
-    }
-}
-
-void GridWrapperCPU::meshGrid(Geometry &geom)
-{
-	clock_t begin = clock();
-    runMeshing(geom);
-	clock_t end = clock();
-    float time = (real)(real(end - begin) / CLOCKS_PER_SEC);
-
-	*logging::out << logging::Logger::INTERMEDIATE << "time grid generation: " + SSTR(time) + "s\n";
-}
-
-void GridWrapperCPU::deleteSolidNodes()
-{
-    clock_t begin = clock();
-
-    findInvalidNodes();
-    grid.removeInvalidNodes();
-    findNeighborIndices();
-
-    clock_t end = clock();
-    float time = (real)(real(end - begin) / CLOCKS_PER_SEC);
-    *logging::out << logging::Logger::INTERMEDIATE << "time delete solid nodes: " + SSTR(time / 1000) + "sec\n";
-}
-
-void GridWrapperCPU::allocDistribution()
-{
-	unsigned long distributionSize = grid.size * (grid.d.dir_end + 1);
-	real sizeInMB = distributionSize * sizeof(real) / (1024.f*1024.f);
-
-	*logging::out << logging::Logger::INTERMEDIATE << "Allocating " + SSTR(sizeInMB) + " [MB] host memory for distributions.\n";
-
-	this->grid.d.f = new real[distributionSize](); // automatic initialized with zeros
-}
-
-void GridWrapperCPU::allocField()
-{
-	*logging::out << logging::Logger::INTERMEDIATE << "-------------------------------------------\n";
-	*logging::out << logging::Logger::INTERMEDIATE << "Initial field with fluid: \n";
-	*logging::out << logging::Logger::INTERMEDIATE << "Field offset: " + SSTR(grid.startX) + ", " + SSTR(grid.startY) + ", " + SSTR(grid.startZ) + "\n";
-	*logging::out << logging::Logger::INTERMEDIATE << "Field dimension: " + SSTR(grid.nx) + ", " + SSTR(grid.ny) + ", " + SSTR(grid.nz) + "\n";
-	*logging::out << logging::Logger::INTERMEDIATE << "Number of Nodes: " + SSTR(grid.size) + "\n";
-
-	this->grid.field = new char[this->grid.size];
-
-    this->grid.neighborIndexX = new int[this->grid.size];
-    this->grid.neighborIndexY = new int[this->grid.size];
-    this->grid.neighborIndexZ = new int[this->grid.size];
-
-    this->grid.matrixIndex = new unsigned int[this->grid.size];
-}
-
-void GridWrapperCPU::runMeshing(const Geometry &geom)
-{   
-    #pragma omp parallel for
-	for (int i = 0; i < geom.size; i++)
-		grid.meshTriangle(geom.triangles[i]);
-}
-
-
-void GridWrapperCPU::floodFill(const Vertex &startPoint)
-{
-    printf("start flood...\n");
-	Vertex v(startPoint);
-    std::stack<Vertex> floodFillStack;
-    floodFillStack.push(v);
-
-    while (!floodFillStack.empty())
-	{
-		v = floodFillStack.top();
-        floodFillStack.pop();
-
-        unsigned int x = (unsigned int)floor(v.x);
-        unsigned int y = (unsigned int)floor(v.y);
-        unsigned int z = (unsigned int)floor(v.z);
-
-        int index = this->grid.transCoordToIndex(x, y, z);
-        if (this->grid.isFluid(index))
-		{
-			this->grid.setFieldEntryToSolid(index);
-            floodFillStack.push(Vertex(x, y, z + 1));
-            floodFillStack.push(Vertex(x, y, z - 1));
-            floodFillStack.push(Vertex(x, y + 1, z));
-            floodFillStack.push(Vertex(x, y - 1, z));
-            floodFillStack.push(Vertex(x + 1, y, z));
-            floodFillStack.push(Vertex(x - 1, y, z));
-        }
-    }
-    printf("...end flood\n");
-}
-
-void GridWrapperCPU::findInvalidNodes()
-{
-    bool foundInvalidNode = true;
-    while (foundInvalidNode)
-    {
-        foundInvalidNode = false;
-        for (int index = 0; index < grid.size; index++)
-            grid.setInvalidNode(index, foundInvalidNode);
-    }
-}
-
-void GridWrapperCPU::findNeighborIndices()
-{
-    for (int index = 0; index < grid.reducedSize; index++) 
-        grid.findNeighborIndex(index);
-}
diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
index 0026ddf845baba534b580b77ba73d066146b2a16..731803c7920676a14ded21ae7728030d5b522fd6 100644
--- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
+++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
@@ -173,7 +173,7 @@ void SimulationFileWriter::writeCoordFiles(SPtr<GridBuilder> builder, uint level
 
 void SimulationFileWriter::writeCoordsNeighborsGeo(SPtr<GridBuilder> builder, int index, uint level, FILEFORMAT format)
 {
-    SPtr<Grid> grid = builder->getGrid(level, 0);
+    SPtr<Grid> grid = builder->getGrid(level);
     if (grid->matrixIndex[index] == -1)
         return;
 
diff --git a/src/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
index 753d96653e959e4696de400d121e5bad951be0db..3570d36fc9fea8399ac68e58433b47b121f6df09 100644
--- a/src/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
+++ b/src/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
@@ -624,16 +624,16 @@ void updateGrid27(Parameter* para, Communicator* comm, PorousMedia** pm, int lev
 			//				para->getParD(level)->size_Mat_SP,     para->getParD(level)->evenOrOdd);
 			//getLastCudaError("QVelDevComp27 execution failed");
 
-        if (para->getParD(level)->kInflowQ > 0)
-        {
-            QVelDevCompZeroPress27(para->getParD(level)->numberofthreads, para->getParD(level)->nx, para->getParD(level)->ny,
-                para->getParD(level)->Qinflow.Vx, para->getParD(level)->Qinflow.Vy, para->getParD(level)->Qinflow.Vz,
-                para->getParD(level)->d0SP.f[0], para->getParD(level)->Qinflow.k, para->getParD(level)->Qinflow.q27[0],
-                para->getParD(level)->kInflowQ, para->getParD(level)->Qinflow.kArray, para->getParD(level)->omega,
-                para->getParD(level)->neighborX_SP, para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
-                para->getParD(level)->size_Mat_SP, para->getParD(level)->evenOrOdd);
-            getLastCudaError("QVelDevCompZeroPress27 execution failed");
-        }
+        //if (para->getParD(level)->kInflowQ > 0)
+        //{
+        //    QVelDevCompZeroPress27(para->getParD(level)->numberofthreads, para->getParD(level)->nx, para->getParD(level)->ny,
+        //        para->getParD(level)->Qinflow.Vx, para->getParD(level)->Qinflow.Vy, para->getParD(level)->Qinflow.Vz,
+        //        para->getParD(level)->d0SP.f[0], para->getParD(level)->Qinflow.k, para->getParD(level)->Qinflow.q27[0],
+        //        para->getParD(level)->kInflowQ, para->getParD(level)->Qinflow.kArray, para->getParD(level)->omega,
+        //        para->getParD(level)->neighborX_SP, para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
+        //        para->getParD(level)->size_Mat_SP, para->getParD(level)->evenOrOdd);
+        //    getLastCudaError("QVelDevCompZeroPress27 execution failed");
+        //}
 			//QVelDevCompZeroPress27(  para->getParD(level)->numberofthreads, para->getParD(level)->nx,           para->getParD(level)->ny,
 			//						 para->getParD(level)->Qinflow.Vx,      para->getParD(level)->Qinflow.Vy,   para->getParD(level)->Qinflow.Vz,
 			//						 para->getParD(level)->d0SP.f[0],       para->getParD(level)->Qinflow.k,    para->getParD(level)->Qinflow.q27[0], 
@@ -674,28 +674,28 @@ void updateGrid27(Parameter* para, Communicator* comm, PorousMedia** pm, int lev
 		  //		 para->getParD(level)->size_Mat_SP,           para->getParD(level)->evenOrOdd);
 		  //getLastCudaError("QDev27 (Geom) execution failed");
 
-		 if (para->getParD(level)->QGeom.kQ > 0)
-		 {
-			  QDevComp27(para->getParD(level)->numberofthreads,       para->getParD(level)->nx,           para->getParD(level)->ny,
-		  				 para->getParD(level)->d0SP.f[0],             para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
-		  				 para->getParD(level)->QGeom.kQ,              para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
-		  				 para->getParD(level)->neighborX_SP,          para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
-		  				 para->getParD(level)->size_Mat_SP,           para->getParD(level)->evenOrOdd);
-			  getLastCudaError("QDevComp27 (Geom) execution failed");
-			  //QDev3rdMomentsComp27(  para->getParD(level)->numberofthreads,       para->getParD(level)->nx,           para->getParD(level)->ny,
-		  	//						 para->getParD(level)->d0SP.f[0],             para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
-		  	//						 para->getParD(level)->QGeom.kQ,              para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
-		  	//						 para->getParD(level)->neighborX_SP,          para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
-		  	//						 para->getParD(level)->size_Mat_SP,           para->getParD(level)->evenOrOdd);
-			  //getLastCudaError("QDev3rdMomentsComp27 (Geom) execution failed");
-		   //   QVelDevCompZeroPress27(para->getParD(level)->numberofthreads, para->getParD(level)->nx,           para->getParD(level)->ny,
-					//				 para->getParD(level)->QGeom.Vx,        para->getParD(level)->QGeom.Vy,     para->getParD(level)->QGeom.Vz,
-					//				 para->getParD(level)->d0SP.f[0],       para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
-					//				 para->getParD(level)->QGeom.kQ,        para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
-					//				 para->getParD(level)->neighborX_SP,    para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
-					//				 para->getParD(level)->size_Mat_SP,     para->getParD(level)->evenOrOdd);
-		   //   getLastCudaError("QVelDevCompZeroPress27 execution failed");
-		 }
+		 //if (para->getParD(level)->QGeom.kQ > 0)
+		 //{
+			//  QDevComp27(para->getParD(level)->numberofthreads,       para->getParD(level)->nx,           para->getParD(level)->ny,
+		 // 				 para->getParD(level)->d0SP.f[0],             para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
+		 // 				 para->getParD(level)->QGeom.kQ,              para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
+		 // 				 para->getParD(level)->neighborX_SP,          para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
+		 // 				 para->getParD(level)->size_Mat_SP,           para->getParD(level)->evenOrOdd);
+			//  getLastCudaError("QDevComp27 (Geom) execution failed");
+			//  //QDev3rdMomentsComp27(  para->getParD(level)->numberofthreads,       para->getParD(level)->nx,           para->getParD(level)->ny,
+		 // 	//						 para->getParD(level)->d0SP.f[0],             para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
+		 // 	//						 para->getParD(level)->QGeom.kQ,              para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
+		 // 	//						 para->getParD(level)->neighborX_SP,          para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
+		 // 	//						 para->getParD(level)->size_Mat_SP,           para->getParD(level)->evenOrOdd);
+			//  //getLastCudaError("QDev3rdMomentsComp27 (Geom) execution failed");
+		 //  //   QVelDevCompZeroPress27(para->getParD(level)->numberofthreads, para->getParD(level)->nx,           para->getParD(level)->ny,
+			//		//				 para->getParD(level)->QGeom.Vx,        para->getParD(level)->QGeom.Vy,     para->getParD(level)->QGeom.Vz,
+			//		//				 para->getParD(level)->d0SP.f[0],       para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
+			//		//				 para->getParD(level)->QGeom.kQ,        para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
+			//		//				 para->getParD(level)->neighborX_SP,    para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP,
+			//		//				 para->getParD(level)->size_Mat_SP,     para->getParD(level)->evenOrOdd);
+		 //  //   getLastCudaError("QVelDevCompZeroPress27 execution failed");
+		 //}
 		  //QDevComp27(para->getParD(level)->numberofthreads,       para->getParD(level)->nx,           para->getParD(level)->ny,
 		  //			 para->getParD(level)->d0SP.f[0],             para->getParD(level)->QGeom.k,      para->getParD(level)->QGeom.q27[0], 
 		  //			 para->getParD(level)->QGeom.kQ,              para->getParD(level)->QGeom.kQ,     para->getParD(level)->omega,
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index a021bce38ed481b0a62e31c1ef52a68deaed4efe..f9e1340b7df58579e052c582791789d972664071 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -223,7 +223,7 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
     para->setGridZ(StringUtil::toVector(input->getValue("GridZ")));                  
     para->setDistX(StringUtil::toVector(input->getValue("DistX")));                  
     para->setDistY(StringUtil::toVector(input->getValue("DistY")));                  
-    para->setDistZ(StringUtil::toVector(input->getValue("DistZ")));         */         
+    para->setDistZ(StringUtil::toVector(input->getValue("DistZ")));      */            
 
     para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
 }
@@ -232,15 +232,17 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
 
 void multipleLevel(const std::string& configPath)
 {
-    SPtr<LevelGridBuilder> gridBuilder(new LevelGridBuilder());
-    //gridBuilder->addGrid(12.4375, 12.4375, 12.4375, 14.5625, 14.5625, 14.5625, 0.125, "cpu", "D3Q27", false, false, false);
-    //gridBuilder->addGrid(10.375, 10.375, 10.375, 20.625, 20.625, 20.625, 0.25, "cpu", "D3Q27", false, false, false);
-    gridBuilder->addGrid(5.25, 5.25, 5.25, 24.75, 24.75, 24.75, 0.5, "cpu", "D3Q27", false, false, false);
-    gridBuilder->addGrid(0.0, 0.0, 0.0, 30.0, 30.0, 30.0, 1.0, "cpu", "D3Q27", true, true, true);
-
-    //gridBuilder->addGrid(40.4375, 40.4375, 40.4375, 60.5625, 60.5625, 60.5625, 0.125, "cpu", "D3Q27");
+    auto gridBuilder = LevelGridBuilder::makeShared("cpu", "D3Q27");
+    //gridBuilder->addGrid(14.4921875, 14.4921875, 14.4921875, 16.5078125, 16.5078125, 16.5078125, 0.015625, "cpu", "D3Q27", false, false, false);
+    //gridBuilder->addGrid(13.984375, 13.984375, 13.984375, 17.015625, 17.015625, 17.015625, 0.03125, "cpu", "D3Q27", false, false, false);
+    //gridBuilder->addGrid(13.46875, 13.46875, 13.46875, 17.53125, 17.53125, 17.53125, 0.0625, "cpu", "D3Q27", false, false, false);
+    gridBuilder->addGrid(12.4375, 12.4375, 12.4375, 18.5625, 18.5625, 18.5625, 0.125, "gpu", "D3Q27", false, false, false);
+    gridBuilder->addGrid(10.375, 10.375, 10.375, 20.625, 20.625, 20.625, 0.25, "gpu", "D3Q27", false, false, false);
+    gridBuilder->addGrid(5.25, 5.25, 5.25, 24.75, 24.75, 24.75, 0.5, "gpu", "D3Q27", false, false, false);
+    gridBuilder->addGrid(0.0, 0.0, 0.0, 30.0, 30.0, 30.0, 1.0, "gpu", "D3Q27", true, true, true);
 
 
+    gridBuilder->copyDataFromGpu();
     //SimulationFileWriter::write("D:/GRIDGENERATION/couplingVF/periodicTaylorThreeLevel/simu/", gridBuilder, FILEFORMAT::ASCII);
 
     //gridBuilder->meshGeometry("D:/GRIDGENERATION/STL/circleBinaer.stl", 1);
@@ -267,40 +269,6 @@ void multipleLevel(const std::string& configPath)
     sim.run();
 }
 
-void simulate(const std::string& configPath)
-{
-    SPtr<LevelGridBuilder> builder(new LevelGridBuilder());
-
-
-    SPtr<Parameter> para = Parameter::makeShared();
-    SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(builder, para);
-    //std::shared_ptr<GridProvider> reader = GridProvider::makeGridReader(true, para);
-
-    std::ifstream stream;
-    stream.open(configPath.c_str(), std::ios::in);
-    if (stream.fail())
-        throw "can not open config file!\n";
-
-    UPtr<input::Input> input = input::Input::makeInput(stream, "config");
-
-    setParameters(para, input);
-
-    SPtr<Transformator> trans(new TransformatorImp());
-    //builder->addGrid(para->getGridX()[0], para->getGridY()[0], para->getGridZ()[0], 1.0, "D3Q27", trans);
-
-    SPtr<Transformator> transRefine1(new TransformatorImp(para->getDistX()[1], para->getDistY()[1], para->getDistZ()[1], 0.5));
-    //builder->addGrid(para->getGridX()[1], para->getGridY()[1], para->getGridZ()[1], 1.0, "D3Q27", transRefine1);
-
-    //builder->getGridWrapper(0, 0)->copyDataFromGPU();
-    //builder->getGridWrapper(1, 0)->copyDataFromGPU();
-
-    //GridVTKWriter::writeSparseGridToVTK(builder->getGridWrapper(0, 0)->grid, "D:/GRIDGENERATION/couplingVF/periodicTaylor/testFile", trans);
-    SimulationFileWriter::write("D:/GRIDGENERATION/couplingVF/periodicTaylor/simuFiles/", builder, FILEFORMAT::ASCII);
-
-    Simulation sim;
-    sim.init(para, gridGenerator);
-    sim.run();
-}
 
 int main( int argc, char* argv[])
 {