diff --git a/.gitignore b/.gitignore
index 6f31401f787928dc3bb3e2622578f889336d1d92..d87980fd00fb59300f8fbdc27a055e9854a4d6d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 build/
 .vscode/
+MSVC2017/
diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
index aba9b4e7ee1cbb218d0fa4525e08ba3b3d1c6d78..d2d14884abdad0791540652d524d725d341d1ecb 100644
--- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
@@ -32,15 +32,9 @@ TriangularMesh::TriangularMesh(const std::string& inputPath)
     this->triangleVec = STLReader::readSTL(inputPath);
     initalizeDataFromTriangles();
     this->findNeighbors();
+    this->minmax = BoundingBox::makeInvalidMinMaxBox();
 }
 
-TriangularMesh::TriangularMesh(const TriangularMesh& geo)
-{
-	this->triangleVec = geo.triangleVec;
-    this->triangles = geo.triangles;
-    this->size = geo.size;
-	this->minmax = BoundingBox(geo.minmax);
-}
 
 TriangularMesh::TriangularMesh()
 {
diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
index d5e93087562e68cde70a1018a438354e17fb5506..06e5bfb3d65f6b36cf4204490c863d9a667b54bd 100644
--- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
@@ -26,7 +26,6 @@ public:
 
     VF_PUBLIC static TriangularMesh* make(const std::string& fileName, DiscretizationMethod discretizationMethod);
 	VF_PUBLIC TriangularMesh();
-	VF_PUBLIC TriangularMesh(const TriangularMesh& geo);
     VF_PUBLIC TriangularMesh(const std::string& inputPath);
 	VF_PUBLIC TriangularMesh(const std::string& inputPath, const BoundingBox &box);
 	HOSTDEVICE VF_PUBLIC ~TriangularMesh();
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 214254e5174776d9b0aa1bc0225c52517e8861f7..9426d957852d94fa95fca9a4db6171806a95fc84 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -85,7 +85,13 @@ HOST void GridImp::inital()
     else
         gridStrategy->findInnerNodes(shared_from_this());
 
+    GridVTKWriter::writeSparseGridToVTK(shared_from_this(), "D:/GRIDGENERATION/pio");
+
     gridStrategy->findStopperNodes(shared_from_this());
+
+    if (triangularMesh)
+        GridVTKWriter::writeSparseGridToVTK(shared_from_this(), "D:/GRIDGENERATION/pio_stopper");
+
 }
 
 HOSTDEVICE void GridImp::initalNodeToOutOfGrid(uint index)
@@ -211,6 +217,42 @@ HOSTDEVICE void GridImp::findStopperNode(uint index)
         this->field.setFieldEntryToStopperEndOfGrid(index);
 }
 
+HOSTDEVICE void GridImp::removeOddBoundaryCellNode(uint index)
+{
+    Cell cell = getOddCellFromIndex(index);
+    if (isOutSideOfGrid(cell))
+        return;
+    if (contains(cell, OUT_OF_GRID))
+        setTo(cell, OUT_OF_GRID);
+}
+
+HOSTDEVICE bool GridImp::isOutSideOfGrid(Cell &cell) const
+{
+    for (const auto point : cell) {
+        if (point.x < startX || point.x > endX
+            || point.y < startY || point.y > endY
+            || point.z < startZ || point.z > endZ)
+            return true;
+    }
+    return false;
+}
+
+HOSTDEVICE bool GridImp::contains(Cell &cell, char type) const
+{
+    for (const auto point : cell) {
+        if (field.is(transCoordToIndex(point.x, point.y, point.z), type))
+            return true;
+    }
+    return false;
+}
+
+HOSTDEVICE void GridImp::setTo(Cell &cell, char type)
+{
+    for (const auto point : cell) {
+        field.setFieldEntry(transCoordToIndex(point.x, point.y, point.z), type);
+    }
+}
+
 HOSTDEVICE bool GridImp::isValidStartOfGridStopper(uint index) const
 {
     return this->field.is(index, OUT_OF_GRID) && (nodeInNextCellIs(index, FLUID) || nodeInNextCellIs(index, FLUID_CFF));
@@ -490,6 +532,7 @@ HOST void GridImp::findGridInterface(SPtr<Grid> finerGrid)
 HOSTDEVICE void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid)
 {
     gridInterface->findInterfaceCF(index, this, &finerGrid);
+
 }
 
 HOSTDEVICE void GridImp::findGridInterfaceFC(uint index, GridImp& finerGrid)
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 0b7ef13a502923ec49164229afd3f0a47ff70e63..7019158a944221b1fd85035f61c85ef4dbcf433e 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -34,6 +34,10 @@ private:
     HOSTDEVICE Cell getOddCellFromIndex(uint index) const;
     HOSTDEVICE bool isValidStartOfGridStopper(uint index) const;
     HOSTDEVICE bool isValidEndOfGridStopper(uint index) const;
+    HOSTDEVICE void removeOddBoundaryCellNode(uint index);
+    HOSTDEVICE bool isOutSideOfGrid(Cell &cell) const;
+    HOSTDEVICE bool contains(Cell &cell, char type) const;
+    HOSTDEVICE void setTo(Cell &cell, char type);
 
     HOSTDEVICE bool nodeInNextCellIs(int index, char type) const;
     HOSTDEVICE bool nodeInPreviousCellIs(int index, char type) const;
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
index f39d04da31680906c99b47737b646fa92a4efe13..098afe419d1564833366d3cf48200c839369e623 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
@@ -20,7 +20,6 @@
 
 void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid)
 {
-
     grid->neighborIndexX = new int[grid->size];
     grid->neighborIndexY = new int[grid->size];
     grid->neighborIndexZ = new int[grid->size];
@@ -74,6 +73,7 @@ void GridCpuStrategy::findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangu
         pointInObjectMethod(grid, triangularMesh);
     }
 
+    removeOddBoundaryCellNodes(grid);
 }
 
 void GridCpuStrategy::pointUnderTriangleMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh)
@@ -267,6 +267,14 @@ void GridCpuStrategy::rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* trian
     }
 }
 
+void GridCpuStrategy::removeOddBoundaryCellNodes(SPtr<GridImp> grid)
+{
+#pragma omp parallel for
+    for (uint index = 0; index < grid->size; index++)
+        grid->removeOddBoundaryCellNode(index);
+}
+
+
 void GridCpuStrategy::findStopperNodes(SPtr<GridImp> grid)
 {
 #pragma omp parallel for
@@ -300,6 +308,7 @@ void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGr
     for (uint index = 0; index < grid->getSize(); index++)
         grid->findGridInterfaceCF(index, *fineGrid);
 
+    GridVTKWriter::writeSparseGridToVTK(fineGrid, "D:/GRIDGENERATION/CF");
 
     for (uint index = 0; index < grid->getSize(); index++)
         grid->findGridInterfaceFC(index, *fineGrid);
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
index 1e611f6ea697108d54f58e09ef9e44116db6b7ae..3297f607951a8f68ad8d3a36b1c4da1df83a0f1e 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
@@ -41,7 +41,7 @@ protected:
     void pointUnderTriangleMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh);
     void rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh);
     void pointInObjectMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh);
-
+    void removeOddBoundaryCellNodes(SPtr<GridImp> grid);
 public:
     void allocateFieldMemory(Field* field) override;
     void freeFieldMemory(Field* field) override;
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index 103c82497348c00df43498b7972320a211ebc7e7..74aaadc3acb0794e4ac01f64c4adb30525797cbf 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -256,7 +256,8 @@ void multipleLevel(const std::string& configPath)
     //conglomerate->subtract(new Sphere(30, 20, 20, 4));
     //gridBuilder->addGrid(conglomerate, 2);
 
-    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_UNDER_TRIANGLE);
+    //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT);
+    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/sphereBinary.stl", DiscretizationMethod::POINT_IN_OBJECT);
 
     //TriangularMesh* sphere = STLReader::makeTriangularMesh("D:/GRIDGENERATION/STL/circleBinaer.stl");
     //TransformatorImp trans(1.0, Vertex(-30, -5, 10));