diff --git a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp
index c558198bfee2aacbf592550fc18293e4487325a8..622023768cc7e9bf0e901f360f1bb7747649d40b 100644
--- a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp
+++ b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.cpp
@@ -1,8 +1,57 @@
 #include "BoundaryCondition.h"
 
 #include "Side.h"
+#include "../Grid.h"
 
 bool BoundaryCondition::isSide( SideType side ) const
 {
     return this->side->whoAmI() == side;
-}
\ No newline at end of file
+}
+
+void GeometryBoundaryCondition::setTangentialVelocityForPatch(SPtr<Grid> grid, uint patch, 
+                                                              real p1x, real p1y, real p1z, 
+                                                              real p2x, real p2y, real p2z, 
+                                                              real v, real r)
+{
+    for( uint index = 0; index < this->indices.size(); index++ ){
+        if( this->patches[index] == patch ){
+
+            real x, y, z;
+
+            grid->transIndexToCoords( this->indices[index], x, y, z );
+
+            real pVecX = p2x - p1x;
+            real pVecY = p2y - p1y;
+            real pVecZ = p2z - p1z;
+
+            real xVecX =   x - p1x;
+            real xVecY =   y - p1y;
+            real xVecZ =   z - p1z;
+
+            // compute and normalize tangent
+
+            real tangentX = pVecY * xVecZ - pVecZ * xVecY;
+            real tangentY = pVecZ * xVecX - pVecX * xVecZ; 
+            real tangentZ = pVecX * xVecY - pVecY * xVecX;
+
+            real tangentNorm = sqrt( tangentX*tangentX + tangentY*tangentY + tangentZ*tangentZ );
+
+            tangentX /= tangentNorm;
+            tangentY /= tangentNorm;
+            tangentZ /= tangentNorm;
+
+            // compute distance from rotation axis
+
+            real projection = ( pVecX*xVecX + pVecY*xVecY + pVecZ*xVecZ ) / ( pVecX*pVecX + pVecY*pVecY + pVecZ*pVecZ );
+
+            real d = sqrt( ( xVecX - projection * pVecX ) * ( xVecX - projection * pVecX )
+                         + ( xVecY - projection * pVecY ) * ( xVecY - projection * pVecY )
+                         + ( xVecZ - projection * pVecZ ) * ( xVecZ - projection * pVecZ ) );
+
+            this->vxList[index] = tangentX * d / r * v;
+            this->vyList[index] = tangentY * d / r * v;
+            this->vzList[index] = tangentZ * d / r * v;
+
+        }
+    }
+}
diff --git a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h
index 3fc9494efdd70081047090cd25b25b8e44fddf90..e28974f9644f7179172689133aaf6a8930291e06 100644
--- a/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h
+++ b/src/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h
@@ -7,6 +7,8 @@
 #include <core/DataTypes.h>
 #include "grid/NodeValues.h"
 
+class Grid;
+
 class Side;
 enum class SideType;
 
@@ -17,6 +19,8 @@ public:
     SPtr<Side> side;
     std::vector<std::vector<real> > qs;
 
+    std::vector<uint> patches;
+
     virtual char getType() const = 0;
 
     bool isSide( SideType side ) const;
@@ -24,6 +28,8 @@ public:
     real getQ( uint index, uint dir ){ return this->qs[index][dir]; }
 };
 
+//////////////////////////////////////////////////////////////////////////
+
 class PressureBoundaryCondition : public BoundaryCondition
 {
 public:
@@ -32,15 +38,11 @@ public:
         return SPtr<PressureBoundaryCondition>(new PressureBoundaryCondition(rho));
     }
 
-
     std::vector<uint> neighborIndices;
 
     real rho;
-private:
-    PressureBoundaryCondition(real rho) : rho(rho)
-    {
-
-    }
+protected:
+    PressureBoundaryCondition(real rho) : rho(rho) { }
 
 public:
     char getType() const override
@@ -54,6 +56,8 @@ public:
     }
 };
 
+//////////////////////////////////////////////////////////////////////////
+
 class VelocityBoundaryCondition : public BoundaryCondition
 {
 public:
@@ -63,25 +67,38 @@ public:
     }
 
     real vx, vy, vz;
-private:
-    VelocityBoundaryCondition(real vx, real vy, real vz) : vx(vx), vy(vy), vz(vz)
-    {
-
-    }
+    std::vector<real> vxList, vyList, vzList;
+protected:
+    VelocityBoundaryCondition(real vx, real vy, real vz) : vx(vx), vy(vy), vz(vz) { }
 
 public:
-    char getType() const override
+    virtual char getType() const override
     {
         return BC_VELOCITY;
     }
 
+    void fillVelocityLists()
+    {
+        for( uint index : this->indices ){
+            this->vxList.push_back(vx);
+            this->vyList.push_back(vy);
+            this->vzList.push_back(vz);
+        }
+    }
+
     real getVx() { return this->vx; }
     real getVy() { return this->vy; }
     real getVz() { return this->vz; }
+
+    real getVx(uint index) { return this->vxList[index]; }
+    real getVy(uint index) { return this->vyList[index]; }
+    real getVz(uint index) { return this->vzList[index]; }
 };
 
+//////////////////////////////////////////////////////////////////////////
 
-class GeometryBoundaryCondition : public BoundaryCondition
+
+class GeometryBoundaryCondition : public VelocityBoundaryCondition
 {
 public:
     static SPtr<GeometryBoundaryCondition> make()
@@ -89,12 +106,8 @@ public:
         return SPtr<GeometryBoundaryCondition>(new GeometryBoundaryCondition());
     }
 
-    real vx, vy, vz;
 private:
-    GeometryBoundaryCondition()
-    {
-
-    }
+    GeometryBoundaryCondition() : VelocityBoundaryCondition(0.0, 0.0, 0.0) { }
 
 public:
     char getType() const override
@@ -102,9 +115,20 @@ public:
         return BC_SOLID;
     }
 
-    real getVx() { return this->vx; }
-    real getVy() { return this->vy; }
-    real getVz() { return this->vz; }
+    void setVelocityForPatch( uint patch, real vx, real vy, real vz ){
+        for( uint index = 0; index < this->indices.size(); index++ ){
+            if( this->patches[index] == patch ){
+                this->vxList[index] = vx;
+                this->vyList[index] = vy;
+                this->vzList[index] = vz;
+            }
+        }
+    }
+
+    VF_PUBLIC void setTangentialVelocityForPatch( SPtr<Grid> grid, uint patch, 
+                                                  real p1x, real p1y, real p1z, 
+                                                  real p2x, real p2y, real p2z, 
+                                                  real v, real r );
 };
 
 
diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
index de6ef1a36c6dddf6e0af35fe39946d10a23f51d3..5182018302e866bca4030c4be6b7ea1aaa818a29 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.cpp
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
@@ -26,6 +26,8 @@ void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition
                 setPressureNeighborIndices(boundaryCondition, grid, index);
 
                 setQs(grid, boundaryCondition, index);
+
+                boundaryCondition->patches.push_back(0);
             }
         }
     }
@@ -126,6 +128,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound
 
         geometryBoundaryCondition->indices.push_back(index);
         geometryBoundaryCondition->qs.push_back(qNode);
+        geometryBoundaryCondition->patches.push_back( grids[level]->getQPatch(index) );
 
         qFound = false;
     }
diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index 886ead4f988031a99d37cfe397c74f6bc385d0e4..fc918be0c3a43e3385f5abbfaf379ad7bdc53ed6 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -108,6 +108,7 @@ public:
 	HOST virtual void setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes) = 0;
 
 	HOST virtual real getQValue(const uint index, const uint dir) const = 0;
+	HOST virtual uint getQPatch(const uint index) const = 0;
 
     HOST virtual void setInnerRegionFromFinerGrid( bool innerRegionFromFinerGrid ) = 0;
 
diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
index 1a4ce6d6f624001933e56ecfc6458260863533da..a241391387655f69b89c42c1028d83c75c8afb54 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -31,6 +31,7 @@ class Grid;
 enum class SideType;
 
 class BoundaryCondition;
+class GeometryBoundaryCondition;
 
 class GridBuilder
 {
@@ -76,6 +77,8 @@ public:
 
     virtual SPtr<BoundaryCondition> getBoundaryCondition( SideType side, uint level ) const = 0;
 
+    virtual SPtr<GeometryBoundaryCondition> getGeometryBoundaryCondition( uint level ) const = 0;
+
 };
 
 #endif
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 5accee3ea9ef793adf0a21ea0c1146663aa0459b..9344c9ff902c1c25405a31598809d6f5ca29a2e3 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -60,27 +60,13 @@ void LevelGridBuilder::setVelocityBoundaryCondition(SideType sideType, real vx,
             velocityBoundaryCondition->side = side;
             velocityBoundaryCondition->side->addIndices(grids, level, velocityBoundaryCondition);
 
+            velocityBoundaryCondition->fillVelocityLists();
+
             boundaryConditions[level]->velocityBoundaryConditions.push_back(velocityBoundaryCondition);
 
             *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Velocity BC on level " << level << " with " << (int)velocityBoundaryCondition->indices.size() <<"\n";
         }
     }
-
-	//// DEBUG
-	//{
-	//	std::ofstream file;
-
-	//	file.open("M:/TestGridGeneration/results/Box2_25_Qs.csv");
-
-	//	for (auto nodeQs : boundaryConditions[0]->geometryBoundaryCondition->qs) {
-	//		for (auto q : nodeQs) {
-	//			file << q << ", ";
-	//		}
-	//		file << "100" << std::endl;
-	//	}
-
-	//	file.close();
-	//}
 }
 
 void LevelGridBuilder::setVelocityGeometryBoundaryCondition(real vx, real vy, real vz)
@@ -95,6 +81,10 @@ void LevelGridBuilder::setVelocityGeometryBoundaryCondition(real vx, real vy, re
 			boundaryConditions[level]->geometryBoundaryCondition->vy = vy;
 			boundaryConditions[level]->geometryBoundaryCondition->vz = vz;
 			boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
+
+            boundaryConditions[level]->geometryBoundaryCondition->fillVelocityLists();
+
+            *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry Velocity BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n";
 		}
     }
 }
@@ -110,6 +100,8 @@ void LevelGridBuilder::setPressureBoundaryCondition(SideType sideType, real rho)
         pressureBoundaryCondition->side->addIndices(grids, level, pressureBoundaryCondition);
 
         boundaryConditions[level]->pressureBoundaryConditions.push_back(pressureBoundaryCondition);
+
+        *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Pressure BC on level " << level << " with " << (int)pressureBoundaryCondition->indices.size() <<"\n";
     }
 }
 
@@ -275,9 +267,9 @@ void LevelGridBuilder::getVelocityValues(real* vx, real* vy, real* vz, int* indi
         {
             indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[i]) +1;  
 
-            vx[allIndicesCounter] = boundaryCondition->vx;
-            vy[allIndicesCounter] = boundaryCondition->vy;
-            vz[allIndicesCounter] = boundaryCondition->vz;
+            vx[allIndicesCounter] = boundaryCondition->getVx(i);
+            vy[allIndicesCounter] = boundaryCondition->getVy(i);
+            vz[allIndicesCounter] = boundaryCondition->getVz(i);
             allIndicesCounter++;
         }
     }
@@ -408,9 +400,9 @@ void LevelGridBuilder::getGeometryValues(real* vx, real* vy, real* vz, int level
 {
     for (uint i = 0; i < boundaryConditions[level]->geometryBoundaryCondition->indices.size(); i++)
     {
-		vx[i] = boundaryConditions[level]->geometryBoundaryCondition->vx;
-		vy[i] = boundaryConditions[level]->geometryBoundaryCondition->vy;
-		vz[i] = boundaryConditions[level]->geometryBoundaryCondition->vz;
+		vx[i] = boundaryConditions[level]->geometryBoundaryCondition->getVx(i);
+		vy[i] = boundaryConditions[level]->geometryBoundaryCondition->getVy(i);
+		vz[i] = boundaryConditions[level]->geometryBoundaryCondition->getVz(i);
     }
 }
 
@@ -452,3 +444,8 @@ VF_PUBLIC SPtr<BoundaryCondition> LevelGridBuilder::getBoundaryCondition(SideTyp
 
     return nullptr;
 }
+
+VF_PUBLIC SPtr<GeometryBoundaryCondition> LevelGridBuilder::getGeometryBoundaryCondition(uint level) const
+{
+    return this->boundaryConditions[level]->geometryBoundaryCondition;
+}
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 96c3f4de4d8fe2236da3fcff0d8acb795a8d5f27..c3b28c2c50fe6b95efffec310aede3ea96e32ce0 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -78,6 +78,7 @@ public:
     VF_PUBLIC void writeArrows(std::string fileName) const;
 
     VF_PUBLIC SPtr<BoundaryCondition> getBoundaryCondition( SideType side, uint level ) const override;
+    VF_PUBLIC SPtr<GeometryBoundaryCondition> getGeometryBoundaryCondition(uint level) const override;
 
 protected:
     
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index 7e42fa7755cd139f54b9401fbe2b1fb45e094d7b..02e5978fc3a89ce927f06ebfe231a0b10dcba75b 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -445,7 +445,7 @@ void MultipleGridBuilder::buildGrids( LbmOrGks lbmOrGks, bool enableThinWalls )
 
         grids[grids.size() - 1]->mesh(solidObject);
 
-        //grids[grids.size() - 1]->closeNeedleCells();
+        grids[grids.size() - 1]->closeNeedleCells();
 
         if( enableThinWalls ){
             grids[grids.size() - 1]->enableFindSolidBoundaryNodes();
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 258f052af6145f03e4d6362f385b98884372e348..3e5d5133a4e95ae89811d6d174f77526875dda74 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -758,6 +758,11 @@ HOST real GridImp::getQValue(const uint index, const uint dir) const
 	return this->qValues[qIndex];
 }
 
+HOST uint GridImp::getQPatch(const uint index) const
+{
+    return this->qPatches[ this->qIndices[index] ];
+}
+
 HOST void GridImp::setInnerRegionFromFinerGrid(bool innerRegionFromFinerGrid)
 {
    this->innerRegionFromFinerGrid = innerRegionFromFinerGrid;
@@ -1032,14 +1037,15 @@ HOST void GridImp::closeNeedleCells()
 
     do{
         numberOfClosedNeedleCells = this->gridStrategy->closeNeedleCells( shared_from_this() );
-        *logging::out << logging::Logger::INFO_INTERMEDIATE << "  " << " cells closed!\n";
+        *logging::out << logging::Logger::INFO_INTERMEDIATE << numberOfClosedNeedleCells << " cells closed!\n";
     }
     while( numberOfClosedNeedleCells > 0 );
 }
 
 HOSTDEVICE bool GridImp::closeCellIfNeedle(uint index)
 {
-    if( !this->getField().is( index, FLUID ) ) return false;
+    //if( !this->getField().is( index, FLUID ) ) return false;
+    if( !this->getField().is( index, BC_SOLID ) ) return false;
 
     real x, y, z;
     this->transIndexToCoords(index, x, y, z);
@@ -1203,6 +1209,9 @@ HOSTDEVICE void GridImp::calculateQs(const uint index, const Vertex &point, cons
                  subdistance < this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] )
 			{
 				this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance;
+
+                this->qPatches[ this->qIndices[index] ] = triangle.patchIndex;
+
 				//printf("%d %f \n", this->qIndices[index], subdistance);
 			}
 		}
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 96e9ae2f0dd81829f2adb90eb1ccfb0d1f62ecf7..576704bf7383d029f0ac7707e0fc1428123d309b 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -73,6 +73,7 @@ private:
 
 	uint *qIndices;
 	real *qValues;
+    uint *qPatches;
 
     bool innerRegionFromFinerGrid;
 
@@ -111,6 +112,7 @@ public:
 	HOST void setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes) override;
 
 	HOST real getQValue(const uint index, const uint dir) const override;
+	HOST uint getQPatch(const uint index) const override;
 
     HOST void setInnerRegionFromFinerGrid( bool innerRegionFromFinerGrid ) override;
 
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index c163690de84d9aca67660d7577f5144026010fb1..ebcae9696785a20bfa6cb5ee16011d705cd7aae8 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -92,6 +92,7 @@ public:
 	void setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes) override {}
 
 	real getQValue(const uint index, const uint dir) const override { return 0.0; }
+	uint getQPatch(const uint index) const override { return 0.0; }
 
     void setInnerRegionFromFinerGrid( bool innerRegionFromFinerGrid ) override {};
 
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
index 250bdbdda9127f48e87a6085c8c8b7e9a722f58a..197155678446b412554b2e077b20edcce1b2c4f3 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
@@ -41,6 +41,8 @@ void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid)
 
 void GridCpuStrategy::allocateQs(SPtr<GridImp> grid)
 {
+    grid->qPatches = new uint[grid->getNumberOfSolidBoundaryNodes()];
+
 	const uint numberOfQs = grid->getNumberOfSolidBoundaryNodes() * (grid->distribution.dir_end + 1);
 	grid->qValues = new real[numberOfQs];
 #pragma omp parallel for
diff --git a/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
index 7edcd2e6225ed04b5cf80fc1debe968364a5e608..f41086ac8ab09842b3cc6aac83ad50e129e547c7 100644
--- a/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
+++ b/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
@@ -74,10 +74,11 @@ void GridProvider::setInitalNodeValues(const int numberOfNodes, const int level)
         }
 
 
+        // initial condition
 
         para->getParH(level)->rho_SP[j] = 0.0;
 
-        para->getParH(level)->vx_SP[j] = 0.02;
+        para->getParH(level)->vx_SP[j] = 0.0;
         para->getParH(level)->vy_SP[j] = 0.0;
         para->getParH(level)->vz_SP[j] = 0.0;
 
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index 6e54b79ac9d80b52cd24a2c61612f11a912de5eb..0f2dfbb761911f4a06f72959f3d1ed771d10f7f5 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -49,6 +49,7 @@
 #include "utilities/math/Math.h"
 
 #include "grid/BoundaryConditions/Side.h"
+#include "grid/BoundaryConditions/BoundaryCondition.h"
 
 std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
 {
@@ -278,35 +279,39 @@ void multipleLevel(const std::string& configPath)
     // DrivAer
     //////////////////////////////////////////////////////////////////////////
 
-	//real dx = 0.2;
-	//real vx = 0.1;
-
-	//TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_Fastback_Coarse.stl");
-	////TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_Coarse.stl");
-	////TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_NoSTLGroups.stl");
-	////TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_Fastback_Coarse_200k.stl");
-	////TriangularMesh* triangularMesh = TriangularMesh::make("M:/TestGridGeneration/STL/DrivAer_NoSTLGroups.stl");
-	////TriangularMesh* triangularMesh = TriangularMesh::make("M:/TestGridGeneration/STL/DrivAer_Coarse.stl");
-	//gridBuilder->addCoarseGrid(-5, -5, -0.4, 15, 5, 5, dx);  // DrivAer
- //   //gridBuilder->addGrid(new Cuboid(-1.5, -1.2, -1.5, 6.5, 1.5, 1.5), 2);
- //   //gridBuilder->addGrid(triangularMesh, 3);                 // DrivAer
+	real dx = 0.2;
+	real vx = 0.05;
 
- //   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 );
+	TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_Fastback_Coarse.stl");
+	//TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_Coarse.stl");
+	//TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_NoSTLGroups.stl");
+	//TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_Fastback_Coarse_200k.stl");
+	//TriangularMesh* triangularMesh = TriangularMesh::make("M:/TestGridGeneration/STL/DrivAer_NoSTLGroups.stl");
+	//TriangularMesh* triangularMesh = TriangularMesh::make("M:/TestGridGeneration/STL/DrivAer_Coarse.stl");
 
- //   Conglomerate* refRegion = new Conglomerate();
+    real z0 = 0.318+0.5*dx;
 
- //   refRegion->add(floorBox);
- //   refRegion->add(wakeBox);
- //   refRegion->add(triangularMesh);
+	gridBuilder->addCoarseGrid(- 5.0, -5.0, 0.0 - z0,
+                                15.0,  5.0, 5.0 - z0, dx);  // DrivAer
+    //gridBuilder->addGrid(new Cuboid(-1.5, -1.2, -1.5, 6.5, 1.5, 1.5), 2);
+    //gridBuilder->addGrid(triangularMesh, 3);                 // DrivAer
 
- //   gridBuilder->setNumberOfLayers(15,8);
- //   gridBuilder->addGrid(refRegion, 2);
- //   
- //   gridBuilder->setNumberOfLayers(10,8);
- //   gridBuilder->addGrid(triangularMesh, 3);
+    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 );
 
-	//gridBuilder->addGeometry(triangularMesh);
+    Conglomerate* refRegion = new Conglomerate();
+
+    refRegion->add(floorBox);
+    refRegion->add(wakeBox);
+    refRegion->add(triangularMesh);
+
+    gridBuilder->setNumberOfLayers(15,8);
+    gridBuilder->addGrid(refRegion, 4);
+    
+    //gridBuilder->setNumberOfLayers(10,8);
+    //gridBuilder->addGrid(triangularMesh, 5);
+
+	gridBuilder->addGeometry(triangularMesh);
     
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // DLC
@@ -353,19 +358,20 @@ void multipleLevel(const std::string& configPath)
     // Testing layer refinement
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-    real dx = 0.25;
-    real vx = 0.002;
+    //real dx = 0.25;
+    //real vx = 0.02;
 
-    TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/Box_2.00.stl");
+    ////TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/Box_2.00.stl");
+    //TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/STL_Group_Test.stl");
 
-    gridBuilder->addCoarseGrid(-4, -4, -4,
-                                4,  4,  4, dx);
+    //gridBuilder->addCoarseGrid(-6, -4, -4,
+    //                            6,  12,  4, dx);
 
-    gridBuilder->setNumberOfLayers(8, 8);   // this must come before the grids are added!!!
-    
-    gridBuilder->addGrid(triangularMesh, 1);
+    //gridBuilder->setNumberOfLayers(15, 8);   // this must come before the grids are added!!!
+    //
+    //gridBuilder->addGrid(triangularMesh, 2);
 
-    gridBuilder->addGeometry(triangularMesh);
+    //gridBuilder->addGeometry(triangularMesh);
 
     //gridBuilder->addGrid( new Sphere( 0, 0, 0, 0.0005 ), 12 );
     //gridBuilder->addGrid( new Cuboid( -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 ), 3 );
@@ -471,13 +477,13 @@ void multipleLevel(const std::string& configPath)
 	//BCs
     //gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.0, 0.0, 0.0);
     //gridBuilder->setVelocityBoundaryCondition(SideType::MX, 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);
+    gridBuilder->setVelocityBoundaryCondition(SideType::PY, 0.0, vx, 0.0);
+    gridBuilder->setVelocityBoundaryCondition(SideType::MY, 0.0, vx, 0.0);
+	gridBuilder->setVelocityBoundaryCondition(SideType::PZ, 0.0, vx, 0.0);
+	gridBuilder->setVelocityBoundaryCondition(SideType::MZ, 0.0, vx, 0.0);
 
     gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx , 0.0, 0.0);
+    gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.0, vx , 0.0);
 
 	////////////////////////////////////////////////////////////////////////////
 
@@ -489,6 +495,21 @@ void multipleLevel(const std::string& configPath)
 
     gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
 
+    {
+        //gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setVelocityForPatch(0, vx, 0.0, 0.0);
+
+        SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
+
+        // Walze:
+        //gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 1, 0.0, -1.0, 0.0,
+        //                                                                                                                         0.0,  1.0, 0.0, -5.0 * vx, 1.0);
+
+        // DrivAer
+        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->setVelocityBoundaryCondition(SideType::PX, 0.001, 0.0, 0.0);
     //gridBuilder->setVelocityBoundaryCondition(SideType::MY, 0.001, 0.0, 0.0);
@@ -601,7 +622,7 @@ void multipleLevel(const std::string& configPath)
 	//}
 
     //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
-    SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
+    //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
 
     //return;
 
@@ -627,22 +648,7 @@ void multipleLevel(const std::string& configPath)
 
 int main( int argc, char* argv[])
 {
-    //try
-    //{
-    //    throw std::exception("Test");
-    //}
-    //catch (std::exception e)
-    //{
-    //	std::cout << e.what() << std::endl;
-    //}
-
-    //return 0;
-
-
-
-
-
-    MPI_Init(&argc, &argv);
+     MPI_Init(&argc, &argv);
     std::string str, str2; 
     if ( argv != NULL )
     {