diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
index 9303cd37cce1607c82c7536ee4cd350f09ab2bd7..57349a82072dbf8e64c17a1f678224a9a6e177cb 100644
--- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
+++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
@@ -44,6 +44,7 @@
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
 #include "VirtualFluids_GPU/Output/FileWriter.h"
+#include "VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h"
 
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
 
@@ -156,6 +157,7 @@ void multipleLevel(const std::string& configPath)
         config.load(configPath);
 
         SPtr<Parameter> para = std::make_shared<Parameter>(config, communicator.getNummberOfProcess(), communicator.getPID());
+        BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -208,6 +210,7 @@ void multipleLevel(const std::string& configPath)
 	    gridBuilder->setNoSlipBoundaryCondition(SideType::MY);
 	    gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx, vx, 0.0);
 	    gridBuilder->setNoSlipBoundaryCondition(SideType::MZ);
+        bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocitySimpleBounceBackCompressible);
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -219,7 +222,7 @@ void multipleLevel(const std::string& configPath)
 
         auto gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
 
-        Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator);
+        Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory);
         sim.run();
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ea17e1f4fce6a9e24ffb60e1a379fbbab1ef9ed2
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp
@@ -0,0 +1,33 @@
+#include "BoundaryConditionFactory.h"
+#include "GPU/GPU_Interface.h"
+#include "Parameter/Parameter.h"
+
+void BoundaryConditionFactory::setVelocityBoundaryCondition(VelocityBC boundaryConditionType)
+{
+    this->velocityBoundaryCondition = boundaryConditionType;
+}
+
+boundaryCondition BoundaryConditionFactory::getVelocityBoundaryConditionPost() const
+{
+    switch (this->velocityBoundaryCondition) {
+        case VelocityBC::VelocitySimpleBounceBackCompressible:
+            // VelocitySimpleBounceBackCompressible = plain bounce back velocity boundary condition
+            return QVelDevicePlainBB27;
+            break;
+        case VelocityBC::VelocityIncompressible:
+            // VelocityIncompressible = interpolated velocity boundary condition, based on subgrid distances
+            return QVelDev27;
+            break;
+        case VelocityBC::VelocityCompressible:
+            // VelocityCompressible = interpolated velocity boundary condition, based on subgrid distances
+            return QVelDevComp27;
+            break;
+        case VelocityBC::VelocityAndPressureCompressible:
+            // VelocityAndPressureCompressible = interpolated velocity boundary condition, based on subgrid distances.
+            // Also sets the pressure to the bulk pressure.
+            return QVelDevCompZeroPress27;
+            break;
+        default:
+            return nullptr;
+    }
+}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..9db2857511df85aee03069d6f7fa87f353902bb9
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h
@@ -0,0 +1,37 @@
+#ifndef BC_FACTORY
+#define BC_FACTORY
+
+#include <functional>
+#include <map>
+#include <string>
+
+#include "LBM/LB.h"
+
+class LBMSimulationParameter;
+
+using boundaryCondition = std::function<void(LBMSimulationParameter *, QforBoundaryConditions *)>;
+
+class BoundaryConditionFactory
+{
+public:
+    enum class VelocityBC {
+        VelocitySimpleBounceBackCompressible,
+        VelocityIncompressible,
+        VelocityCompressible,
+        VelocityAndPressureCompressible
+    };
+    // enum class OutflowBoundaryConditon {};  // TODO:
+    // https://git.rz.tu-bs.de/m.schoenherr/VirtualFluids_dev/-/issues/16
+
+    void setVelocityBoundaryCondition(const VelocityBC boundaryConditionType);
+    // void setOutflowBoundaryCondition(...); // TODO:
+    // https://git.rz.tu-bs.de/m.schoenherr/VirtualFluids_dev/-/issues/16
+
+    boundaryCondition getVelocityBoundaryConditionPost() const;
+
+private:
+    VelocityBC velocityBoundaryCondition;
+    // OutflowBoundaryConditon outflowBC // TODO: https://git.rz.tu-bs.de/m.schoenherr/VirtualFluids_dev/-/issues/16
+};
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
index ace81490e6880d688690f647f50172c1a94b5bfb..426bb14d6f3df1752fdda0a6ca9c8662457ffd36 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
@@ -493,17 +493,16 @@ void calcTurbulentViscosity(Parameter* para, int level)
 
 
 UpdateGrid27::UpdateGrid27(SPtr<Parameter> para, vf::gpu::Communicator &comm, SPtr<CudaMemoryManager> cudaManager,
-                           std::vector<std::shared_ptr<PorousMedia>> &pm, std::vector<SPtr<Kernel>> &kernels)
+                           std::vector<std::shared_ptr<PorousMedia>> &pm, std::vector<SPtr<Kernel>> &kernels , BoundaryConditionFactory* bcFactory)
     : para(para), comm(comm), cudaMemoryManager(cudaManager), pm(pm), kernels(kernels)
 {
     chooseFunctionForCollisionAndExchange();
     chooseFunctionForRefinementAndExchange();
-    this->lbKernelManager = LBKernelManager::make(para);
+    this->lbKernelManager = std::make_shared<LBKernelManager>(para, bcFactory);
     this->adKernelManager = std::make_shared<ADKernelManager>(para);
     this->gridScalingKernelManager =  std::make_shared<GridScalingKernelManager>(para);
 }
 
-
 void UpdateGrid27::chooseFunctionForCollisionAndExchange()
 {
     std::cout << "Function used for collisionAndExchange: ";
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
index 5ed5347ec72c3dc30d38cc98acfed229877b8d2c..db82166a78a88aab0c4031aaac08ad2cb9d95325 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
@@ -12,15 +12,15 @@ class LBKernelManager;
 class ADKernelManager;
 class GridScalingKernelManager;
 class Kernel;
+class BoundaryConditionFactory;
 
 class UpdateGrid27
 {
 public:
     UpdateGrid27(SPtr<Parameter> para, vf::gpu::Communicator &comm, SPtr<CudaMemoryManager> cudaManager,
-                 std::vector<std::shared_ptr<PorousMedia>> &pm, std::vector<SPtr<Kernel>> &kernels);
+                 std::vector<std::shared_ptr<PorousMedia>> &pm, std::vector<SPtr<Kernel>> &kernels, BoundaryConditionFactory* bcFactory);
     void updateGrid(int level, unsigned int t);
 
-
 private:
     void postCollisionBC(int level);
     void preCollisionBC(int level, unsigned int t);
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
index f85640484c43af0e155dc56348d920835c6016e5..3d232dcb8d2c1259eca51d5279b32b346e21470c 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
@@ -5,16 +5,17 @@
 // |___/_/_/   \__/\__,_/\__,_/_/_/   /_/\__,_/_/\__,_/____/   \____/_/    \_____/
 //
 //////////////////////////////////////////////////////////////////////////
-//random numbers
-#include <curand.h>
+#ifndef GPU_INTERFACE_H
+#define GPU_INTERFACE_H
+
+#include <curand.h> //random numbers
 #include <curand_kernel.h>
 #include <cuda_runtime.h>
 
 #include <DataTypes.h>
 #include "LBM/LB.h"
 
-#ifndef GPU_INTERFACE_H
-#define GPU_INTERFACE_H
+class LBMSimulationParameter;
 
 //////////////////////////////////////////////////////////////////////////
 //Kernel
@@ -723,20 +724,7 @@ extern "C" void QDevCompHighNu27(unsigned int numberOfThreads,
 								 unsigned int size_Mat, 
 								 bool isEvenTimestep);
 
-extern "C" void QVelDevicePlainBB27(unsigned int numberOfThreads,
-									real* vx,
-									real* vy,
-									real* vz,
-									real* DD,
-									int* k_Q, 
-									real* QQ,
-									unsigned int numberOfBCnodes, 
-									real om1, 
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat, 
-									bool isEvenTimestep);
+extern "C" void QVelDevicePlainBB27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 	
 extern "C" void QVelDeviceCouette27(unsigned int numberOfThreads,
 									real* vx,
@@ -775,22 +763,7 @@ extern "C" void QVelDevice1h27( unsigned int numberOfThreads,
 								unsigned int size_Mat, 
 								bool isEvenTimestep);
 
-extern "C" void QVelDev27(unsigned int numberOfThreads,
-                          int nx,
-                          int ny,
-                          real* vx,
-                          real* vy,
-                          real* vz,
-                          real* DD, 
-                          int* k_Q, 
-                          real* QQ,
-                          unsigned int numberOfBCnodes, 
-                          real om1, 
-                          unsigned int* neighborX,
-                          unsigned int* neighborY,
-                          unsigned int* neighborZ,
-                          unsigned int size_Mat, 
-                          bool isEvenTimestep);
+extern "C" void QVelDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
 extern "C" void QVelDevCompPlusSlip27(unsigned int numberOfThreads,
 									  real* vx,
@@ -807,20 +780,7 @@ extern "C" void QVelDevCompPlusSlip27(unsigned int numberOfThreads,
 									  unsigned int size_Mat, 
 									  bool isEvenTimestep);
 
-extern "C" void QVelDevComp27(unsigned int numberOfThreads,
-							  real* velocityX,
-							  real* velocityY,
-							  real* velocityZ,
-							  real* distribution,
-							  int* subgridDistanceIndices,
-							  real* subgridDistances,
-							  unsigned int numberOfBCnodes,
-							  real omega,
-							  unsigned int* neighborX,
-							  unsigned int* neighborY,
-							  unsigned int* neighborZ,
-							  unsigned int numberOfLBnodes,
-							  bool isEvenTimestep);
+extern "C" void QVelDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
 extern "C" void QVelDevCompThinWalls27(unsigned int numberOfThreads,
 							           real* vx,
@@ -839,21 +799,7 @@ extern "C" void QVelDevCompThinWalls27(unsigned int numberOfThreads,
 							           unsigned int size_Mat, 
 							           bool isEvenTimestep);
 
-extern "C" void QVelDevCompZeroPress27(
-    unsigned int numberOfThreads,
-    real* velocityX,
-    real* velocityY,
-    real* velocityZ,
-    real* distribution,
-    int* subgridDistanceIndices,
-    real* subgridDistances,
-    unsigned int numberOfBCnodes,
-    real omega,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned int numberOfLBnodes,
-    bool isEvenTimestep);
+extern "C" void QVelDevCompZeroPress27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
 extern "C" void QVelDevIncompHighNu27(  unsigned int numberOfThreads,
 										real* vx,
diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
index 42e5bd12586a49905b0cad494ee7400136fb112a..74e091bbe2598e5a9fb8f70d4be159947d10fc5f 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
@@ -15,6 +15,8 @@
 
 // includes, kernels
 #include "GPU/GPU_Kernels.cuh"
+
+#include "Parameter/Parameter.h"
 //////////////////////////////////////////////////////////////////////////
 extern "C" void KernelCas27( unsigned int grid_nx,
                              unsigned int grid_ny,
@@ -2915,50 +2917,25 @@ extern "C" void QDevCompHighNu27(   unsigned int numberOfThreads,
       getLastCudaError("QDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QVelDevicePlainBB27(unsigned int numberOfThreads,
-									real* vx,
-									real* vy,
-									real* vz,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
+extern "C" void QVelDevicePlainBB27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QVelDevPlainBB27<<< gridQ, threads >>> (  vx,
-												vy,
-												vz,
-												DD,
-												k_Q,
-												QQ,
-												numberOfBCnodes,
-												om1,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												isEvenTimestep);
-      getLastCudaError("QVelDevicePlainBB27 execution failed");
+   QVelDevPlainBB27<<< grid, threads >>> (
+         boundaryCondition->Vx,
+         boundaryCondition->Vy,
+         boundaryCondition->Vz,
+         parameterDevice->distributions.f[0],
+         boundaryCondition->k,
+         boundaryCondition->q27[0],
+         boundaryCondition->numberOfBCnodes,
+         parameterDevice->neighborX,
+         parameterDevice->neighborY,
+         parameterDevice->neighborZ,
+         parameterDevice->numberOfNodes,
+         parameterDevice->isEvenTimestep);
+   getLastCudaError("QVelDevicePlainBB27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 extern "C" void QVelDeviceCouette27(unsigned int numberOfThreads,
@@ -3067,53 +3044,27 @@ extern "C" void QVelDevice1h27(   unsigned int numberOfThreads,
       getLastCudaError("QVelDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QVelDev27(unsigned int numberOfThreads,
-                          int nx,
-                          int ny,
-                          real* vx,
-                          real* vy,
-                          real* vz,
-                          real* DD,
-                          int* k_Q,
-                          real* QQ,
-                          unsigned int numberOfBCnodes,
-                          real om1,
-                          unsigned int* neighborX,
-                          unsigned int* neighborY,
-                          unsigned int* neighborZ,
-                          unsigned int size_Mat,
-                          bool isEvenTimestep)
-{
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
-
-      QVelDevice27<<< gridQ, threads >>> (nx,
-                                          ny,
-                                          vx,
-                                          vy,
-                                          vz,
-                                          DD,
-                                          k_Q,
-                                          QQ,
-                                          numberOfBCnodes,
-                                          om1,
-                                          neighborX,
-                                          neighborY,
-                                          neighborZ,
-                                          size_Mat,
-                                          isEvenTimestep);
+extern "C" void QVelDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
+{
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+
+      QVelDevice27<<< grid, threads >>> (
+            parameterDevice->nx,
+            parameterDevice->ny,
+            boundaryCondition->Vx,
+            boundaryCondition->Vy,
+            boundaryCondition->Vz,
+            parameterDevice->distributions.f[0],
+            boundaryCondition->k,
+            boundaryCondition->q27[0],
+            boundaryCondition->numberOfBCnodes,
+            parameterDevice->omega,
+            parameterDevice->neighborX,
+            parameterDevice->neighborY,
+            parameterDevice->neighborZ,
+            parameterDevice->numberOfNodes,
+            parameterDevice->isEvenTimestep);
       getLastCudaError("QVelDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3164,39 +3115,26 @@ extern "C" void QVelDevCompPlusSlip27(unsigned int numberOfThreads,
       getLastCudaError("QVelDeviceCompPlusSlip27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QVelDevComp27(unsigned int numberOfThreads,
-                              real* velocityX,
-                              real* velocityY,
-                              real* velocityZ,
-                              real* distribution,
-                              int* subgridDistanceIndices,
-                              real* subgridDistances,
-                              unsigned int numberOfBCnodes,
-                              real omega,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int numberOfLBnodes,
-                              bool isEvenTimestep)
+extern "C" void QVelDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid(numberOfThreads, numberOfBCnodes);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid(parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QVelDeviceComp27<<< grid, threads >>> (
-                               velocityX,
-                               velocityY,
-                               velocityZ,
-                               distribution,
-                               subgridDistanceIndices,
-                               subgridDistances,
-                               numberOfBCnodes,
-                               omega,
-                               neighborX,
-                               neighborY,
-                               neighborZ,
-                               numberOfLBnodes,
-                               isEvenTimestep);
-      getLastCudaError("QVelDeviceComp27 execution failed");
+   QVelDeviceComp27<<< grid, threads >>> (
+            boundaryCondition->Vx,
+            boundaryCondition->Vy,
+            boundaryCondition->Vz,
+            parameterDevice->distributions.f[0],
+            boundaryCondition->k,        
+            boundaryCondition->q27[0],
+            boundaryCondition->numberOfBCnodes,
+            parameterDevice->omega,
+            parameterDevice->neighborX,
+            parameterDevice->neighborY,
+            parameterDevice->neighborZ,
+            parameterDevice->numberOfNodes,
+            parameterDevice->isEvenTimestep);
+   getLastCudaError("QVelDeviceComp27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 extern "C" void QVelDevCompThinWalls27(unsigned int numberOfThreads,
@@ -3261,39 +3199,25 @@ extern "C" void QVelDevCompThinWalls27(unsigned int numberOfThreads,
    getLastCudaError("QThinWallsPartTwo27 execution failed");
 }
 
-extern "C" void QVelDevCompZeroPress27(
-   unsigned int numberOfThreads,
-   real* velocityX,
-   real* velocityY,
-   real* velocityZ,
-   real* distribution,
-   int* subgridDistanceIndices,
-   real* subgridDistances,
-   unsigned int numberOfBCnodes,
-   real omega,
-   unsigned int* neighborX,
-   unsigned int* neighborY,
-   unsigned int* neighborZ,
-   unsigned int numberOfLBnodes,
-   bool isEvenTimestep)
+extern "C" void QVelDevCompZeroPress27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid(numberOfThreads, numberOfBCnodes);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
    QVelDeviceCompZeroPress27<<< grid, threads >>> (
-      velocityX,
-      velocityY,
-      velocityZ,
-      distribution,
-      subgridDistanceIndices,
-      subgridDistances,
-      numberOfBCnodes,
-      omega,
-      neighborX,
-      neighborY,
-      neighborZ,
-      numberOfLBnodes,
-      isEvenTimestep);
+            boundaryCondition->Vx,
+            boundaryCondition->Vy,
+            boundaryCondition->Vz,
+            parameterDevice->distributions.f[0],
+            boundaryCondition->k,
+            boundaryCondition->q27[0],
+            boundaryCondition->numberOfBCnodes,
+            parameterDevice->omega,
+            parameterDevice->neighborX,
+            parameterDevice->neighborY,
+            parameterDevice->neighborZ,
+            parameterDevice->numberOfNodes,
+            parameterDevice->isEvenTimestep);
    getLastCudaError("QVelDeviceCompZeroPress27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp
index 0c7a88e3c351f11754ae9632ec4766b53190179a..375e19c7113e13a8b71c473b3753354508ec4725 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp
@@ -34,13 +34,18 @@
 #include <helper_cuda.h>
 
 #include "LBKernelManager.h"
+#include "Parameter/Parameter.h"	
 #include "GPU/GPU_Interface.h"
-#include "Parameter/Parameter.h"
 #include "Calculation/DragLift.h"
 #include "Calculation/Cp.h"
+#include "BoundaryConditions/BoundaryConditionFactory.h"
 
+LBKernelManager::LBKernelManager(SPtr<Parameter> parameter, BoundaryConditionFactory* bcFactory): para(parameter)
+{
+    this->velocityBoundaryConditionPost = bcFactory->getVelocityBoundaryConditionPost();
+}
 
-void LBKernelManager::runLBMKernel(int level)
+void LBKernelManager::runLBMKernel(const int level) const
 {
     // if (para->getIsADcalculationOn()) {
     //       CumulantK17LBMDeviceKernelAD(
@@ -70,7 +75,7 @@ void LBKernelManager::runLBMKernel(int level)
     //  }
 }
 
-void LBKernelManager::runVelocityBCKernelPre(int level)
+void LBKernelManager::runVelocityBCKernelPre(const int level) const
 {
     if (para->getParD(level)->velocityBC.numberOfBCnodes > 0)
     {
@@ -124,75 +129,13 @@ void LBKernelManager::runVelocityBCKernelPre(int level)
     }
 }
 
-void LBKernelManager::runVelocityBCKernelPost(int level)
+void LBKernelManager::runVelocityBCKernelPost(const int level) const
 {
      if (para->getParD(level)->velocityBC.numberOfBCnodes > 0)
      {
-        //   QVelDevicePlainBB27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->velocityBC.Vx,
-        //     para->getParD(level)->velocityBC.Vy,
-        //     para->getParD(level)->velocityBC.Vz,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->velocityBC.k,
-        //     para->getParD(level)->velocityBC.q27[0],
-        //     para->getParD(level)->velocityBC.numberOfBCnodes,
-        //     para->getParD(level)->velocityBC.kArray,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->numberOfNodes,
-        //     para->getParD(level)->isEvenTimestep);
+        velocityBoundaryConditionPost(para->getParD(level).get(), &(para->getParD(level)->velocityBC));
 
-        // QVelDev27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->nx,
-        //     para->getParD(level)->ny,
-        //     para->getParD(level)->velocityBC.Vx,
-        //     para->getParD(level)->velocityBC.Vy,
-        //     para->getParD(level)->velocityBC.Vz,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->velocityBC.k,
-        //     para->getParD(level)->velocityBC.q27[0],
-        //     para->getParD(level)->velocityBC.numberOfBCnodes,
-        //     para->getParD(level)->omega,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
-        //     para->getParD(level)->isEvenTimestep);
-
-        // QVelDevComp27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->velocityBC.Vx,
-        //     para->getParD(level)->velocityBC.Vy,
-        //     para->getParD(level)->velocityBC.Vz,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->velocityBC.k,
-        //     para->getParD(level)->velocityBC.q27[0],
-        //     para->getParD(level)->velocityBC.numberOfBCnodes,
-        //     para->getParD(level)->omega,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
-        //     para->getParD(level)->isEvenTimestep);
-
-        QVelDevCompZeroPress27(
-            para->getParD(level)->numberofthreads,
-            para->getParD(level)->velocityBC.Vx,
-            para->getParD(level)->velocityBC.Vy,
-            para->getParD(level)->velocityBC.Vz,
-            para->getParD(level)->distributions.f[0],
-            para->getParD(level)->velocityBC.k,
-            para->getParD(level)->velocityBC.q27[0],
-            para->getParD(level)->velocityBC.numberOfBCnodes,
-            para->getParD(level)->omega,
-            para->getParD(level)->neighborX,
-            para->getParD(level)->neighborY,
-            para->getParD(level)->neighborZ,
-            para->getParD(level)->numberOfNodes,
-            para->getParD(level)->isEvenTimestep);
+        //QVelDevicePlainBB27(para->getParD(level).get(), &(para->getParD(level)->velocityBC));
 
         //////////////////////////////////////////////////////////////////////////
         // D E P R E C A T E D
@@ -205,12 +148,12 @@ void LBKernelManager::runVelocityBCKernelPost(int level)
         //                para->getPhi(),                        para->getAngularVelocity(),
         //                para->getParD(level)->neighborX,    para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
         //                para->getParD(level)->coordinateX,       para->getParD(level)->coordinateY,    para->getParD(level)->coordinateZ,
-        //                para->getParD(level)->size_Mat,     para->getParD(level)->isEvenTimestep);
+        //                para->getParD(level)->numberOfNodes,     para->getParD(level)->isEvenTimestep);
         // getLastCudaError("QVelDev27 execution failed");
      }
 }
 
-void LBKernelManager::runGeoBCKernelPre(int level, unsigned int t, CudaMemoryManager* cudaMemoryManager){
+void LBKernelManager::runGeoBCKernelPre(const int level, unsigned int t, CudaMemoryManager* cudaMemoryManager) const{
     if (para->getParD(level)->geometryBC.numberOfBCnodes > 0){
         if (para->getCalcDragLift())
         {
@@ -318,7 +261,7 @@ void LBKernelManager::runGeoBCKernelPre(int level, unsigned int t, CudaMemoryMan
     }
 }
 
-void LBKernelManager::runGeoBCKernelPost(int level)
+void LBKernelManager::runGeoBCKernelPost(const int level) const
 {
     if (para->getParD(level)->geometryBC.numberOfBCnodes > 0)
     {
@@ -353,7 +296,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         // QDev27(
@@ -368,7 +311,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         // QVelDev27(
@@ -386,7 +329,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         // QDevComp27(
@@ -401,24 +344,24 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
-        QVelDevComp27(
-            para->getParD(level)->numberofthreads,
-            para->getParD(level)->geometryBC.Vx,
-            para->getParD(level)->geometryBC.Vy,
-            para->getParD(level)->geometryBC.Vz,
-            para->getParD(level)->distributions.f[0],
-            para->getParD(level)->geometryBC.k,
-            para->getParD(level)->geometryBC.q27[0],
-            para->getParD(level)->geometryBC.numberOfBCnodes,
-            para->getParD(level)->omega,
-            para->getParD(level)->neighborX,
-            para->getParD(level)->neighborY,
-            para->getParD(level)->neighborZ,
-            para->getParD(level)->numberOfNodes,
-            para->getParD(level)->isEvenTimestep);
+        // QVelDevComp27(
+        //     para->getParD(level)->numberofthreads,
+        //     para->getParD(level)->geometryBC.Vx,
+        //     para->getParD(level)->geometryBC.Vy,
+        //     para->getParD(level)->geometryBC.Vz,
+        //     para->getParD(level)->distributions.f[0],
+        //     para->getParD(level)->geometryBC.k,
+        //     para->getParD(level)->geometryBC.q27[0],
+        //     para->getParD(level)->geometryBC.numberOfBCnodes,
+        //     para->getParD(level)->omega,
+        //     para->getParD(level)->neighborX,
+        //     para->getParD(level)->neighborY,
+        //     para->getParD(level)->neighborZ,
+        //     para->getParD(level)->numberOfNodes,
+        //     para->getParD(level)->isEvenTimestep);
 
         // QVelDevCompZeroPress27(
         //     para->getParD(0)->numberofthreads,
@@ -433,7 +376,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(0)->neighborX,
         //     para->getParD(0)->neighborY,
         //     para->getParD(0)->neighborZ,
-        //     para->getParD(0)->size_Mat,
+        //     para->getParD(0)->numberOfNodes,
         //     para->getParD(0)->isEvenTimestep);
 
         // QDev3rdMomentsComp27(
@@ -448,7 +391,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         // QSlipDev27(
@@ -461,7 +404,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
     //////////////////////////////////////////////////////////////////////////
@@ -482,7 +425,7 @@ void LBKernelManager::runGeoBCKernelPost(int level)
     //         para->getParD(level)->neighborX,
     //         para->getParD(level)->neighborY,
     //         para->getParD(level)->neighborZ,
-    //         para->getParD(level)->size_Mat_SP,
+    //         para->getParD(level)->numberOfNodes,
     //         para->getParD(level)->isEvenTimestep);
 
     //     QSlipNormDevComp27(
@@ -498,12 +441,12 @@ void LBKernelManager::runGeoBCKernelPost(int level)
     //         para->getParD(level)->neighborX,
     //         para->getParD(level)->neighborY,
     //         para->getParD(level)->neighborZ,
-    //         para->getParD(level)->size_Mat_SP,
+    //         para->getParD(level)->numberOfNodes,
     //         para->getParD(level)->isEvenTimestep);
     }
 }
 
-void LBKernelManager::runOutflowBCKernelPre(int level){
+void LBKernelManager::runOutflowBCKernelPre(const int level) const{
     if (para->getParD(level)->outflowBC.numberOfBCnodes > 0)
     {
         QPressNoRhoDev27(
@@ -542,7 +485,7 @@ void LBKernelManager::runOutflowBCKernelPre(int level){
     }
 }
 
-void LBKernelManager::runPressureBCKernelPre(int level){
+void LBKernelManager::runPressureBCKernelPre(const int level) const{
     if (para->getParD(level)->pressureBC.numberOfBCnodes > 0)
     {
         QPressNoRhoDev27(
@@ -622,7 +565,7 @@ void LBKernelManager::runPressureBCKernelPre(int level){
     }
 }
 
-void LBKernelManager::runPressureBCKernelPost(int level){
+void LBKernelManager::runPressureBCKernelPost(const int level) const{
     if (para->getParD(level)->pressureBC.numberOfBCnodes > 0)
     {
         // QPressDev27_IntBB(
@@ -641,7 +584,7 @@ void LBKernelManager::runPressureBCKernelPost(int level){
     }
 }
 
-void LBKernelManager::runStressWallModelKernel(int level){
+void LBKernelManager::runStressWallModelKernel(const int level) const{
     if (para->getParD(level)->stressBC.numberOfBCnodes > 0)
     {
         // QStressDevComp27(para->getParD(level)->numberofthreads, para->getParD(level)->distributions.f[0],
@@ -656,7 +599,7 @@ void LBKernelManager::runStressWallModelKernel(int level){
         //                 para->getHasWallModelMonitor(),        para->getParD(level)->wallModel.u_star,
         //                 para->getParD(level)->wallModel.Fx,    para->getParD(level)->wallModel.Fy,        para->getParD(level)->wallModel.Fz,
         //                 para->getParD(level)->neighborX,       para->getParD(level)->neighborY,           para->getParD(level)->neighborZ,
-        //                 para->getParD(level)->size_Mat,        para->getParD(level)->isEvenTimestep);
+        //                 para->getParD(level)->numberOfNodes,        para->getParD(level)->isEvenTimestep);
 
         BBStressDev27( para->getParD(level)->numberofthreads,   para->getParD(level)->distributions.f[0],
                         para->getParD(level)->stressBC.k,       para->getParD(level)->stressBC.kN,
@@ -674,7 +617,7 @@ void LBKernelManager::runStressWallModelKernel(int level){
 }
 
 
-void LBKernelManager::runSlipBCKernel(int level){
+void LBKernelManager::runSlipBCKernel(const int level) const{
     if (para->getParD(level)->slipBC.numberOfBCnodes > 0)
     {
         // QSlipDev27(
@@ -687,7 +630,7 @@ void LBKernelManager::runSlipBCKernel(int level){
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         QSlipDevComp27(
@@ -707,7 +650,7 @@ void LBKernelManager::runSlipBCKernel(int level){
     }
 }
 
-void LBKernelManager::runNoSlipBCKernel(int level){
+void LBKernelManager::runNoSlipBCKernel(const int level) const{
     if (para->getParD(level)->noSlipBC.numberOfBCnodes > 0)
     {
         // QDev27(
@@ -722,7 +665,7 @@ void LBKernelManager::runNoSlipBCKernel(int level){
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         // BBDev27(
@@ -737,7 +680,7 @@ void LBKernelManager::runNoSlipBCKernel(int level){
         //     para->getParD(level)->neighborX,
         //     para->getParD(level)->neighborY,
         //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->size_Mat,
+        //     para->getParD(level)->numberOfNodes,
         //     para->getParD(level)->isEvenTimestep);
 
         QDevComp27(
@@ -755,7 +698,7 @@ void LBKernelManager::runNoSlipBCKernel(int level){
     }
 }
 
-// void LBKernelManager::calculateMacroscopicValues(int level)
+// void LBKernelManager::calculateMacroscopicValues(const int level) const
 // {
 //     if (para->getIsADcalculationOn()) {
 //           CalcMacADCompSP27(
@@ -790,27 +733,4 @@ void LBKernelManager::runNoSlipBCKernel(int level){
 //                para->getParD()->distributions.f[0],
 //                para->getParD()->isEvenTimestep);
 //      }
-// }
-
-
-
-
-
-
-
-
-
-SPtr<LBKernelManager> LBKernelManager::make(SPtr<Parameter> parameter)
-{
-    return SPtr<LBKernelManager>(new LBKernelManager(parameter));
-}
-
-LBKernelManager::LBKernelManager(SPtr<Parameter> parameter)
-{
-    this->para = parameter;
-}
-
-LBKernelManager::LBKernelManager(const LBKernelManager&)
-{
-
-}
+// }#
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h
index 75c53f674e9b5b86e50aea9b12c4aa876d84e2f7..6bcdf6b25bf10d56c8d40f37bf68532d2fd91df6 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h
@@ -33,70 +33,70 @@
 #ifndef LBKernelManager_H
 #define LBKernelManager_H
 
+#include <functional>
 #include <memory>
+
 #include "PointerDefinitions.h"
 #include "VirtualFluids_GPU_export.h"
+#include "LBM/LB.h"
 
-//! \brief Class forwarding for Parameter
-class Parameter;
 class CudaMemoryManager;
+class BoundaryConditionFactory;
+class Parameter;
+class LBMSimulationParameter;
+
+using boundaryCondition = std::function<void(LBMSimulationParameter *, QforBoundaryConditions *)>;
 
 //! \class LBKernelManager
 //! \brief manage the cuda kernel calls
 class VIRTUALFLUIDS_GPU_EXPORT LBKernelManager
 {
 public:
-	//! \brief makes an object of LBKernelManager
-	//! \param para shared pointer to instance of class Parameter
-    static SPtr<LBKernelManager> make(std::shared_ptr<Parameter> parameter);
-    
-	//! \brief calls the device function of the lattice Boltzmann kernel
-	void runLBMKernel(int level);
+    //! Class constructor
+    //! \param parameter shared pointer to instance of class Parameter
+    LBKernelManager(SPtr<Parameter> parameter, BoundaryConditionFactory *bcFactory);
 
-	//! \brief calls the device function of the velocity boundary condition (post-collision)
-    void runVelocityBCKernelPost(int level);
+    void setBoundaryConditionKernels();
 
-	//! \brief calls the device function of the velocity boundary condition (pre-collision)
-    void runVelocityBCKernelPre(int level);
+    //! \brief calls the device function of the lattice Boltzmann kernel
+    void runLBMKernel(const int level) const;
 
-	//! \brief calls the device function of the geometry boundary condition (post-collision)
-	void runGeoBCKernelPost(int level);
+    //! \brief calls the device function of the velocity boundary condition (post-collision)
+    void runVelocityBCKernelPost(const int level) const;
 
-	//! \brief calls the device function of the geometry boundary condition (pre-collision)
-	void runGeoBCKernelPre(int level, unsigned int t,  CudaMemoryManager* cudaMemoryManager);
+    //! \brief calls the device function of the velocity boundary condition (pre-collision)
+    void runVelocityBCKernelPre(const int level) const;
 
-	//! \brief calls the device function of the slip boundary condition
-	void runSlipBCKernel(int level);
+    //! \brief calls the device function of the geometry boundary condition (post-collision)
+    void runGeoBCKernelPost(const int level) const;
 
-	//! \brief calls the device function of the no-slip boundary condition
-	void runNoSlipBCKernel(int level);
+    //! \brief calls the device function of the geometry boundary condition (pre-collision)
+    void runGeoBCKernelPre(const int level, unsigned int t, CudaMemoryManager *cudaMemoryManager) const;
 
-	//! \brief calls the device function of the pressure boundary condition (pre-collision)
-	void runPressureBCKernelPre(int level);
+    //! \brief calls the device function of the slip boundary condition
+    void runSlipBCKernel(const int level) const;
 
-	//! \brief calls the device function of the pressure boundary condition (post-collision)
-	void runPressureBCKernelPost(int level);
+    //! \brief calls the device function of the no-slip boundary condition
+    void runNoSlipBCKernel(const int level) const;
 
-	//! \brief calls the device function of the outflow boundary condition
-	void runOutflowBCKernelPre(int level);
+    //! \brief calls the device function of the pressure boundary condition (pre-collision)
+    void runPressureBCKernelPre(const int level) const;
 
-	//! \brief calls the device function of the stress wall model
-	void runStressWallModelKernel(int level);
+    //! \brief calls the device function of the pressure boundary condition (post-collision)
+    void runPressureBCKernelPost(const int level) const;
 
-    //! \brief calls the device function that calculates the macroscopic values
-    void calculateMacroscopicValues(int level);
+    //! \brief calls the device function of the outflow boundary condition
+    void runOutflowBCKernelPre(const int level) const;
 
+    //! \brief calls the device function of the stress wall model
+    void runStressWallModelKernel(const int level) const;
 
-private:
-	//! Class constructor
-	//! \param parameter shared pointer to instance of class Parameter
-	LBKernelManager(SPtr<Parameter> parameter);
-	//! Class copy constructor
-	//! \param LBKernelManager is a reference to LBKernelManager object
-	LBKernelManager(const LBKernelManager&);
+    //! \brief calls the device function that calculates the macroscopic values
+    void calculateMacroscopicValues(const int level) const;
 
-	//! \property para is a shared pointer to an object of Parameter
-	SPtr<Parameter> para;
+private:
+    SPtr<Parameter> para;
 
+    boundaryCondition velocityBoundaryConditionPost;
 };
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index 29725c5a30737161aeefd8d3642febaf0385bf53..4cdb9f1db6514d61ff90327a928822df924e7270 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -68,7 +68,7 @@ std::string getFileName(const std::string& fname, int step, int myID)
 }
 
 Simulation::Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> memoryManager,
-                       vf::gpu::Communicator &communicator, GridProvider &gridProvider)
+                       vf::gpu::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory)
     : para(para), cudaMemoryManager(memoryManager), communicator(communicator), kernelFactory(std::make_unique<KernelFactoryImp>()),
       preProcessorFactory(std::make_unique<PreProcessorFactoryImp>()), dataWriter(std::make_unique<FileWriter>())
 {
@@ -377,7 +377,7 @@ Simulation::Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemo
     //////////////////////////////////////////////////////////////////////////
     // Init UpdateGrid
     //////////////////////////////////////////////////////////////////////////
-    this->updateGrid27 = std::make_unique<UpdateGrid27>(para, communicator, cudaMemoryManager, pm, kernels);
+    this->updateGrid27 = std::make_unique<UpdateGrid27>(para, communicator, cudaMemoryManager, pm, kernels, bcFactory);
 
     //////////////////////////////////////////////////////////////////////////
     // Print Init
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
index 5c765bc992c247ebf9b3b51ac399711ff7db0651..e43e88e482ea56e3d2fecdcd1275b209575e3442 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
@@ -28,12 +28,13 @@ class TrafficMovementFactory;
 class UpdateGrid27;
 class KineticEnergyAnalyzer;
 class EnstrophyAnalyzer;
+class BoundaryConditionFactory;
 
 class Simulation
 {
 public:
     Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> memoryManager,
-               vf::gpu::Communicator &communicator, GridProvider &gridProvider);
+               vf::gpu::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory);
     ~Simulation();
     void run();