diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
index 093262f6a2c898937b57954bfb03e5a78c6f7b17..413f5cb58bc09d0408f62242bdb2c5e178bde3a3 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.cpp
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
@@ -81,7 +81,8 @@ void Geometry::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondi
 
         if (qFound)
         {
-            geometryBoundaryCondition->indices.push_back(i);
+            const int sparseIndex = grid->getSparseIndex(i);
+            geometryBoundaryCondition->indices.push_back(sparseIndex);
             geometryBoundaryCondition->qs.push_back(qNode);
         }
 
diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.h b/src/GridGenerator/grid/BoundaryConditions/Side.h
index 486e04ebe60946bf59416c7b5c59efb039eed64f..0bda143c07a05861c2db47b280b271832e19ca19 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.h
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.h
@@ -180,6 +180,8 @@ public:
             return SPtr<Side>(new MZ());
         case SideType::PZ:
             return SPtr<Side>(new PZ());
+        case SideType::GEOMETRY:
+            return SPtr<Side>(new Geometry());
         }
     }
 };
diff --git a/src/GridGenerator/grid/Field.cu b/src/GridGenerator/grid/Field.cu
index 27914835602a3c92a1d5a5c04cef730d11fdb0de..9d95db80bbebf9036ec69df1715a5faddd46709b 100644
--- a/src/GridGenerator/grid/Field.cu
+++ b/src/GridGenerator/grid/Field.cu
@@ -103,7 +103,7 @@ HOSTDEVICE bool Field::isQ(uint index) const
 
 HOSTDEVICE bool Field::isRb(uint index) const
 {
-    return field[index] == VELOCITY || field[index] == PRESSURE || field[index] == NOSLIP || field[index] == SOLID;
+    return  field[index] == SOLID;
 }
 
 // --------------------------------------------------------- //
diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index c3d05b330b72af30436cc2479b92200e1fff312a..bf41f6b01d8301c40bf4982a287f1da24f75aee6 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -67,9 +67,11 @@ public:
     HOST virtual void inital() = 0;
 
     HOST virtual void findGridInterface(SPtr<Grid> grid) = 0;
+
     HOST virtual void mesh(TriangularMesh& geometry) = 0;
     HOST virtual void mesh(Object* object) = 0;
 
+    HOST virtual void findQs(Object* object) = 0;
 
     HOST virtual void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) = 0;
     HOST virtual void setPeriodicityX(bool periodicity) = 0;
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 41f5b91d42456a240fefb8ade644a141b295a3a9..9d9558077695a59791289b134803a42e399ca9d8 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -362,7 +362,7 @@ void LevelGridBuilder::getGeometryQs(real* qs[27], int level) const
 {
     for (int i = 0; i < geometryBoundaryCondition->indices.size(); i++)
     {
-        for (int dir = 0; dir < grids[level]->getEndDirection(); dir++)
+        for (int dir = 0; dir <= grids[level]->getEndDirection(); dir++)
         {
             qs[dir][i] = geometryBoundaryCondition->qs[i][dir];
         }
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index abe7a26b6f92cdfd710f1253a470e94d796aa979..a035c655f71e3a0fc8ddb2b10d7582d0014ddda1 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -32,6 +32,8 @@ void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, r
 void MultipleGridBuilder::addGeometry(Object* solidObject)
 {
     this->solidObject = solidObject;
+    this->geometryBoundaryCondition = GeometryBoundaryCondition::make();
+    this->geometryBoundaryCondition->side = SideFactory::make(SideType::GEOMETRY);
 }
 
 void MultipleGridBuilder::addGeometry(Object* solidObject, uint level)
@@ -253,7 +255,11 @@ void MultipleGridBuilder::buildGrids()
     for (auto grid : grids)
         grid->inital();
 
-    //grids[grids.size()-1]->mesh(solidObject);
+    if (geometryBoundaryCondition)
+    {
+        grids[grids.size() - 1]->mesh(solidObject);
+        grids[grids.size() - 1]->findQs(solidObject);
+    }
 
     for (size_t i = 0; i < grids.size() - 1; i++)
         grids[i]->findGridInterface(grids[i + 1]);
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index e660e1170a1cc3b30393a8f145f0f464becb6c7c..c2fffa281f58cf928d39dd388a563cbcfa6fd9c6 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -559,6 +559,56 @@ HOSTDEVICE void GridImp::mesh(Triangle &triangle)
     }
 }
 
+
+
+HOST void GridImp::findQs(Object* object)
+{
+    TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object);
+    if (triangularMesh)
+        findQs(*triangularMesh);
+}
+
+HOST void GridImp::findQs(TriangularMesh &triangularMesh)
+{
+    const clock_t begin = clock();
+
+    gridStrategy->findQs(shared_from_this(), triangularMesh);
+
+    const clock_t end = clock();
+    const real time = (real)(real(end - begin) / CLOCKS_PER_SEC);
+
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "time finding qs: " << time << "s\n";
+}
+
+HOSTDEVICE void GridImp::findQs(Triangle &triangle)
+{
+    auto box = this->getBoundingBoxOnNodes(triangle);
+    triangle.initalLayerThickness(getDelta());
+
+    for (real x = box.minX; x <= box.maxX; x += delta)
+    {
+        for (real y = box.minY; y <= box.maxY; y += delta)
+        {
+            for (real z = box.minZ; z <= box.maxZ; z += delta)
+            {
+                const uint index = this->transCoordToIndex(x, y, z);
+                if (!field.isFluid(index))
+                    continue;
+
+                const Vertex point(x, y, z);
+                const int value = triangle.isUnderFace(point);
+
+                if (value == Q)
+                {
+                    field.setFieldEntry(index, Q);
+                    calculateQs(point, triangle);
+
+                }
+            }
+        }
+    }
+}
+
 HOSTDEVICE void GridImp::setDebugPoint(uint index, int pointValue)
 {
     if (field.isInvalid(index) && pointValue == SOLID)
@@ -590,7 +640,8 @@ HOSTDEVICE void GridImp::calculateQs(const Vertex &point, const Triangle &triang
             //solid_node = VertexInteger(actualPoint.x + direction.x, actualPoint.y + direction.y, actualPoint.z + direction.z);
             distribution.f[i*size + transCoordToIndex(point.x, point.y, point.z)] = subdistance;
             //printf("Q%d %d: %2.8f \n", i, grid.transCoordToIndex(actualPoint), grid.d.f[index]);
-        }
+        } else
+            distribution.f[i*size + transCoordToIndex(point.x, point.y, point.z)] = -1.0;
     }
 }
 
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 54c35239a6a1775d42cd844d633c647399d019fa..f5aa081decd09d6ac8b63542c826399f99b3ed5f 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -175,6 +175,10 @@ public:
     HOST void mesh(TriangularMesh &geometry) override;
     HOSTDEVICE void mesh(Triangle &triangle);
 
+
+    HOST void findQs(Object* object) override;
+    HOST void findQs(TriangularMesh &triangularMesh);
+    HOSTDEVICE void findQs(Triangle &triangle);
 private:
     HOSTDEVICE void setDebugPoint(uint index, int pointValue);
 	HOSTDEVICE void calculateQs(const Vertex &point, const Triangle &actualTriangle) const;
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index c87bd236329200f80ce9c0831b912863de11655e..badb10cb1fc2b6f8a9279f24946b642df7669d09 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -70,6 +70,7 @@ public:
     void setPeriodicityX(bool periodicity) override {}
     void setPeriodicityY(bool periodicity) override {}
     void setPeriodicityZ(bool periodicity) override {}
+    void findQs(Object* object) override {}
 };
 
 class GridStub : public GridDummy
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
index 8d55383fa68d5ca31ba74e245608f7d3ab3d762a..62bb2af88011aeb783045c8e122cf5d40945aeaa 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
@@ -76,6 +76,14 @@ void GridCpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom)
         grid->mesh(geom.triangles[i]);
 }
 
+void GridCpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom)
+{
+#pragma omp parallel for
+    for (int i = 0; i < geom.size; i++)
+        grid->findQs(geom.triangles[i]);
+}
+
+
 void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid)
 {
     const auto coarseLevel = grid->getLevel(1.0);
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
index 481c42ba23123c24a7ef5bf3751cef995d9ce993..c60aab8b218032b90bd85e3258295b09666e95a4 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
@@ -23,6 +23,7 @@ public:
     void findStopperNodes(SPtr<GridImp> grid) override;
 
     void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override;
+    void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override;
 
     void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) override;
 
diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp
index 6b7ee15e91723182b082fa0ac5d5d621cd3f9675..051b45a48945820821af2c4e6cbac26c983e066f 100644
--- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp
@@ -62,6 +62,13 @@ void GridGpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom)
 
 }
 
+
+void GridGpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom)
+{
+    
+}
+
+
 void GridGpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid)
 {
     copyAndFreeFieldFromGPU(grid->getField());
diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h
index 7925b2be843a47fcef16415fc40f1666bbaf03f7..0850c191a03b90235f6c75bbbc1d9d3d3cc99fc6 100644
--- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h
@@ -21,6 +21,9 @@ public:
     void findStopperNodes(SPtr<GridImp> grid) override;
 
     void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override;
+    void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override;
+
+
     void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) override;
 
     void freeMemory(SPtr<GridImp> grid) override;
diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategy.h b/src/GridGenerator/grid/GridStrategy/GridStrategy.h
index 6855eb6ea998d617bc5bc4b70ebad64ced4f32fa..0571a516d60ee8da5bf16031b31d6786ed9cf8e9 100644
--- a/src/GridGenerator/grid/GridStrategy/GridStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridStrategy.h
@@ -25,6 +25,8 @@ public:
 
     virtual void mesh(SPtr<GridImp> grid, TriangularMesh &geom) = 0;
 
+    virtual void findQs(SPtr<GridImp> grid, TriangularMesh &geom) = 0;
+
     virtual void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> finerGrid) = 0;
 
     virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) = 0;
diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h
index e494f816f594c88a51a39cc47c748462086746d0..8852c781075bfdc0c48fc6b65994299dd206643e 100644
--- a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h
+++ b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h
@@ -32,6 +32,7 @@ public:
     virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override {}
 
 
+    void findQs(SPtr<GridImp> grid, TriangularMesh& geom) override {};
 };
 
 #endif
diff --git a/src/GridGenerator/grid/NodeValues.h b/src/GridGenerator/grid/NodeValues.h
index 5fda00c32487345f07baa6c76101818a51ca9204..7c935abc6d18b78b4dc3a56b8846675d67b4ec0f 100644
--- a/src/GridGenerator/grid/NodeValues.h
+++ b/src/GridGenerator/grid/NodeValues.h
@@ -25,22 +25,7 @@
 
 
 
-#define Q 6
-#define NOSLIP 2
-#define PRESSURE 3
-#define VELOCITY 4
-
-
-
-
-#define RB_INLET PRESSURE
-#define RB_OUTLET PRESSURE
-
-#define RB_FRONT NOSLIP
-#define RB_BACK NOSLIP
-
-#define RB_BOTTOM NOSLIP
-#define RB_TOP NOSLIP
+#define Q 12
 
 
 #endif
diff --git a/src/VirtualFluids_GPU/LBM/Simulation.cpp b/src/VirtualFluids_GPU/LBM/Simulation.cpp
index 928fd1f210f729e3eca7488231241a4550ef827d..de51685302c78a2a00359f3cf7f09e09f198f864 100644
--- a/src/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -1429,12 +1429,12 @@ void Simulation::run()
 			//		para->getParD(0)->neighborX_SP,          para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
 			//		para->getParD(0)->size_Mat_SP,           para->getParD(0)->evenOrOdd);
 			//getLastCudaError("QDev27 execution failed");
-			//QDevComp27( para->getParD(0)->numberofthreads,       para->getParD(0)->nx,           para->getParD(0)->ny,
-			//			para->getParD(0)->d0SP.f[0],             para->getParD(0)->QGeom.k,		 para->getParD(0)->QGeom.q27[0], 
-			//			para->getParD(0)->QGeom.kQ,              para->getParD(0)->QGeom.kQ,     para->getParD(0)->omega,
-			//			para->getParD(0)->neighborX_SP,          para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
-			//			para->getParD(0)->size_Mat_SP,           para->getParD(0)->evenOrOdd);
-			//getLastCudaError("QDevComp27 (Geom) execution failed");
+			QDevComp27( para->getParD(0)->numberofthreads,       para->getParD(0)->nx,           para->getParD(0)->ny,
+						para->getParD(0)->d0SP.f[0],             para->getParD(0)->QGeom.k,		 para->getParD(0)->QGeom.q27[0], 
+						para->getParD(0)->QGeom.kQ,              para->getParD(0)->QGeom.kQ,     para->getParD(0)->omega,
+						para->getParD(0)->neighborX_SP,          para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
+						para->getParD(0)->size_Mat_SP,           para->getParD(0)->evenOrOdd);
+			getLastCudaError("QDevComp27 (Geom) execution failed");
 
 
 		//QPressDevOld27( para->getParD(0)->numberofthreads, para->getParD(0)->QPress.RhoBC, 
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index da032a4989b034a33ca1e19a5525a2fa97a5bf5f..2047c39e257038d472eedf951e5f1db1b8231d7f 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -270,13 +270,16 @@ void multipleLevel(const std::string& configPath)
     ////TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT);
 
 
-    gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0);
 
     //gridBuilder->addGrid(new Cuboid(-10, -8, -8, 50, 22, 22), 1);
 
-    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl");
+    //gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0);
+    //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl");
 
-    //gridBuilder->addGeometry(triangularMesh);
+    gridBuilder->addCoarseGrid(-10, -10, -10, 10, 10, 10, 0.25);
+    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/cubeBinaer1x1.stl");
+
+    gridBuilder->addGeometry(triangularMesh);
 
     gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.001, 0.0, 0.0);
     gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.001);
@@ -315,7 +318,7 @@ void multipleLevel(const std::string& configPath)
     gridBuilder->buildGrids();
     //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
 
-    //gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");
+    gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");