diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
index e3b79186193243090f77b6167b740675e9678ed7..b44f5f5fddb8c04c8d07b80e6a39d70af8644404 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -32,6 +32,11 @@ class BoundingBox;
 class GridBuilder
 {
 public:
+    enum class GenerationDevice
+    {
+        CPU, GPU
+    };
+
     virtual VF_PUBLIC ~GridBuilder() {};
 
     virtual void addGrid(real length, real width, real high, real delta, std::string distribution, std::shared_ptr<Transformator> trans) = 0;
@@ -45,7 +50,7 @@ public:
     virtual void writeArrows(std::string fileName, std::shared_ptr<ArrowTransformator> trans) const = 0;
 
 
-	virtual std::shared_ptr<GridWrapper> getKernel(int level, int box) = 0;
+	virtual std::shared_ptr<GridWrapper> getGridWrapper(int level, int box) = 0;
 
     virtual void createBoundaryConditions() = 0;
 
diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp
index b12ad64326fbe37b5c36cdc5183f710746aa9626..656b1d3a46b1df6c7a5d2b1c7d4cede7a51fc043 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.cpp
@@ -55,7 +55,8 @@ void deserialize(GeometryMemento &memento, const std::string &filename)
 #define GEOFLUID 19
 #define GEOSOLID 16
 
-GridBuilderImp::GridBuilderImp()
+
+GridBuilderImp::GridBuilderImp(GenerationDevice device) : device(device)
 {
     this->Qs.resize(QFILES);
     this->channelBoundaryConditions.resize(6);
@@ -67,13 +68,6 @@ GridBuilderImp::GridBuilderImp()
     channelBoundaryConditions[5] = "periodic";
 }
 
-std::shared_ptr<GridBuilder> GridBuilderImp::make(std::string type)
-{
-    if (type == "cpu")
-        return std::shared_ptr<GridBuilder>(new GridCpuBuilder());
-    else
-        return std::shared_ptr<GridBuilder>(new GridGpuBuilder());
-}
 
 GridBuilderImp::~GridBuilderImp()
 {
@@ -191,7 +185,7 @@ void GridBuilderImp::writeSimulationFiles(std::string output, BoundingBox<int> &
     //SimulationFileWriter::writeSimulationFiles(output, coords, qs, writeFilesBinary, this->gridKernels[level]->grid, this->transformators[level]);
 }
 
-std::shared_ptr<GridWrapper> GridBuilderImp::getKernel(int level, int box)
+std::shared_ptr<GridWrapper> GridBuilderImp::getGridWrapper(int level, int box)
 {
     return this->gridKernels[level][box];
 }
@@ -221,6 +215,26 @@ void GridBuilderImp::addGrid(real length, real width, real high, real delta, std
     this->createGridKernels(distribution);
 }
 
+void GridBuilderImp::createGridKernels(std::string distribution)
+{
+    for (int i = 0; i < rankTasks.size(); i += 2)
+    {
+        int level = rankTasks[i];
+        int index = rankTasks[i + 1];
+
+        switch (this->device)
+        {
+        case GenerationDevice::CPU:
+            this->gridKernels[level][index] = std::shared_ptr<GridWrapperCPU>(new GridWrapperCPU(this->boxes[level][index], distribution));
+            break;
+        case GenerationDevice::GPU:
+            this->gridKernels[level][index] = std::shared_ptr<GridWrapperGPU>(new GridWrapperGPU(this->boxes[level][index], distribution));
+            break;
+        }
+    }
+}
+
+
 void GridBuilderImp::setNumberOfNodes(real length, real width, real high, real delta)
 {
     int nx = (int)(length / delta);
@@ -354,7 +368,7 @@ void GridBuilderImp::getNodeValues(real *xCoords, real *yCoords, real *zCoords,
         neighborX[i + 1] = (unsigned int)(grid.neighborIndexX[grid.matrixIndex[i]] + 1);
         neighborY[i + 1] = (unsigned int)(grid.neighborIndexY[grid.matrixIndex[i]] + 1);
         neighborZ[i + 1] = (unsigned int)(grid.neighborIndexZ[grid.matrixIndex[i]] + 1);
-        geo[i + 1] = (unsigned int)grid.field[grid.matrixIndex[i]] == SOLID ? GEOSOLID : GEOFLUID;
+        geo[i + 1] = (unsigned int)grid.isSolid(grid.matrixIndex[i]) ? GEOSOLID : GEOFLUID;
     }
 }
 
diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h
index 1a41f211e4d919f2409754193878bf9cf20fa853..39b9d08900babd3c8a2508c5492f189f5b1df23c 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilderImp.h
@@ -23,6 +23,8 @@ class BoundingBox;
 class GridBuilderImp : public GridBuilder
 {
 public:
+
+    VF_PUBLIC GridBuilderImp(GenerationDevice device);
     VF_PUBLIC static std::shared_ptr<GridBuilder> make(std::string);
 
     VF_PUBLIC virtual ~GridBuilderImp();
@@ -37,7 +39,7 @@ public:
 	VF_PUBLIC virtual void writeGridToVTK(std::string output, int level);
 	VF_PUBLIC virtual void writeSimulationFiles(std::string output, BoundingBox<int> &nodesDelete, bool writeFilesBinary, int level);
 
-	VF_PUBLIC virtual std::shared_ptr<GridWrapper> getKernel(int level, int box);
+	VF_PUBLIC virtual std::shared_ptr<GridWrapper> getGridWrapper(int level, int box);
 
     VF_PUBLIC virtual void createBoundaryConditions();
 
@@ -58,7 +60,7 @@ public:
     VF_PUBLIC void writeArrows(std::string fileName, std::shared_ptr<ArrowTransformator> trans) const;
 
 protected:
-    GridBuilderImp();
+    GenerationDevice device;
 
     std::vector<std::vector<std::shared_ptr<GridWrapper> > >gridKernels;
     std::vector<std::shared_ptr<Transformator>> transformators;
@@ -73,7 +75,7 @@ protected:
     void checkLevel(int level);
 
 protected:
-    virtual void createGridKernels(std::string distribution) = 0;
+    virtual void createGridKernels(std::string distribution);
 
     void setNumberOfNodes(real length, real width, real high, real delta);
     void printMasterInformation(int nx, int ny, int nz);
diff --git a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.cpp b/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.cpp
deleted file mode 100644
index d1fc909a72015a59d25bff51069d7aa162e6e487..0000000000000000000000000000000000000000
--- a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "GridCpuBuilder.h"
-
-#include <GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.h>
-#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh>
-
-
-GridCpuBuilder::GridCpuBuilder() : GridBuilderImp()
-{
-
-}
-
-GridCpuBuilder::~GridCpuBuilder()
-{
-
-}
-
-void GridCpuBuilder::createGridKernels(std::string distribution)
-{
-    for (int i = 0; i < rankTasks.size(); i += 2)
-    {
-        int level = rankTasks[i];
-        int index = rankTasks[i + 1];
-        this->gridKernels[level][index] = std::shared_ptr<GridWrapperCPU>(new GridWrapperCPU(this->boxes[level][index], distribution));
-    }
-}
diff --git a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.h b/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.h
deleted file mode 100644
index 50203966ef456a6ced31da2c1b139e147bfe1205..0000000000000000000000000000000000000000
--- a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/GridCpuBuilder.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef GridCpuBuilder_H
-#define GridCpuBuilder_H
-
-#include "GridGenerator/global.h"
-
-
-#include <vector>
-#include <string>
-#include <memory>
-
-#include "../GridBuilderImp.h"
-
-
-class GridCpuBuilder : public GridBuilderImp
-{
-public:
-    VF_PUBLIC GridCpuBuilder();
-    virtual VF_PUBLIC ~GridCpuBuilder();
-
-protected:
-    void createGridKernels(std::string distribution);
-
-};
-
-#endif
-
diff --git a/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/package.include b/src/GridGenerator/grid/GridBuilder/GridCpuBuilder/package.include
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.cpp b/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.cpp
deleted file mode 100644
index f267cdadc823f0689db4efe2ea6e36505675495c..0000000000000000000000000000000000000000
--- a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "GridGpuBuilder.h"
-
-#include <GridGenerator/grid/GridWrapper/GridWrapperGPU/GridWrapperGPU.h>
-#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh>
-
-
-GridGpuBuilder::GridGpuBuilder() : GridBuilderImp()
-{
-
-}
-
-GridGpuBuilder::~GridGpuBuilder()
-{
-
-}
-
-void GridGpuBuilder::createGridKernels(std::string distribution)
-{
-    for (int i = 0; i < rankTasks.size(); i += 2)
-    {
-        int level = rankTasks[i];
-        int index = rankTasks[i + 1];
-        this->gridKernels[level][index] = std::shared_ptr<GridWrapperGPU>(new GridWrapperGPU(this->boxes[level][index], distribution));
-    }
-}
diff --git a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.h b/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.h
deleted file mode 100644
index 5e6935d9a9db3ba1809444c92c715d156ca93cc8..0000000000000000000000000000000000000000
--- a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/GridGpuBuilder.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef GridGpuBuilder_H
-#define GridGpuBuilder_H
-
-#include "GridGenerator/global.h"
-
-
-#include <vector>
-#include <string>
-#include <memory>
-
-#include "../GridBuilderImp.h"
-
-
-class GridGpuBuilder : public GridBuilderImp
-{
-public:
-	VF_PUBLIC GridGpuBuilder();
-	virtual VF_PUBLIC ~GridGpuBuilder();
-
-protected:
-    void createGridKernels(std::string distribution);
-
-};
-
-#endif
-
diff --git a/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/package.include b/src/GridGenerator/grid/GridBuilder/GridGpuBuilder/package.include
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp b/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp
index b9de5d408ff92b27247e8faad4067268977e5162..1697423206a0b08c5092e1fbdc255e12570ae8af 100644
--- a/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp
+++ b/src/GridGenerator/grid/GridWrapper/GridWrapperCPU/GridWrapperCPU.cpp
@@ -165,9 +165,8 @@ void GridWrapperCPU::findInvalidNodes()
     }
 }
 
-
 void GridWrapperCPU::findNeighborIndices()
 {
     for (int index = 0; index < grid.reducedSize; index++) 
         grid.findNeighborIndex(index);
-}
\ No newline at end of file
+}
diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
index c6d5e516d8ffb711524d86f789b85c8899d27533..e0661f340d5e1c918474830e599851055061a741 100644
--- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
+++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
@@ -121,7 +121,7 @@ void SimulationFileWriter::writeLevelAndLevelSize(int sizeCoords, std::vector<st
 
 void SimulationFileWriter::writeCoordsNeighborsGeo(const int& i, bool binaer, std::shared_ptr<GridBuilder> builder, std::shared_ptr<Transformator> trans)
 {
-    Grid grid = builder->getKernel(0, 0)->grid;
+    Grid grid = builder->getGridWrapper(0, 0)->grid;
     int index = grid.matrixIndex[i];
 
     int type = grid.field[index] == SOLID ? 16 : 1;
diff --git a/src/GridGenerator/utilities/cuda/cudaDefines.h b/src/GridGenerator/utilities/cuda/cudaDefines.h
index 25b6c558e6903087a879b3eefefe31466608f5ea..ccfe3de5e4c87904e4e335bdf697444521e98dcc 100644
--- a/src/GridGenerator/utilities/cuda/cudaDefines.h
+++ b/src/GridGenerator/utilities/cuda/cudaDefines.h
@@ -9,6 +9,7 @@
 #define GLOBAL __global__
 #define CONSTANT __constant__
 
+
 #define HOSTDEVICE HOST DEVICE
 
 
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index ea192e2b9f8c63ff8a03a731287a9663e82303ed..1cc69ebee8ea78e3593e3e5b985928d1f90b97a7 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -20,6 +20,7 @@
 #include "io/GridVTKWriter/GridVTKWriter.h"
 #include "grid/GridWrapper/GridWrapper.h"
 #include "io/SimulationFileWriter/SimulationFileWriter.h"
+#include "VirtualFluidsBasics/numerics/geometry3d/GbCuboid3D.h"
 
 
 std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
@@ -223,11 +224,40 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
     para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
 }
 
+
+
+void multipleLevel(const std::string& configPath)
+{
+
+    SPtr<GbCuboid3D> level0(new GbCuboid3D(0.0, 0.0, 0.0, 64.0, 12.0, 96.0));
+    SPtr<GbCuboid3D> level1(new GbCuboid3D(20.0, 4.0, 40.0, 40.0, 8.0, 60.0));
+
+    SPtr<GridBuilder> builder(new GridBuilderImp(GridBuilder::CPU));
+    builder->addGrid(level0, "D3Q27");
+    builder->addGrid(level1, "D3Q27");
+
+
+    SPtr<Parameter> para = Parameter::make();
+    SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(builder, 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);
+
+    Simulation sim;
+    sim.init(para, gridGenerator);
+    sim.run();
+}
+
 void simulate(const std::string& configPath)
 {
     SPtr<GridBuilder> builder = GridBuilderImp::make("gpu");
 
-
     SPtr<Parameter> para = Parameter::make();
     SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(builder, para);
     //std::shared_ptr<GridProvider> reader = GridProvider::makeGridReader(true, para);
@@ -243,9 +273,14 @@ void simulate(const std::string& configPath)
 
     SPtr<Transformator> trans(new TransformatorImp());
     builder->addGrid(para->getGridX()[0], para->getGridY()[0], para->getGridZ()[0], 1.0, "D3Q27", trans);
-    builder->getKernel(0, 0)->copyDataFromGPU();
 
-    GridVTKWriter::writeSparseGridToVTK(builder->getKernel(0, 0)->grid, "D:/GRIDGENERATION/couplingVF/periodicTaylor/testFile", 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::writeSimulationFiles("D:/GRIDGENERATION/couplingVF/periodicTaylor/simuFiles/", builder, false, trans);
 
     Simulation sim;