diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index 178c9d6c708a1b7a389802aba5eebce18db478e3..c3d05b330b72af30436cc2479b92200e1fff312a 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -72,6 +72,9 @@ public:
 
 
     HOST virtual void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) = 0;
+    HOST virtual void setPeriodicityX(bool periodicity) = 0;
+    HOST virtual void setPeriodicityY(bool periodicity) = 0;
+    HOST virtual void setPeriodicityZ(bool periodicity) = 0;
     HOST virtual void freeMemory() = 0;
 
 
diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
index 78521d070e9c329cc2190b7df8fdce169aee25b2..35b2702e42a1de934a0194c829bdd1c0f7d839de 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -64,6 +64,12 @@ public:
     virtual void setOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) = 0;
     virtual void setOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) = 0;
 
+
+
+
+    virtual uint getVelocitySize(int level) const = 0;
+    virtual void getVelocityValues(real* vx, real* vy, real* vz, int* indices, int level) const = 0;
+    virtual void getVelocityQs(real* qs[27], int level) const = 0;
 };
 
 #endif
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index b5badc0a3b1b437573f8b3690a185a27a5c314e4..7b3d256dc449f842a06d60cfeadd34263684f8c7 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -48,6 +48,12 @@ std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(Device device, co
     return SPtr<LevelGridBuilder>(new LevelGridBuilder(device, d3qxx));
 }
 
+void LevelGridBuilder::setVelocityBoundaryCondition(SPtr<Side> side, SPtr<VelocityBoundaryCondition> boundaryCondition)
+{
+    side->setPeriodicy(grids[0]);
+    velocityBoundaryConditions.push_back(boundaryCondition);
+    boundaryCondition->side = side;
+}
 
 void LevelGridBuilder::copyDataFromGpu()
 {
@@ -197,6 +203,54 @@ void LevelGridBuilder::setOutflowValues(real* RhoBC, int* kN, int channelSide, i
     }
 }
 
+
+uint LevelGridBuilder::getVelocitySize(int level) const
+{
+    uint size = 0;
+    for (auto boundaryCondition : this->velocityBoundaryConditions)
+    {
+        size += boundaryCondition->indices.size();
+    }
+    return size;
+}
+
+void LevelGridBuilder::getVelocityValues(real* vx, real* vy, real* vz, int* indices, int level) const
+{
+    int allIndicesCounter = 0;
+    for (auto boundaryCondition : this->velocityBoundaryConditions)
+    {
+        for(int i = 0; i < boundaryCondition->indices.size(); i++)
+        {
+            indices[allIndicesCounter] = boundaryCondition->indices[i];
+            vx[allIndicesCounter] = boundaryCondition->vx;
+            vy[allIndicesCounter] = boundaryCondition->vy;
+            vz[allIndicesCounter] = boundaryCondition->vz;
+            allIndicesCounter++;
+        }
+    }
+}
+
+void LevelGridBuilder::getVelocityQs(real* qs[27], int level) const
+{
+    int allIndicesCounter = 0;
+    for (auto boundaryCondition : this->velocityBoundaryConditions)
+    {
+        for (int i = 0; i < boundaryCondition->indices.size(); i++)
+        {
+
+            for (int dir = 0; dir < grids[level]->getEndDirection(); dir++)
+            {
+                if (grids[level]->getDirection()[dir * DIMENSION + boundaryCondition->side->getCoordinate()] != boundaryCondition->side->getDirection())
+                    qs[dir][allIndicesCounter] = -1.0;
+                else
+                    qs[dir][allIndicesCounter] = 0.5;
+            }
+            allIndicesCounter++;
+        }
+    }
+}
+
+
 void LevelGridBuilder::setVelocityValues(real* vx, real* vy, real* vz, int channelSide, int level) const
 {
     for (int index = 0; index < Qs[channelSide].size(); index++) {
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 0a8ac5ecf7a88800e8d616aa166fd2f7f534b279..3fd5b6ce99feef520393d2dcb71a76ca95a9f051 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -6,24 +6,225 @@
 #include <vector>
 #include <string>
 #include <memory>
+#include <map>
 
 #include "GridBuilder.h"
 #include "grid/GridInterface.h"
 
+#include "grid/Grid.h"
+#include "grid/NodeValues.h"
+
 struct Vertex;
 class  Grid;
 class Transformator;
 class ArrowTransformator;
 class PolyDataWriterWrapper;
-
+class BoundaryCondition;
 class BoundingBox;
 enum class Device;
 
-enum class BoundaryCondition
+class Side;
+
+class BoundaryCondition
+{
+public:
+    std::vector<uint> indices;
+
+};
+
+
+class VelocityBoundaryCondition : public BoundaryCondition
 {
-    PERIODIC, VELOCITY, PRESSURE, SLIP, NOSLIP
+public:
+    static SPtr<VelocityBoundaryCondition> make(real vx, real vy, real vz)
+    {
+        return SPtr<VelocityBoundaryCondition>(new VelocityBoundaryCondition(vx, vy, vz));
+    }
+
+    SPtr<Side> side;
+    real vx, vy, vz;
+private:
+    VelocityBoundaryCondition(real vx, real vy, real vz) : vx(vx), vy(vy), vz(vz)
+    {
+        
+    } 
 };
 
+#define X_INDEX 0
+#define Y_INDEX 1
+#define Z_INDEX 2
+
+#define POSITIVE_DIR 1
+#define NEGATIVE_DIR -1
+
+class Side
+{
+public:
+    virtual void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) = 0;
+    virtual void setPeriodicy(SPtr<Grid> grid) = 0;
+    
+    virtual int getCoordinate() const = 0;
+    virtual int getDirection() const = 0;
+
+protected:
+    static void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant, real startInner, real endInner, real startOuter, real endOuter) {
+        for (int v1 = startInner; v1 < endInner; v1 += grid->getDelta())
+        {
+            for (int v2 = startOuter; v2 < endOuter; v2 += grid->getDelta())
+            {
+                uint index = getIndex(grid, coord, constant, v1, v2);
+                if (grid->getFieldEntry(index) == FLUID)
+                    boundaryCondition->indices.push_back(index);
+            }
+        }
+    }
+
+    static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2)
+    {
+        if (coord == "x")
+            return grid->transCoordToIndex(constant, v1, v2);
+        if (coord == "y")
+            return grid->transCoordToIndex(v1, constant, v2);
+        if (coord == "z")
+            return grid->transCoordToIndex(v1, v2, constant);
+    }
+};
+
+class MX : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override {
+        grid->setPeriodicityX(false);
+    }
+
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override {
+        Side::addIndices(grid, boundaryCondition, "x", grid->getStartX() + grid->getDelta(),  grid->getStartY(), grid->getEndY(),grid->getStartZ(), grid->getEndZ());
+    }
+
+    int getCoordinate() const override
+    {
+        return X_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return NEGATIVE_DIR;
+    }
+};
+
+class PX : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override {
+        grid->setPeriodicityX(false);
+    }
+
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override {
+        Side::addIndices(grid, boundaryCondition, "x", grid->getEndX() - grid->getDelta(),  grid->getStartY(), grid->getEndY(), grid->getStartZ(), grid->getEndZ());
+    }
+
+    int getCoordinate() const override
+    {
+        return X_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return POSITIVE_DIR;
+    }
+};
+
+
+class MY : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override {
+        grid->setPeriodicityY(false);
+    }
+
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override {
+        Side::addIndices(grid, boundaryCondition, "y", grid->getStartY() + grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartZ(), grid->getEndZ());
+    }
+
+    int getCoordinate() const override
+    {
+        return Y_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return NEGATIVE_DIR;
+    }
+};
+
+class PY : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override {
+        grid->setPeriodicityY(false);
+    }
+
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override {
+        Side::addIndices(grid, boundaryCondition, "y", grid->getEndY() - grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartZ(), grid->getEndZ());
+    }
+
+    int getCoordinate() const override
+    {
+        return Y_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return POSITIVE_DIR;
+    }
+};
+
+
+class MZ : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override {
+        grid->setPeriodicityZ(false);
+    }
+
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override {
+        Side::addIndices(grid, boundaryCondition, "z", grid->getStartZ() + grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartY(), grid->getEndY());
+    }
+
+    int getCoordinate() const override
+    {
+        return Z_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return NEGATIVE_DIR;
+    }
+};
+
+class PZ : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override {
+        grid->setPeriodicityZ(false);
+    }
+
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override {
+        Side::addIndices(grid, boundaryCondition, "z", grid->getEndZ() - grid->getDelta(), grid->getStartX(), grid->getEndX(), grid->getStartY(), grid->getEndY());
+    }
+
+    int getCoordinate() const override
+    {
+        return Z_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return POSITIVE_DIR;
+    }
+};
+
+
 class LevelGridBuilder : public GridBuilder
 {
 protected:
@@ -37,6 +238,7 @@ public:
     VF_PUBLIC void copyDataFromGpu();
     VF_PUBLIC virtual ~LevelGridBuilder();
 
+    VF_PUBLIC void setVelocityBoundaryCondition(SPtr<Side> side, SPtr<VelocityBoundaryCondition> boundaryCondition);
 
     VF_PUBLIC virtual std::shared_ptr<Grid> getGrid(int level, int box);
 
@@ -60,6 +262,12 @@ public:
     VF_PUBLIC virtual void setQs(real** q27, int* k, int channelSide, unsigned int level) const;
     VF_PUBLIC virtual void setOutflowValues(real* RhoBC, int* kN, int channelSide, int level) const;
     VF_PUBLIC virtual void setVelocityValues(real* vx, real* vy, real* vz, int channelSide, int level) const;
+
+    VF_PUBLIC uint getVelocitySize(int level) const;
+    VF_PUBLIC virtual void getVelocityValues(real* vx, real* vy, real* vz, int* indices, int level) const;
+    VF_PUBLIC virtual void getVelocityQs(real* qs[27], int level) const;
+
+
     VF_PUBLIC virtual void setPressValues(real* RhoBC, int* kN, int channelSide, int level) const;
 
     VF_PUBLIC void writeArrows(std::string fileName, std::shared_ptr<ArrowTransformator> trans) const;
@@ -67,10 +275,11 @@ public:
 protected:
 
     std::vector<std::shared_ptr<Grid> > grids;
-
     std::vector<std::vector<std::vector<real> > > Qs;
     std::vector<std::string> channelBoundaryConditions;
-    std::vector<BoundaryCondition> channelBoundaryConditionTypes;
+    std::vector<SPtr<VelocityBoundaryCondition> > velocityBoundaryConditions;
+
+    //std::map<Side, BoundaryCondition> channelBoundaryConditionTypes;
 
     void checkLevel(int level);
 
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index 04a351dcacce7e5057fa0590ab00dd00e94f038c..210aeae6e350a8b0552df0d2541ad88314e99d49 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -263,6 +263,13 @@ void MultipleGridBuilder::buildGrids()
         grids[i]->findSparseIndices(grids[i + 1]);
 
     grids[grids.size() - 1]->findSparseIndices(nullptr);
+
+
+
+    for(auto velocityBC : velocityBoundaryConditions)
+    {
+        velocityBC->side->addIndices(grids[0], velocityBC);
+    }
 }
 
 
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index ae4f1ef2cc0093adb489c7e836abbf430fe8eed9..f2f4c5d50a08aae8cd7af1bce50789648d6559ca 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -305,8 +305,20 @@ HOST void GridImp::setPeriodicity(bool periodicityX, bool periodicityY, bool per
     this->periodicityZ = periodicityZ;
 }
 
+void GridImp::setPeriodicityX(bool periodicity)
+{
+    this->periodicityX = periodicityX;
+}
 
+void GridImp::setPeriodicityY(bool periodicity)
+{
+    this->periodicityY = periodicityY;
+}
 
+void GridImp::setPeriodicityZ(bool periodicity)
+{
+    this->periodicityZ = periodicityZ;
+}
 
 HOSTDEVICE int GridImp::transCoordToIndex(const real &x, const real &y, const real &z) const
 {
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 081c3deb9c873277f44f55dd049e3fc8407c9f40..40b88ece864a883361de345c847860c25e8d3c3b 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -71,6 +71,10 @@ public:
     HOSTDEVICE void removeOddBoundaryCellNode(uint index);
 
     HOST void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) override;
+    void setPeriodicityX(bool periodicity) override;
+    void setPeriodicityY(bool periodicity) override;
+    void setPeriodicityZ(bool periodicity) override;
+
     HOSTDEVICE void setCellTo(uint index, char type);
 
     HOSTDEVICE int transCoordToIndex(const real &x, const real &y, const real &z) const override;
@@ -176,7 +180,7 @@ private:
 	HOSTDEVICE void calculateQs(const Vertex &point, const Triangle &actualTriangle) const;
 
 
-public:
+
 private:
     //HOSTDEVICE bool isNeighborInside(const int &index) const;
 
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index acc119c2c49c2cb0b00f5c444811035a4d825dc2..c87bd236329200f80ce9c0831b912863de11655e 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -67,6 +67,9 @@ public:
     virtual Vertex getMinimumOnNode(Vertex exact) const override { return Vertex(0, 0, 0); }
     virtual Vertex getMaximumOnNode(Vertex exact) const override { return Vertex(0, 0, 0); }
     virtual void mesh(Object* object) override {}
+    void setPeriodicityX(bool periodicity) override {}
+    void setPeriodicityY(bool periodicity) override {}
+    void setPeriodicityZ(bool periodicity) override {}
 };
 
 class GridStub : public GridDummy
diff --git a/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index 3bebefabefe3b45d2ff908804e6306135b758550..dd99e1fb6d7554cb0e4e4fa8e4d4d0a3e7be24bb 100644
--- a/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -7,6 +7,7 @@
 #include <sstream>
 #include <iostream>
 #include "utilities/math/Math.h"
+#include "LBM/LB.h"
 
 
 std::shared_ptr<GridProvider> GridGenerator::make(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para)
@@ -124,14 +125,64 @@ void GridGenerator::allocArrays_BoundaryValues()
 {
 	std::cout << "------read BoundaryValues------" << std::endl;
 
-	channelBoundaryConditions = builder->getTypeOfBoundaryConditions();
-
-	for (int i = 0; i < channelBoundaryConditions.size(); i++)
-	{
-        setVelocityValues(i);
-        setPressureValues(i); 
-        setOutflowValues(i); 
-	}
+    for (int i = 0; i < builder->getNumberOfGridLevels(); i++) {
+        const int numberOfVelocityValues = int(builder->getVelocitySize(i));
+        if (numberOfVelocityValues > 1)
+        {
+            cout << "size velocity level " << i << " : " << numberOfVelocityValues << endl;
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            int blocks = (numberOfVelocityValues / para->getParH(i)->numberofthreads) + 1;
+            para->getParH(i)->Qinflow.kArray = blocks * para->getParH(i)->numberofthreads;
+            para->getParD(i)->Qinflow.kArray = para->getParH(i)->Qinflow.kArray;
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            para->getParH(i)->Qinflow.kQ = numberOfVelocityValues;
+            para->getParD(i)->Qinflow.kQ = numberOfVelocityValues;
+            para->getParH(i)->kInflowQ = numberOfVelocityValues;
+            para->getParD(i)->kInflowQ = numberOfVelocityValues;
+            para->getParH(i)->kInflowQread = numberOfVelocityValues * para->getD3Qxx();
+            para->getParD(i)->kInflowQread = numberOfVelocityValues * para->getD3Qxx();
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            para->cudaAllocVeloBC(i);
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            builder->getVelocityValues(para->getParH(i)->Qinflow.Vx, para->getParH(i)->Qinflow.Vy, para->getParH(i)->Qinflow.Vz, para->getParH(i)->Qinflow.k, i);
+
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+            //para->cudaCopyVeloBC(i);
+
+
+
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //// advection - diffusion stuff
+            //if (para->getDiffOn()==true){
+            //	//////////////////////////////////////////////////////////////////////////
+            //	para->getParH(i)->TempVel.kTemp = temp2;
+            //	//cout << "Groesse kTemp = " << para->getParH(i)->TempPress.kTemp << endl;
+            //	cout << "getTemperatureInit = " << para->getTemperatureInit() << endl;
+            //	cout << "getTemperatureBC = " << para->getTemperatureBC() << endl;
+            //	//////////////////////////////////////////////////////////////////////////
+            //	para->cudaAllocTempVeloBC(i);
+            //	//cout << "nach alloc " << endl;
+            //	//////////////////////////////////////////////////////////////////////////
+            //	for (int m = 0; m < temp2; m++)
+            //	{
+            //		para->getParH(i)->TempVel.temp[m]      = para->getTemperatureInit();
+            //		para->getParH(i)->TempVel.tempPulse[m] = para->getTemperatureBC();
+            //		para->getParH(i)->TempVel.velo[m]      = para->getVelocity();
+            //		para->getParH(i)->TempVel.k[m]         = para->getParH(i)->Qinflow.k[m];
+            //	}
+            //	//////////////////////////////////////////////////////////////////////////
+            //	//cout << "vor copy " << endl;
+            //	para->cudaCopyTempVeloBCHD(i);
+            //	//cout << "nach copy " << endl;
+            //	//////////////////////////////////////////////////////////////////////////
+            //}
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        }
+    }
 }
 
 void GridGenerator::setPressureValues(int channelSide) const
@@ -236,18 +287,87 @@ void GridGenerator::allocArrays_BoundaryQs()
 {
 	std::cout << "------read BoundaryQs-------" << std::endl;
 
-	channelBoundaryConditions = builder->getTypeOfBoundaryConditions();
+    for (int i = 0; i < builder->getNumberOfGridLevels(); i++) {
+        const int numberOfVelocityNodes = int(builder->getVelocitySize(i));
+        if (numberOfVelocityNodes > 0)
+        {
+            cout << "size velocity level " << i << " : " << numberOfVelocityNodes << endl;
+            //cout << "Groesse velocity level:  " << i << " : " << temp3 << "MyID: " << para->getMyID() << endl;
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //preprocessing
+            real* QQ = para->getParH(i)->Qinflow.q27[0];
+            unsigned int sizeQ = para->getParH(i)->Qinflow.kQ;
+            QforBoundaryConditions Q;
+            Q.q27[dirE] = &QQ[dirE   *sizeQ];
+            Q.q27[dirW] = &QQ[dirW   *sizeQ];
+            Q.q27[dirN] = &QQ[dirN   *sizeQ];
+            Q.q27[dirS] = &QQ[dirS   *sizeQ];
+            Q.q27[dirT] = &QQ[dirT   *sizeQ];
+            Q.q27[dirB] = &QQ[dirB   *sizeQ];
+            Q.q27[dirNE] = &QQ[dirNE  *sizeQ];
+            Q.q27[dirSW] = &QQ[dirSW  *sizeQ];
+            Q.q27[dirSE] = &QQ[dirSE  *sizeQ];
+            Q.q27[dirNW] = &QQ[dirNW  *sizeQ];
+            Q.q27[dirTE] = &QQ[dirTE  *sizeQ];
+            Q.q27[dirBW] = &QQ[dirBW  *sizeQ];
+            Q.q27[dirBE] = &QQ[dirBE  *sizeQ];
+            Q.q27[dirTW] = &QQ[dirTW  *sizeQ];
+            Q.q27[dirTN] = &QQ[dirTN  *sizeQ];
+            Q.q27[dirBS] = &QQ[dirBS  *sizeQ];
+            Q.q27[dirBN] = &QQ[dirBN  *sizeQ];
+            Q.q27[dirTS] = &QQ[dirTS  *sizeQ];
+            Q.q27[dirZERO] = &QQ[dirZERO*sizeQ];
+            Q.q27[dirTNE] = &QQ[dirTNE *sizeQ];
+            Q.q27[dirTSW] = &QQ[dirTSW *sizeQ];
+            Q.q27[dirTSE] = &QQ[dirTSE *sizeQ];
+            Q.q27[dirTNW] = &QQ[dirTNW *sizeQ];
+            Q.q27[dirBNE] = &QQ[dirBNE *sizeQ];
+            Q.q27[dirBSW] = &QQ[dirBSW *sizeQ];
+            Q.q27[dirBSE] = &QQ[dirBSE *sizeQ];
+            Q.q27[dirBNW] = &QQ[dirBNW *sizeQ];
+
+            builder->getVelocityQs(Q.q27, i);
+
+            if (para->getDiffOn()) {
+                //////////////////////////////////////////////////////////////////////////
+                para->getParH(i)->TempVel.kTemp = numberOfVelocityNodes;
+                para->getParD(i)->TempVel.kTemp = numberOfVelocityNodes;
+                cout << "Groesse TempVel.kTemp = " << para->getParH(i)->TempPress.kTemp << endl;
+                cout << "getTemperatureInit = " << para->getTemperatureInit() << endl;
+                cout << "getTemperatureBC = " << para->getTemperatureBC() << endl;
+                //////////////////////////////////////////////////////////////////////////
+                para->cudaAllocTempVeloBC(i);
+                //cout << "nach alloc " << endl;
+                //////////////////////////////////////////////////////////////////////////
+                for (int m = 0; m < numberOfVelocityNodes; m++)
+                {
+                    para->getParH(i)->TempVel.temp[m] = para->getTemperatureInit();
+                    para->getParH(i)->TempVel.tempPulse[m] = para->getTemperatureBC();
+                    para->getParH(i)->TempVel.velo[m] = para->getVelocity();
+                    para->getParH(i)->TempVel.k[m] = para->getParH(i)->Qinflow.k[m];
+                }
+                //////////////////////////////////////////////////////////////////////////
+                //cout << "vor copy " << endl;
+                para->cudaCopyTempVeloBCHD(i);
+                //cout << "nach copy " << endl;
+                //////////////////////////////////////////////////////////////////////////
+            }
+            para->cudaCopyVeloBC(i);
+        }
+    }
 
-	for (int i = 0; i < channelBoundaryConditions.size(); i++)
-	{
-		if (this->channelBoundaryConditions[i] == "noSlip") { setNoSlipQs(i); }
-		else if (this->channelBoundaryConditions[i] == "velocity") { setVelocityQs(i); }
-		else if (this->channelBoundaryConditions[i] == "pressure") { setPressQs(i); }
-		else if (this->channelBoundaryConditions[i] == "outflow") { setOutflowQs(i); }
-	}
+	//channelBoundaryConditions = builder->getTypeOfBoundaryConditions();
+
+	//for (int i = 0; i < channelBoundaryConditions.size(); i++)
+	//{
+	//	if (this->channelBoundaryConditions[i] == "noSlip") { setNoSlipQs(i); }
+	//	else if (this->channelBoundaryConditions[i] == "velocity") { setVelocityQs(i); }
+	//	else if (this->channelBoundaryConditions[i] == "pressure") { setPressQs(i); }
+	//	else if (this->channelBoundaryConditions[i] == "outflow") { setOutflowQs(i); }
+	//}
 
-	if (para->getIsGeo())
-		setGeoQs();
+	//if (para->getIsGeo())
+	//	setGeoQs();
 
 	std::cout << "-----finish BoundaryQs------" << std::endl;
 }
diff --git a/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h b/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
index 6a3df5fa441919264ec00f70ccbb5a780521f074..bba2a47975069fd5b0a9e0c836238bc2e1fa7c00 100644
--- a/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
+++ b/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
@@ -7,10 +7,12 @@
 #include <string>
 #include <memory>
 
-#include "LBM/LB.h"
+#include <core/DataTypes.h>
 
 class Parameter;
 class GridBuilder;
+struct QforBC;
+typedef QforBC QforBoundaryConditions;
 
 class GridGenerator
 	: public GridProvider
@@ -55,12 +57,12 @@ private:
 	void setGeoQs() const;
 	void modifyQElement(int channelSide, unsigned int level) const;
 
-	void initalQStruct(QforBoundaryConditions& Q,int channelSide, unsigned int level) const;
-	void printQSize(std::string bc,int channelSide, unsigned int level) const;
-	void setSizeNoSlip(int channelSide, unsigned int level) const;
-	void setSizeGeoQs(unsigned int level) const;
-	void setQ27Size(QforBoundaryConditions &Q, real* QQ, unsigned int sizeQ) const;
-	bool hasQs(int channelSide, unsigned int level) const;
+    void initalQStruct(QforBoundaryConditions& Q, int channelSide, unsigned int level) const;
+    void printQSize(std::string bc, int channelSide, unsigned int level) const;
+    void setSizeNoSlip(int channelSide, unsigned int level) const;
+    void setSizeGeoQs(unsigned int level) const;
+    void setQ27Size(QforBoundaryConditions &Q, real* QQ, unsigned int sizeQ) const;
+    bool hasQs(int channelSide, unsigned int level) const;
 
 public:
     void initalGridInformations() override;
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index f1f8b2808543c44855008b2d65e13b8a323d818b..ba182b1ca25aca5e25573d3919526686ad0ab9b7 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -11,11 +11,13 @@
 
 #include "LBM/Simulation.h"
 
+#include "DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
+#include "grid/GridBuilder/LevelGridBuilder.h"
+
 #include "Parameter/Parameter.h"
 #include "DataStructureInitializer/GridProvider.h"
 #include "VirtualFluidsBasics/utilities/input/Input.h"
 #include "VirtualFluidsBasics/utilities/StringUtil/StringUtil.h"
-#include "grid/GridBuilder/LevelGridBuilder.h"
 #include "utilities/transformator/TransformatorImp.h"
 #include "io/GridVTKWriter/GridVTKWriter.h"
 
@@ -34,8 +36,7 @@
 #include "io/STLReaderWriter/STLWriter.h"
 #include "geometries/TriangularMesh/TriangularMeshStrategy.h"
 #include "Output/FileWriter.h"
-#include "DataStructureInitializer/GridReaderFiles/GridReader.h"
-#include "DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
+//#include "DataStructureInitializer/GridReaderFiles/GridReader.h"
 
 
 std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
@@ -269,10 +270,29 @@ void multipleLevel(const std::string& configPath)
 
 
     gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0);
-    gridBuilder->addGrid(new Cuboid(-10, -8, -8, 50, 22, 22), 1);
+
+    //gridBuilder->addGrid(new Cuboid(-10, -8, -8, 50, 22, 22), 1);
+
     TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl");
+
     gridBuilder->addGeometry(triangularMesh);
 
+    SPtr<VelocityBoundaryCondition> bcVelocity1 = VelocityBoundaryCondition::make(0.01, 0.0, 0.0);
+    SPtr<VelocityBoundaryCondition> bcVelocity2 = VelocityBoundaryCondition::make(0.01, 0.0, 0.0);
+    SPtr<VelocityBoundaryCondition> bcVelocity3 = VelocityBoundaryCondition::make(0.01, 0.0, 0.0);
+    SPtr<VelocityBoundaryCondition> bcVelocity4 = VelocityBoundaryCondition::make(0.01, 0.0, 0.0);
+    SPtr<VelocityBoundaryCondition> bcVelocity5 = VelocityBoundaryCondition::make(0.01, 0.0, 0.0);
+    SPtr<VelocityBoundaryCondition> bcVelocity6 = VelocityBoundaryCondition::make(0.01, 0.0, 0.0);
+
+    gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new MX()), bcVelocity1);
+    gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new PX()), bcVelocity2);
+    gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new MY()), bcVelocity3);
+    gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new PY()), bcVelocity4);
+    gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new MZ()), bcVelocity5);
+    gridBuilder->setVelocityBoundaryCondition(SPtr<Side>(new PZ()), bcVelocity6);
+
+    //gridBuilder->setBoundaryCondition("geometry", BoundaryCondition::VELOCITY);
+
 
     //TriangleOffsetSurfaceGeneration::createOffsetTriangularMesh(triangularMesh, 5);
 
@@ -296,7 +316,7 @@ void multipleLevel(const std::string& configPath)
 
     gridBuilder->buildGrids();
 
-    gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");
+    //gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");