diff --git a/src/GridGenerator/geometries/Object.cu b/src/GridGenerator/geometries/Object.cu
index f04b03a63daf3a65f365257fafde2ebfc9ee0415..0fae18f668f14d86356b3e4a04be3a9f284dc1a0 100644
--- a/src/GridGenerator/geometries/Object.cu
+++ b/src/GridGenerator/geometries/Object.cu
@@ -6,3 +6,8 @@ void Object::findInnerNodes(SPtr<GridImp> grid)
 {
     grid->getGridStrategy()->findInnerNodes( grid );
 }
+
+HOST int Object::getIntersection(const Vertex & P, const Vertex & direction, Vertex & pointOnObject, real & qVal)
+{
+    return 1;
+}
diff --git a/src/GridGenerator/geometries/Object.h b/src/GridGenerator/geometries/Object.h
index 86428a7574c3f277667aaee504c4c3e5e64f864d..9a32abbf6b676877235afe9a193c1ae64cd3402f 100644
--- a/src/GridGenerator/geometries/Object.h
+++ b/src/GridGenerator/geometries/Object.h
@@ -12,6 +12,7 @@
 #include "global.h"
 
 class GridImp;
+struct Vertex;
 
 class VF_PUBLIC Object
 {
@@ -48,6 +49,8 @@ public:
     }
 
     HOST virtual void findInnerNodes(SPtr<GridImp> grid);
+
+    HOST virtual int getIntersection(const Vertex &P, const Vertex &direction, Vertex &pointOnObject, real &qVal);
 };
 
 
diff --git a/src/GridGenerator/geometries/Sphere/Sphere.cu b/src/GridGenerator/geometries/Sphere/Sphere.cu
index 894c1710f68e150b34984fd0b36a4da67fb5f715..7e93c98df737604686a7bf8994dbf4234266b385 100644
--- a/src/GridGenerator/geometries/Sphere/Sphere.cu
+++ b/src/GridGenerator/geometries/Sphere/Sphere.cu
@@ -1,5 +1,9 @@
 #include "Sphere.h"
 
+#include <algorithm>    // std::min
+
+#include "geometries/Vertex/Vertex.h"
+
 Sphere::Sphere(const double& centerX, const double& centerY, const double& centerZ, const double& radius)
     : centerX(centerX), centerY(centerY), centerZ(centerZ), radius(radius)
 {
@@ -85,3 +89,49 @@ void Sphere::scale(double delta)
 {
     this->radius += delta;
 }
+
+HOST int Sphere::getIntersection(const Vertex & point, const Vertex & direction, Vertex & pointOnObject, real & qVal)
+{
+    
+    Vertex relativePoint( point.x - this->centerX, 
+                          point.y - this->centerY, 
+                          point.z - this->centerZ );
+
+    real directionSquare = direction.x * direction.x
+                         + direction.y * direction.y
+                         + direction.z * direction.z;
+
+    real p = 2* ( relativePoint.x * direction.x
+                + relativePoint.y * direction.y
+                + relativePoint.z * direction.z )
+                / directionSquare;
+
+    real q = ( relativePoint.x * relativePoint.x
+             + relativePoint.y * relativePoint.y
+             + relativePoint.z * relativePoint.z
+             - this->radius    * this->radius )
+           / directionSquare;
+
+    real discriminant = 0.25 * p * p - q;
+
+
+    if( discriminant < 0.0 ) return 1;
+
+    real result1 = - 0.5 * p + std::sqrt( discriminant );
+    real result2 = - 0.5 * p - std::sqrt( discriminant );
+
+    if( result1 < 0.0 && result2 < 0.0 ) return 1;
+
+    if( result1 < 0.0 ) result1 = 1e99;
+    if( result2 < 0.0 ) result2 = 1e99;
+
+    real t = std::min( result1, result2 );
+
+    pointOnObject.x = point.x + t * direction.x;
+    pointOnObject.y = point.y + t * direction.y;
+    pointOnObject.z = point.z + t * direction.z;
+
+    qVal = t;
+
+    return 0;
+}
diff --git a/src/GridGenerator/geometries/Sphere/Sphere.h b/src/GridGenerator/geometries/Sphere/Sphere.h
index 7ca12037a515846f9e9fc24de9a2e362237c5172..988c2a131e86264ec51335b4c19ad7764c6c673f 100644
--- a/src/GridGenerator/geometries/Sphere/Sphere.h
+++ b/src/GridGenerator/geometries/Sphere/Sphere.h
@@ -35,7 +35,10 @@ public:
 
 
     void scale(double delta) override;
-   
+    
+    HOST int getIntersection(const Vertex &P, const Vertex &direction, Vertex &pointOnObject, real &qVal) override;
+
+
 protected:
     double centerX;
     double centerY;
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 2445a7b7c5caaaf6ca4f9205df8f9f60a8dbb601..84c64cba3263e82a7e66080eeacc2c83b36ae18f 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -1225,6 +1225,8 @@ HOST void GridImp::findQs(Object* object) //TODO: enable qs for primitive object
     TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object);
     if (triangularMesh)
         findQs(*triangularMesh);
+    else
+        findQsPrimitive(object);
 }
 
 HOST void GridImp::findQs(TriangularMesh &triangularMesh)
@@ -1286,6 +1288,114 @@ HOSTDEVICE void GridImp::findQs(Triangle &triangle)
     }
 }
 
+HOST void GridImp::findQsPrimitive(Object * object)
+{
+
+    if( this->qComputationStage == qComputationStageType::ComputeQs ){
+	    gridStrategy->allocateQs(shared_from_this());
+    }
+
+
+    for( int index = 0; index < this->size; index++ )
+    {
+
+        if( this->qIndices[index] == INVALID_INDEX ) continue;
+
+        real x,y,z;
+
+        this->transIndexToCoords(index,x,y,z);
+        
+        const Vertex point(x, y, z);
+
+        if( this->qComputationStage == qComputationStageType::ComputeQs ){
+            if(this->field.is(index, BC_SOLID))
+            {
+				calculateQs(index, point, object);
+			}
+        }
+        else if( this->qComputationStage == qComputationStageType::FindSolidBoundaryNodes )
+        {
+            if( !this->field.is(index, FLUID) ) continue;
+
+            if( checkIfAtLeastOneValidQ(index, point, object) )
+            {
+                // similar as in void GridImp::findBoundarySolidNode(uint index)
+                this->field.setFieldEntry( index, BC_SOLID );
+                this->qIndices[index] = this->numberOfSolidBoundaryNodes++;
+            }
+        }
+
+    }
+}
+
+HOSTDEVICE void GridImp::calculateQs(const uint index, const Vertex &point, Object* object) const
+{
+    Vertex pointOnTriangle, direction;
+
+	real subdistance;
+	int error;
+	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
+	{
+		direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), 
+                            real(distribution.dirs[i * DIMENSION + 1]),
+			                real(distribution.dirs[i * DIMENSION + 2]) );
+
+		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
+													    point.y + direction.y * this->delta,
+													    point.z + direction.z * this->delta);
+
+		if (neighborIndex == INVALID_INDEX) continue;
+
+		error = object->getIntersection(point, direction, pointOnTriangle, subdistance);
+
+		subdistance /= this->delta;
+
+		if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
+		{
+			if ( -0.5        > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ||
+                    subdistance < this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] )
+			{
+
+				this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance;
+                    
+                this->qPatches[ this->qIndices[index] ] = 0;
+
+				//printf("%d %f \n", this->qIndices[index], subdistance);
+			}
+		}
+	}
+}
+
+HOSTDEVICE bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex &point, Object* object) const
+{
+    Vertex pointOnTriangle, direction;
+
+	real subdistance;
+	int error;
+	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
+	{
+		direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), 
+                            real(distribution.dirs[i * DIMENSION + 1]),
+			                real(distribution.dirs[i * DIMENSION + 2]) );
+
+		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
+													 point.y + direction.y * this->delta,
+													 point.z + direction.z * this->delta);
+
+		if (neighborIndex == INVALID_INDEX) continue;
+
+		error = object->getIntersection(point, direction, pointOnTriangle, subdistance);
+
+		subdistance /= this->delta;
+
+		if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
+		{
+			return true;
+		}
+	}
+    return false;
+}
+
 HOSTDEVICE void GridImp::setDebugPoint(uint index, int pointValue)
 {
     if (field.isInvalidCoarseUnderFine(index) && pointValue == INVALID_SOLID)
@@ -1329,7 +1439,6 @@ HOSTDEVICE void GridImp::calculateQs(const Vertex &point, const Triangle &triang
 HOSTDEVICE void GridImp::calculateQs(const uint index, const Vertex &point, const Triangle &triangle) const
 {
 	Vertex pointOnTriangle, direction;
-	//VertexInteger solid_node;
 	real subdistance;
 	int error;
 	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
@@ -1348,14 +1457,6 @@ HOSTDEVICE void GridImp::calculateQs(const uint index, const Vertex &point, cons
 
 		if (neighborIndex == INVALID_INDEX) continue;
 
-		//if ( this->field.is(neighborIndex, STOPPER_SOLID) )
-  //      {
-  //          if (this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] < -0.5)
-  //          {
-  //              this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = 1.0;
-  //          }
-  //      }
-
 		error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance);
 
 		subdistance /= this->delta;
@@ -1378,7 +1479,6 @@ HOSTDEVICE void GridImp::calculateQs(const uint index, const Vertex &point, cons
 HOSTDEVICE bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex & point, const Triangle & triangle) const
 {
 	Vertex pointOnTriangle, direction;
-	//VertexInteger solid_node;
 	real subdistance;
 	int error;
 	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
@@ -1386,8 +1486,9 @@ HOSTDEVICE bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex
 #if defined(__CUDA_ARCH__)
 		direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]);
 #else
-		direction = Vertex(real(distribution.dirs[i * DIMENSION + 0]), real(distribution.dirs[i * DIMENSION + 1]),
-			real(distribution.dirs[i * DIMENSION + 2]));
+		direction = Vertex(real(distribution.dirs[i * DIMENSION + 0]), 
+                           real(distribution.dirs[i * DIMENSION + 1]),
+			               real(distribution.dirs[i * DIMENSION + 2]));
 #endif
 
 		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index b2d55efb796ff4b7062f672b8067493dde8b6c7b..3eebd60340e3ef7ba83a649efc96bd72bf38e8cb 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -260,6 +260,8 @@ public:
     HOST void findQs(Object* object) override;
     HOST void findQs(TriangularMesh &triangularMesh);
     HOSTDEVICE void findQs(Triangle &triangle);
+
+    HOST void findQsPrimitive(Object* object);
 private:
 
     enum class qComputationStageType{
@@ -275,7 +277,11 @@ private:
     HOSTDEVICE void setDebugPoint(uint index, int pointValue);
 	HOSTDEVICE void calculateQs(const Vertex &point, const Triangle &triangle) const;
 	HOSTDEVICE void calculateQs(const uint index, const Vertex &point, const Triangle &triangle) const;
-    HOSTDEVICE bool checkIfAtLeastOneValidQ(const uint index, const Vertex &point, const Triangle &triangle) const;
+	HOST void calculateQs(const uint index, const Vertex &point, Object* object) const;
+
+    HOST bool checkIfAtLeastOneValidQ(const uint index, const Vertex &point, const Triangle &triangle) const;
+
+    HOST bool checkIfAtLeastOneValidQ(const uint index, const Vertex &point, Object* object) const;
 
 public:
 
diff --git a/targets/apps/LBM/gridGeneratorTest/gridGeneratorTest.cpp b/targets/apps/LBM/gridGeneratorTest/gridGeneratorTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..866770733534061ccf5010f7ceb29c5b5b6cd101
--- /dev/null
+++ b/targets/apps/LBM/gridGeneratorTest/gridGeneratorTest.cpp
@@ -0,0 +1,822 @@
+//#define MPI_LOGGING
+
+//Martin Branch
+
+#include <mpi.h>
+#if defined( MPI_LOGGING )
+	#include <mpe.h>
+#endif
+
+#include <string>
+#include <iostream>
+#include <stdexcept>
+#include <fstream>
+#define _USE_MATH_DEFINES
+#include <math.h>
+
+#include "Core/LbmOrGks.h"
+#include "Core/Input/Input.h"
+#include "Core/StringUtilities/StringUtil.h"
+#include "Core/Input/ConfigFileReader/ConfigFileReader.h"
+
+#include "VirtualFluids_GPU/LBM/Simulation.h"
+#include "VirtualFluids_GPU/Communication/Communicator.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
+#include "VirtualFluids_GPU/Parameter/Parameter.h"
+#include "VirtualFluids_GPU/Output/FileWriter.h"
+
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
+#include "VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactoryImp.h"
+
+#include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/Mapper/KernelMapper/KernelMapper.h"
+
+#include "global.h"
+
+#include "geometries/Sphere/Sphere.h"
+#include "geometries/VerticalCylinder/VerticalCylinder.h"
+#include "geometries/Cuboid/Cuboid.h"
+#include "geometries/TriangularMesh/TriangularMesh.h"
+#include "geometries/Conglomerate/Conglomerate.h"
+#include "geometries/TriangularMesh/TriangularMeshStrategy.h"
+
+#include "grid/GridBuilder/LevelGridBuilder.h"
+#include "grid/GridBuilder/MultipleGridBuilder.h"
+#include "grid/BoundaryConditions/Side.h"
+#include "grid/BoundaryConditions/BoundaryCondition.h"
+#include "grid/GridFactory.h"
+
+#include "io/SimulationFileWriter/SimulationFileWriter.h"
+#include "io/GridVTKWriter/GridVTKWriter.h"
+#include "io/STLReaderWriter/STLReader.h"
+#include "io/STLReaderWriter/STLWriter.h"
+
+#include "utilities/math/Math.h"
+#include "utilities/communication.h"
+#include "utilities/transformator/TransformatorImp.h"
+
+
+void multipleLevel(const std::string& configPath)
+{
+    std::ofstream logFile( "F:/Work/Computations/out/Sphere/gridGeneratorLog.txt" );
+    //std::ofstream logFile( "grid/gridGeneratorLog.txt" );
+    logging::Logger::addStream(&logFile);
+
+    logging::Logger::addStream(&std::cout);
+    logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW);
+    logging::Logger::timeStamp(logging::Logger::ENABLE);
+    logging::Logger::enablePrintedRankNumbers(logging::Logger::ENABLE);
+
+    //UbLog::reportingLevel() = UbLog::logLevelFromString("DEBUG5");
+
+    auto gridFactory = GridFactory::make();
+    gridFactory->setGridStrategy(Device::CPU);
+    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
+    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
+    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
+
+    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    
+	Communicator* comm = Communicator::getInstanz();
+	SPtr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance();
+	SPtr<ConfigData> configData = configReader->readConfigFile(configPath);
+
+    std::shared_ptr<KernelMapper> kernelMapper = KernelMapper::getInstance();
+
+    SPtr<Parameter> para = Parameter::make(configData, comm);
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    bool useGridGenerator = true;
+
+    if(useGridGenerator){
+
+        enum testCase{
+			TGV,
+			TGV3D,
+			SphereTest,
+			DrivAer,
+            PaperPlane,
+            DLC,
+            MultiGPU,
+            StlGroupTest
+        };
+
+        int testcase = SphereTest;
+        
+		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+		if (testcase == TGV)
+		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+		{
+			real dx = 1.0;
+			real vx = 0.049;
+			//////////////////////////////////////////////////////////////////////////
+			//32
+			gridBuilder->addCoarseGrid(-24, -2, -16,
+										24,  2,  16, dx);
+			//////////////////////////////////////////////////////////////////////////
+			gridBuilder->setPeriodicBoundaryCondition(true, true, true);
+			//////////////////////////////////////////////////////////////////////////
+			gridBuilder->buildGrids(LBM, true); 
+			//////////////////////////////////////////////////////////////////////////
+			SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+			//////////////////////////////////////////////////////////////////////////
+			gridBuilder->writeGridsToVtk("E:/temp/TaylorGreenVortex/results/32/TGV32turned_Grid");
+			gridBuilder->writeArrows("E:/temp/TaylorGreenVortex/results/32/TGV32turned_Grid_arrow");
+			//////////////////////////////////////////////////////////////////////////
+			SimulationFileWriter::write("E:/temp/TaylorGreenVortex/grids/turned/gridUni48x4x32/", gridBuilder, FILEFORMAT::BINARY);
+			//////////////////////////////////////////////////////////////////////////
+			return;
+		}
+
+		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+		if (testcase == TGV3D)
+		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+		{
+			const real PI = 3.141592653589793238462643383279;
+
+			real dx = 2.0 * PI / 32.0; // 32^3 nodes
+			//real dx = 2.0 * PI / 64.0; // 64^3 nodes
+			//real dx = 2.0 * PI / 128.0; // 128^3 nodes
+			//real dx = 2.0 * PI / 256.0; // 128^3 nodes
+			real vx = 0.049;
+
+			gridBuilder->addCoarseGrid(-PI, -PI, -PI,
+										PI,  PI,  PI, dx);
+
+			gridBuilder->setPeriodicBoundaryCondition(true, true, true);
+
+			gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+			////////////////////////////////////////////////////////////////////////////
+			//gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx, 0.0, 0.0);
+			//gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx, 0.0, 0.0);
+			//gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx, 0.0, 0.0);
+			//gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx, 0.0, 0.0);
+
+			//gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+			//gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+
+			//gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+
+			//////////////////////////////////////////////////////////////////////////
+			SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+			//////////////////////////////////////////////////////////////////////////
+			//32
+			gridBuilder->writeGridsToVtk("E:/temp/TaylorGreenVortex/results3D/32/TGV3D_Grid");
+			gridBuilder->writeArrows("E:/temp/TaylorGreenVortex/results3D/32/TGV3D_Grid_arrow");
+			SimulationFileWriter::write("E:/temp/TaylorGreenVortex/grids3D/gridTGV3D/32/", gridBuilder, FILEFORMAT::BINARY); //FILEFORMAT::ASCII
+			//256
+		    //gridBuilder->writeGridsToVtk("E:/temp/TaylorGreenVortex/results3D/256/TGV3D_Grid");
+			//gridBuilder->writeArrows("E:/temp/TaylorGreenVortex/results3D/256/TGV3D_Grid_arrow");
+			//SimulationFileWriter::write("E:/temp/TaylorGreenVortex/grids3D/gridTGV3D/256/", gridBuilder, FILEFORMAT::BINARY); //FILEFORMAT::ASCII
+
+			return;
+
+		}
+
+		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        if( testcase == SphereTest)
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        {
+            real dx = 1.0 / 16.0;
+            real vx = 0.0125;
+
+            real D = 1.0;
+            real Re = 1140000;
+
+            para->setOutputPath( "F:/Work/Computations/out/Sphere/" );
+            para->setOutputPrefix( "Sphere" );
+
+            para->setFName(para->getOutputPath() + "/" + para->getOutputPrefix());
+
+            para->setPrintFiles(true);
+    
+            para->setVelocity( vx );
+            para->setViscosity( ( vx * D / dx ) / Re );
+
+            para->setVelocityRatio(1.0);
+
+            para->setTOut( 1000 );
+            para->setTEnd( 100000 );
+
+            para->setUseWale(false);
+
+            para->setMainKernel(kernelMapper->getEnum("CumulantK20Comp"));
+
+            //////////////////////////////////////////////////////////////////////////
+
+            TriangularMesh* sphereSTL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/Sphere/SphereNotOptimal.stl");
+
+            TriangularMesh* sphereRef_1_STL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/Sphere/SphereRef_1.stl");
+
+            TriangularMesh* sphereRef_2_STL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/Sphere/SphereRef_2.stl");
+
+            Object* sphere = new Sphere( 0, 0, 0, 0.5*D );
+
+            gridBuilder->addCoarseGrid(-2.0*D, -5.5*D, -5.5*D,
+                                        9.0*D,  5.5*D,  5.5*D, dx);  // DrivAer
+
+            //gridBuilder->setNumberOfLayers(10,8);
+            //gridBuilder->addGrid(SphereSTL, 2);
+            
+            gridBuilder->setNumberOfLayers(4,8);
+            gridBuilder->addGrid(sphereRef_1_STL, 3);
+            gridBuilder->addGrid(sphereRef_2_STL, 4);
+
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid(sphere, 5);
+
+
+        
+            //gridBuilder->addGeometry(SphereSTL);
+            gridBuilder->addGeometry(sphere);
+
+            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+            gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+            //////////////////////////////////////////////////////////////////////////
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+
+            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+            
+            //////////////////////////////////////////////////////////////////////////
+            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+            //////////////////////////////////////////////////////////////////////////
+
+            //gridBuilder->writeGridsToVtk("F:/Work/Computations/out/Sphere/grid");
+            //gridBuilder->writeArrows    ("F:/Work/Computations/out/Sphere/arrow");
+
+            SimulationFileWriter::write("F:/Work/Computations/out/Sphere/grid/", gridBuilder, FILEFORMAT::BINARY);
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        if( testcase == DrivAer )
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        {
+
+            real dx = 0.2;
+            real vx = 0.05;
+
+            real L = 4.6;
+            real Re = 1.0e6;
+
+            para->setOutputPath( "F:/Work/Computations/out/DrivAerNew/" );
+            para->setOutputPrefix( "DrivAer" );
+
+            para->setFName(para->getOutputPath() + "/" + para->getOutputPrefix());
+
+            para->setPrintFiles(true);
+    
+            para->setVelocity( vx );
+            para->setViscosity( ( vx * L / dx ) / Re );
+
+            //para->setVelocityRatio(1.0 / velocityLB);
+            para->setVelocityRatio(1.0);
+
+            para->setTOut( 10000 );
+            para->setTEnd( 100000 );
+
+            para->setUseWale(false);
+
+            para->setMainKernel(kernelMapper->getEnum("CumulantK20Comp"));
+
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            TriangularMesh* DrivAerSTL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/DrivAer_Fastback_Coarse.stl");
+            //TriangularMesh* triangularMesh = TriangularMesh::make("M:/TestGridGeneration/STL/DrivAer_NoSTLGroups.stl");
+            //TriangularMesh* triangularMesh = TriangularMesh::make("M:/TestGridGeneration/STL/DrivAer_Coarse.stl");
+            //TriangularMesh* DrivAerSTL = TriangularMesh::make("stl/DrivAer_Fastback_Coarse.stl");
+
+            TriangularMesh* DrivAerRefBoxSTL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/DrivAer_REF_BOX_Adrea.stl");
+            //TriangularMesh* DrivAerRefBoxSTL = TriangularMesh::make("stl/DrivAer_REF_BOX_Adrea.stl");
+
+            real z0 = 0.318;
+
+            gridBuilder->addCoarseGrid(- 5.0, -5.0, 0.0 - z0,
+                                        15.0,  5.0, 5.0 - z0, dx);  // DrivAer
+
+            //Object* floorBox = new Cuboid( -0.3, -1, -1, 4.0, 1, 0.2 );
+            //Object* wakeBox  = new Cuboid(  3.5, -1, -1, 5.5, 1, 0.8 );
+
+            //Conglomerate* refRegion = new Conglomerate();
+
+            //refRegion->add(floorBox);
+            //refRegion->add(wakeBox);
+            //refRegion->add(DrivAerRefBoxSTL);
+
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid(DrivAerRefBoxSTL, 4);
+        
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid(DrivAerSTL, 5);
+
+            gridBuilder->addGeometry(DrivAerSTL);
+
+            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+            gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+
+            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+            
+            //////////////////////////////////////////////////////////////////////////
+
+            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+
+            gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 4, 0.0075, -2.0, 0.0,
+                                                                                                                                     0.0075,  2.0, 0.0, -vx, 0.318);
+            gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 3, 2.793 , -2.0, 0.0,
+                                                                                                                                     2.793 ,  2.0, 0.0, -vx, 0.318);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->writeGridsToVtk("F:/Work/Computations/out/DrivAerNew/DrivAer_Grid_");
+            gridBuilder->writeArrows    ("F:/Work/Computations/out/DrivAerNew/DrivAer_Grid_arrow");
+
+            //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
+            //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
+            SimulationFileWriter::write("F:/Work/Computations/out/DrivAerNew/grid/", gridBuilder, FILEFORMAT::BINARY);
+            //SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
+
+            //return;
+            //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        if( testcase == PaperPlane )
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        {
+
+            real dx = 0.01;
+            real vx = 0.05;
+
+            real L = 0.3;
+            real Re = 90000;
+
+            para->setOutputPath( "F:/Work/Computations/out/PaperPlane/" );
+            para->setOutputPrefix( "PaperPlaneK17winglet" );
+
+            para->setFName(para->getOutputPath() + "/" + para->getOutputPrefix());
+
+            para->setPrintFiles(true);
+    
+            para->setVelocity( vx );
+            para->setViscosity( ( vx * L / dx ) / Re );
+
+            para->setVelocityRatio(1.0);
+
+            para->setTOut( 1000 );
+            para->setTEnd( 100000 );
+
+            para->setUseWale(false);
+
+            para->setMainKernel(kernelMapper->getEnum("CumulantAA2016CompSP27"));
+
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            TriangularMesh* STL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/PaperPlane_1.stl");
+            //TriangularMesh* STL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/PaperPlane_1_winglet.stl");
+            
+            TriangularMesh* RefBoxSTL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/PaperPlane_1_ref.stl");
+            //TriangularMesh* RefBoxSTL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/PaperPlane_1_winglet_ref.stl");
+
+            gridBuilder->addCoarseGrid(- 0.5, -0.3, -0.3,
+                                         1.0,  0.3,  0.3, dx);
+
+            gridBuilder->setNumberOfLayers(6,8);
+            gridBuilder->addGrid(RefBoxSTL, 3);
+
+            gridBuilder->addGeometry(STL);
+
+            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+            gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+
+            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->writeGridsToVtk("F:/Work/Computations/out/PaperPlane/PaperPlane_Grid_");
+            gridBuilder->writeArrows    ("F:/Work/Computations/out/PaperPlane/PaperPlane_Grid_arrow");
+
+            //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
+            //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
+            SimulationFileWriter::write("F:/Work/Computations/out/PaperPlane/grid/", gridBuilder, FILEFORMAT::BINARY);
+            //SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
+
+            //return;
+            //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        if( testcase == StlGroupTest )
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        {
+
+            real dx = 0.025;
+            real vx = 0.05;
+
+            real L = 1.0;
+            real Re = 100;
+
+            para->setOutputPath( "F:/Work/Computations/out/StlGroupTest/" );
+            para->setOutputPrefix( "StlGroupTest" );
+
+            para->setFName(para->getOutputPath() + "/" + para->getOutputPrefix());
+
+            para->setPrintFiles(true);
+    
+            para->setVelocity( vx );
+            para->setViscosity( ( vx * L / dx ) / Re );
+
+            para->setVelocityRatio(1.0);
+
+            para->setTOut( 1000 );
+            para->setTEnd( 100000 );
+
+            para->setUseWale(false);
+
+            para->setMainKernel(kernelMapper->getEnum("CumulantAA2016CompSP27"));
+            //para->setMainKernel(kernelMapper->getEnum("CumulantOneCompSP27"));
+
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            TriangularMesh* STL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/STL_Group_Test_2_Cylinders.stl");
+
+            gridBuilder->addCoarseGrid(- 2.0, -4.5, -2.0,
+                                         4.0,  4.5,  2.0, dx);
+
+            gridBuilder->addGeometry(STL);
+
+            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+            gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+
+            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+
+            gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 1, 0.0, -2.0, 0.0,
+                                                                                                                                     0.0,  2.0, 0.0, -vx, 0.5);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->writeGridsToVtk("F:/Work/Computations/out/StlGroupTest/StlGroupTest_Grid_");
+            gridBuilder->writeArrows    ("F:/Work/Computations/out/StlGroupTest/StlGroupTest_Grid_arrow");
+
+            SimulationFileWriter::write("F:/Work/Computations/out/StlGroupTest/grid/", gridBuilder, FILEFORMAT::BINARY);
+
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        if( testcase == DLC )
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        {
+			real velocityRatio = 594.093427;
+
+			real dx = 0.2;
+			real vx = 0.065272188;
+
+			real z0 = 0.24395 + 0.5*dx;
+
+            std::vector<uint> ignorePatches = { 152, 153, 154 };
+
+            //TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/VW370_SERIE.stl", ignorePatches);
+            TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("stl/VW370_SERIE.stl", ignorePatches);
+
+            //TriangularMesh* DLC_RefBox = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox.stl");
+
+            //TriangularMesh* DLC_RefBox_1 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_4m.stl");
+            //TriangularMesh* DLC_RefBox_2 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_3m.stl");
+            //TriangularMesh* DLC_RefBox_3 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_2m.stl");
+            //TriangularMesh* DLC_RefBox_4 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.stl");
+
+            //TriangularMesh* DLC_RefBox_Level_3 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC/DLC_RefBox_Level_3.stl");
+            //TriangularMesh* DLC_RefBox_Level_4 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC/DLC_RefBox_Level_4.stl");
+            //TriangularMesh* DLC_RefBox_Level_5 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC/DLC_RefBox_Level_5.stl");
+
+            TriangularMesh* DLC_RefBox_Level_3 = TriangularMesh::make("stl/DLC/DLC_RefBox_Level_3.stl");
+            TriangularMesh* DLC_RefBox_Level_4 = TriangularMesh::make("stl/DLC/DLC_RefBox_Level_4.stl");
+            TriangularMesh* DLC_RefBox_Level_5 = TriangularMesh::make("stl/DLC/DLC_RefBox_Level_5.stl");
+
+            //TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("stl/VW370_SERIE.stl", ignorePatches);
+            //TriangularMesh* DLC_RefBox = TriangularMesh::make("stl/DLC_RefBox.lnx.stl");
+            //TriangularMesh* DLC_RefBox_4 = TriangularMesh::make("stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.lnx.stl");
+
+            gridBuilder->addCoarseGrid(-30.0, -20.0,  0.0 - z0,
+                                        50.0,  20.0, 25.0 - z0, dx);
+            
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid( new Cuboid( - 6.6, -6, -0.7, 20.6 , 6, 5.3  ), 1 );
+            gridBuilder->addGrid( new Cuboid( -3.75, -3, -0.7, 11.75, 3, 2.65 ), 2 );
+
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid(DLC_RefBox_Level_3, 3);
+            gridBuilder->addGrid(DLC_RefBox_Level_4, 4);
+        
+            Conglomerate* refinement = new Conglomerate();
+            refinement->add(DLC_RefBox_Level_5);
+            refinement->add(VW370_SERIE_STL);
+
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid(refinement, 5);
+
+            gridBuilder->addGeometry(VW370_SERIE_STL);
+
+            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+            gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+
+            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+            
+            //////////////////////////////////////////////////////////////////////////
+
+            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+
+            real wheelsFrontX = -0.081;
+            real wheelsRearX  =  2.5486;
+
+            real wheelsFrontZ =  0.0504;
+            real wheelsRearZ  =  0.057;
+
+            real wheelsRadius =  0.318;
+
+			real wheelRotationFrequency = 1170.74376 / 60.0;
+
+			real wheelTangentialVelocity = -2.0 * M_PI * wheelsRadius * wheelRotationFrequency / velocityRatio;
+
+            std::vector<uint> frontWheelPatches = { 71, 86, 87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97, 159 };
+            std::vector<uint> rearWheelPatches  = { 82, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 160 };
+
+            for( uint patch : frontWheelPatches ){
+                gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsFrontX, -2.0, wheelsFrontZ,
+                                                                                                                                             wheelsFrontX,  2.0, wheelsFrontZ, 
+					                                                                                                                         wheelTangentialVelocity, wheelsRadius);
+            }
+
+            for( uint patch : rearWheelPatches ){
+                gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsRearX , -2.0, wheelsRearZ ,
+                                                                                                                                             wheelsRearX ,  2.0, wheelsRearZ , 
+					                                                                                                                         wheelTangentialVelocity, wheelsRadius);
+            }
+
+            //////////////////////////////////////////////////////////////////////////
+
+            //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/DLC_Grid");
+            //gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/grid/DLC_Grid_arrow");
+
+            gridBuilder->writeGridsToVtk("grid/DLC_Grid");
+            gridBuilder->writeArrows    ("grid/DLC_Grid_arrow");
+
+            //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
+            //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
+            SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
+            
+            //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        if( testcase == MultiGPU )
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        {
+            //const uint generatePart = 1;
+            const uint generatePart = Communicator::getInstanz()->getPID();
+            
+            std::ofstream logFile2;
+            
+            if( generatePart == 0 )
+                logFile2.open( "F:/Work/Computations/gridGenerator/grid/0/gridGeneratorLog.txt" );
+                //logFile2.open( "grid/0/gridGeneratorLog.txt" );
+            
+            if( generatePart == 1 )
+                logFile2.open( "F:/Work/Computations/gridGenerator/grid/1/gridGeneratorLog.txt" );
+                //logFile2.open( "grid/1/gridGeneratorLog.txt" );
+
+            logging::Logger::addStream(&logFile2);
+
+            real dx = 1.0 / 40.0;
+            real vx = 0.05;
+
+            TriangularMesh* triangularMesh = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/ShpereNotOptimal.stl");
+            //TriangularMesh* triangularMesh = TriangularMesh::make("stl/ShpereNotOptimal.lnx.stl");
+
+            // all
+            //gridBuilder->addCoarseGrid(-2, -2, -2,  
+            //                            4,  2,  2, dx);
+
+            real overlap = 10.0 * dx;
+
+            if( generatePart == 0 )
+                gridBuilder->addCoarseGrid(-2.0          , -2.0, -2.0,  
+                                            0.5 + overlap,  2.0,  2.0, dx);
+
+            if( generatePart == 1 )
+                gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0,  
+                                            4.0          ,  2.0,  2.0, dx);
+
+
+            gridBuilder->setNumberOfLayers(10,8);
+            gridBuilder->addGrid(triangularMesh, 1);
+
+            gridBuilder->addGeometry(triangularMesh);
+            
+            if( generatePart == 0 )
+                gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, 
+                                                                             -2.0, 2.0, 
+                                                                             -2.0, 2.0 ) );
+            
+            if( generatePart == 1 )
+                gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>(  0.5, 4.0, 
+                                                                             -2.0, 2.0, 
+                                                                             -2.0, 2.0 ) );
+
+            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+            gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+            
+            if( generatePart == 0 ){
+                gridBuilder->findCommunicationIndices(CommunicationDirections::PX, LBM);
+                gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 1);
+            }
+            
+            if( generatePart == 1 ){
+                gridBuilder->findCommunicationIndices(CommunicationDirections::MX, LBM);
+                gridBuilder->setCommunicationProcess(CommunicationDirections::MX, 0);
+            }
+
+            //////////////////////////////////////////////////////////////////////////
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+
+            if (generatePart == 0) {
+                gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+            }
+            if (generatePart == 1) {
+                gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+            }
+
+            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+        
+            //////////////////////////////////////////////////////////////////////////
+
+            if (generatePart == 0) {
+                //gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/0/Test_");
+                //gridBuilder->writeArrows    ("F:/Work/Computations/gridGenerator/grid/0/Test_Arrow");
+            }
+            if (generatePart == 1) {
+                //gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/1/Test_");
+                //gridBuilder->writeArrows    ("F:/Work/Computations/gridGenerator/grid/1/Test_Arrow");
+            }
+
+            if (generatePart == 0)
+                SimulationFileWriter::write("F:/Work/Computations/gridGenerator/grid/0/", gridBuilder, FILEFORMAT::ASCII);
+                //SimulationFileWriter::write("grid/0/", gridBuilder, FILEFORMAT::ASCII);
+            if (generatePart == 1)
+                SimulationFileWriter::write("F:/Work/Computations/gridGenerator/grid/1/", gridBuilder, FILEFORMAT::ASCII);
+                //SimulationFileWriter::write("grid/1/", gridBuilder, FILEFORMAT::ASCII);
+
+            //return;
+            
+            //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
+        }
+
+    }
+    else
+    {
+        //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
+        //gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
+    }
+
+    logFile.close();
+
+    //return;
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    SPtr<CudaMemoryManager> cudaMemoryManager = CudaMemoryManager::make(para);
+
+    SPtr<GridProvider> gridGenerator;
+    if( useGridGenerator ) gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
+    else                   gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
+
+    Simulation sim;
+
+    SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
+
+    SPtr<KernelFactoryImp> kernelFactory = KernelFactoryImp::getInstance();
+
+    SPtr<PreProcessorFactoryImp> preProcessorFactory = PreProcessorFactoryImp::getInstance();
+
+    sim.setFactories(kernelFactory, preProcessorFactory);
+
+    sim.init(para, gridGenerator, fileWriter, cudaMemoryManager);
+    
+
+    sim.run();
+    sim.free();
+}
+
+int main( int argc, char* argv[])
+{
+    MPI_Init(&argc, &argv);
+    std::string str, str2; 
+    if ( argv != NULL )
+    {
+        //str = static_cast<std::string>(argv[0]);
+        
+        try
+        {
+            //////////////////////////////////////////////////////////////////////////
+
+			std::string targetPath;
+
+			targetPath = __FILE__;
+
+#ifdef _WIN32
+			targetPath = targetPath.substr(0, targetPath.find_last_of('\\') + 1);
+#else
+			targetPath = targetPath.substr(0, targetPath.find_last_of('/') + 1);
+#endif
+
+			std::cout << targetPath << std::endl;
+
+			multipleLevel(targetPath + "config.txt");
+
+            //////////////////////////////////////////////////////////////////////////
+		}
+        catch (const std::exception& e)
+        {
+                
+            *logging::out << logging::Logger::LOGGER_ERROR << e.what() << "\n";
+        }
+        catch (const std::bad_alloc e)
+        {
+                
+            *logging::out << logging::Logger::LOGGER_ERROR << "Bad Alloc:" << e.what() << "\n";
+        }
+        catch (...)
+        {
+            *logging::out << logging::Logger::LOGGER_ERROR << "Unknown exception!\n";
+        }
+    }
+
+   MPI_Finalize();
+   return 0;
+}
diff --git a/targets/apps/LBM/gridGeneratorTest/main.cpp b/targets/apps/LBM/gridGeneratorTest/main.cpp
deleted file mode 100644
index ab2167e8c9cbe1a2e0d2a4cf2957ce885a7af5b4..0000000000000000000000000000000000000000
--- a/targets/apps/LBM/gridGeneratorTest/main.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-
-#define _USE_MATH_DEFINES
-#include <math.h>
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <stdexcept>
-#include <fstream>
-#include <exception>
-#include <memory>
-
-//////////////////////////////////////////////////////////////////////////
-
-#include "Core/DataTypes.h"
-#include "Core/PointerDefinitions.h"
-
-#include "Core/LbmOrGks.h"
-#include "Core/Input/Input.h"
-#include "Core/StringUtilities/StringUtil.h"
-#include "Core/Input/ConfigFileReader/ConfigFileReader.h"
-
-#include "Core/VectorTypes.h"
-#include "Core/Logger/Logger.h"
-
-//////////////////////////////////////////////////////////////////////////
-
-#include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
-#include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/BoundaryConditions/Side.h"
-#include "GridGenerator/grid/GridFactory.h"
-
-#include "GridGenerator/geometries/Cuboid/Cuboid.h"
-#include "GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
-#include "GridGenerator/geometries/Conglomerate/Conglomerate.h"
-#include "GridGenerator/geometries/TriangularMesh/TriangularMeshStrategy.h"
-
-#include "GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h"
-#include "GridGenerator/io/GridVTKWriter/GridVTKWriter.h"
-#include "GridGenerator/io/STLReaderWriter/STLReader.h"
-#include "GridGenerator/io/STLReaderWriter/STLWriter.h"
-
-//////////////////////////////////////////////////////////////////////////
-
-#include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/Communicator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
-#include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Output/FileWriter.h"
-
-#include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
-#include "VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactoryImp.h"
-
-#include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-//          U s e r    s e t t i n g s
-//
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-//LbmOrGks lbmOrGks = GKS;
-//LbmOrGks lbmOrGks = LBM;
-
-const real L  = 2.0;
-
-const real Re = 100000.0;
-
-const real velocity  = 1.0;
-
-const real dt = 0.25e-3;
-
-const uint nx = 32;
-
-std::string path("F:/Work/Computations/out/gridGeneratorTest/"); //LEGOLAS
-//std::string path("E:/DrivenCavity/results/"); //TESLA03
-
-std::string simulationName("DrivenCavity");
-
-const uint timeStepOut = 10;
-const uint timeStepEnd = 1000000;
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-void multipleLevel(const std::string& configPath)
-{
-    logging::Logger::addStream(&std::cout);
-    logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW);
-    logging::Logger::timeStamp(logging::Logger::ENABLE);
-    logging::Logger::enablePrintedRankNumbers(logging::Logger::ENABLE);
-
-    auto gridFactory = GridFactory::make();
-    gridFactory->setGridStrategy(Device::CPU);
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-    
-	Communicator* comm = Communicator::getInstanz();
-	SPtr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance();
-	SPtr<ConfigData> configData = configReader->readConfigFile(configPath);
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-	real dx = L / real(nx);
-
-	gridBuilder->addCoarseGrid(-L, -L, -L,
-							    L,  L,  L, dx);
-
-    TriangularMesh* cylinderSTL = TriangularMesh::make("F:/Work/Computations/gridGenerator/stl/Cylinder.stl");
-    
-
-    gridBuilder->setNumberOfLayers(6,6);
-    gridBuilder->addGrid(cylinderSTL, 1);
-
-    //Object* cube = new Cuboid(-0.5,-0.5,-0.5,0.5,0.5,0.5);
-    //gridBuilder->addGrid(cube, 1);
-
-    gridBuilder->addGeometry(cylinderSTL);
-
-	gridBuilder->setPeriodicBoundaryCondition(false, false, false);
-
-	gridBuilder->buildGrids(LBM, false); // buildGrids() has to be called before setting the BCs!!!!
-
-    gridBuilder->writeGridsToVtk("F:/Work/Computations/out/gridGeneratorTest/grid_");
-
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    SPtr<Parameter> para = Parameter::make(configData, comm);
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    const real velocityLB = velocity * dt / dx; // LB units
-
-	const real vx = velocityLB; // LB units
-
-    const real viscosityLB = nx * velocityLB / Re; // LB units
-
-    *logging::out << logging::Logger::INFO_HIGH << "velocity  [dx/dt] = " << velocityLB << " \n";
-    *logging::out << logging::Logger::INFO_HIGH << "viscosity [dx/dt] = " << viscosityLB << "\n";
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    para->setOutputPath( path );
-    para->setOutputPrefix( simulationName );
-
-    para->setFName(para->getOutputPath() + "/" + para->getOutputPrefix());
-
-    para->setPrintFiles(true);
-    
-    para->setVelocity(velocityLB);
-    para->setViscosity(viscosityLB);
-
-    //para->setVelocityRatio(1.0 / velocityLB);
-    para->setVelocityRatio(1.0);
-
-    para->setTOut( timeStepOut );
-    para->setTEnd( timeStepEnd );
-
-    para->setUseWale(false);
-
-    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-	gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-	gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-	//gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.0, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx, 0.0, 0.0);
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    SimulationFileWriter::write("F:/Work/Computations/out/gridGeneratorTest/grid/", gridBuilder, FILEFORMAT::BINARY);
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    SPtr<CudaMemoryManager> cudaMemoryManager = CudaMemoryManager::make(para);
-    SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager);
-    //SPtr<GridProvider> gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
-
-    Simulation sim;
-    SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
-    SPtr<KernelFactoryImp> kernelFactory = KernelFactoryImp::getInstance();
-    SPtr<PreProcessorFactoryImp> preProcessorFactory = PreProcessorFactoryImp::getInstance();
-    sim.setFactories(kernelFactory, preProcessorFactory);
-    sim.init(para, gridGenerator, fileWriter, cudaMemoryManager);
-    
-
-    sim.run();
-    sim.free();
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-}
-
-int main( int argc, char* argv[])
-{
-    MPI_Init(&argc, &argv);
-    std::string str, str2; 
-    if ( argv != NULL )
-    {
-        //str = static_cast<std::string>(argv[0]);
-        
-        try
-        {
-            //////////////////////////////////////////////////////////////////////////
-
-			std::string targetPath;
-
-			targetPath = __FILE__;
-
-#ifdef _WIN32
-			targetPath = targetPath.substr(0, targetPath.find_last_of('\\') + 1);
-#else
-			targetPath = targetPath.substr(0, targetPath.find_last_of('/') + 1);
-#endif
-
-			std::cout << targetPath << std::endl;
-
-			multipleLevel(targetPath + "config.txt");
-
-            //////////////////////////////////////////////////////////////////////////
-		}
-        catch (const std::exception& e)
-        {
-                
-            *logging::out << logging::Logger::LOGGER_ERROR << e.what() << "\n";
-        }
-        catch (const std::bad_alloc e)
-        {
-                
-            *logging::out << logging::Logger::LOGGER_ERROR << "Bad Alloc:" << e.what() << "\n";
-        }
-        catch (...)
-        {
-            *logging::out << logging::Logger::LOGGER_ERROR << "Unknown exception!\n";
-        }
-    }
-
-   MPI_Finalize();
-   return 0;
-}