diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake
index 3c71d51344030980071addc6f9831a74d0daa53c..b1545263033d2d6a580d0e9456c609f27873ecfb 100644
--- a/apps/cpu/Applications.cmake
+++ b/apps/cpu/Applications.cmake
@@ -14,7 +14,7 @@ add_subdirectory(${APPS_ROOT_CPU}/JetBreakup)
 
 add_subdirectory(${APPS_ROOT_CPU}/ConvectionOfVortex)
 
-IF(${USE_LIGGGHTS})
+IF(${VFCPU_ENABLE_LiggghtsCoupling})
 	add_subdirectory(${APPS_ROOT_CPU}/LiggghtsApp)
 	add_subdirectory(${APPS_ROOT_CPU}/FallingSphere)
 	add_subdirectory(${APPS_ROOT_CPU}/Nozzle)
diff --git a/apps/cpu/ConvectionOfVortex/cov.cpp b/apps/cpu/ConvectionOfVortex/cov.cpp
index 45b9489397df760be5d1247f1f2961393b2c22fe..baa136d6a3a96e1e4ce86ce187f116e2c560530c 100644
--- a/apps/cpu/ConvectionOfVortex/cov.cpp
+++ b/apps/cpu/ConvectionOfVortex/cov.cpp
@@ -112,14 +112,14 @@ void run()
       GenBlocksGridVisitor genBlocks(gridCube);
       grid->accept(genBlocks);
 
-      SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB));
-      outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
+      SPtr<BC> outflowBC(new DensityBC(rhoLB));
+      outflowBC->setBCStrategy(SPtr<BCStrategy>(new NonReflectingOutflowBCStrategy()));
 
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(outflowBCAdapter);
+      bcVisitor.addBC(outflowBC);
 
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
 
       SPtr<GbObject3D> refCube(new GbCuboid3D(g_minX1-blockLength,-0.02,-0.02,g_maxX1+blockLength,0.02,0.02));
       if (myid==0) GbSystem3D::writeGeoObject(refCube.get(), pathname+"/geo/refCube", WbWriterVtkXmlBinary::getInstance());
@@ -133,24 +133,24 @@ void run()
          if (myid==0) UBLOG(logINFO, "Refinement - end");
       }
 
-      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
       //outflow
       GbCuboid3DPtr geoOutflow1(new GbCuboid3D(g_minX1-blockLength, g_minX2-blockLength, g_minX3-blockLength, g_minX1, g_maxX2+blockLength, g_maxX3+blockLength));
       if (myid==0) GbSystem3D::writeGeoObject(geoOutflow1.get(), pathname+"/geo/geoOutflow1", WbWriterVtkXmlASCII::getInstance());
-      SPtr<D3Q27Interactor> outflowIntr1 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow1, grid, outflowBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> outflowIntr1 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow1, grid, outflowBC, Interactor3D::SOLID));
 
       GbCuboid3DPtr geoOutflow2(new GbCuboid3D(g_maxX1, g_minX2-blockLength, g_minX3-blockLength, g_maxX1+blockLength, g_maxX2+blockLength, g_maxX3+blockLength));
       if (myid==0) GbSystem3D::writeGeoObject(geoOutflow2.get(), pathname+"/geo/geoOutflow2", WbWriterVtkXmlASCII::getInstance());
-      SPtr<D3Q27Interactor> outflowIntr2 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow2, grid, outflowBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> outflowIntr2 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow2, grid, outflowBC, Interactor3D::SOLID));
       
       GbCuboid3DPtr geoOutflow3(new GbCuboid3D(g_minX1-blockLength, g_minX2-blockLength, g_minX3-blockLength, g_maxX1+blockLength, g_maxX2+blockLength, g_minX3));
       if (myid==0) GbSystem3D::writeGeoObject(geoOutflow3.get(), pathname+"/geo/geoOutflow3", WbWriterVtkXmlASCII::getInstance());
-      SPtr<D3Q27Interactor> outflowIntr3 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow3, grid, outflowBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> outflowIntr3 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow3, grid, outflowBC, Interactor3D::SOLID));
 
       GbCuboid3DPtr geoOutflow4(new GbCuboid3D(g_minX1-blockLength, g_minX2-blockLength, g_maxX3, g_maxX1+blockLength, g_maxX2+blockLength, g_maxX3+blockLength));
       if (myid==0) GbSystem3D::writeGeoObject(geoOutflow4.get(), pathname+"/geo/geoOutflow4", WbWriterVtkXmlASCII::getInstance());
-      SPtr<D3Q27Interactor> outflowIntr4 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow4, grid, outflowBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> outflowIntr4 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow4, grid, outflowBC, Interactor3D::SOLID));
 
       SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, DIR_00M));
       InteractorsHelper intHelper(grid, metisVisitor);
@@ -160,7 +160,7 @@ void run()
       //intHelper.addInteractor(outflowIntr4);
       intHelper.selectBlocks();
 
-      ppblocks->process(0);
+      ppblocks->update(0);
       ppblocks.reset();
 
       //set connectors  
@@ -211,9 +211,9 @@ void run()
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulantLBMKernel());
       //dynamicPointerCast<CompressibleCumulantLBMKernel>(kernel)->setBulkOmegaToOmega(true);
       //
-      SPtr<BCProcessor> bcProcessor(new BCProcessor());
+      SPtr<BCSet> bcSet(new BCSet());
 
-      kernel->setBCProcessor(bcProcessor);
+      kernel->setBCSet(bcSet);
 
       SetKernelBlockVisitor kernelVisitor(kernel, nuLB, availMem, needMem);
       grid->accept(kernelVisitor);
@@ -264,8 +264,8 @@ void run()
 
       //Postrozess
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      SPtr<CoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-      ppgeo->process(0);
+      SPtr<SimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      ppgeo->update(0);
       ppgeo.reset();
 
       if (myid==0) UBLOG(logINFO, "Preprozess - end");
@@ -278,27 +278,27 @@ void run()
       }
 
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-      writeMQCoProcessor->process(0);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+      writeMQSimulationObserver->update(0);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      std::shared_ptr<NUPSCounterCoProcessor> nupsCoProcessor(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      std::shared_ptr<NUPSCounterSimulationObserver> nupsSimulationObserver(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //SPtr<UbScheduler> tavSch(new UbScheduler(1, 0, endTime));
-      //SPtr<TimeAveragedValuesCoProcessor> tav(new TimeAveragedValuesCoProcessor(grid, pathname, WbWriterVtkXmlBinary::getInstance(), tavSch, comm,
-      //   TimeAveragedValuesCoProcessor::Density | TimeAveragedValuesCoProcessor::Velocity | TimeAveragedValuesCoProcessor::Fluctuations));
+      //SPtr<TimeAveragedValuesSimulationObserver> tav(new TimeAveragedValuesSimulationObserver(grid, pathname, WbWriterVtkXmlBinary::getInstance(), tavSch, comm,
+      //   TimeAveragedValuesSimulationObserver::Density | TimeAveragedValuesSimulationObserver::Velocity | TimeAveragedValuesSimulationObserver::Fluctuations));
       //tav->setWithGhostLayer(true);
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(nupsCoProcessor);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      //calculator->addCoProcessor(tav);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+      simulation->addSimulationObserver(nupsSimulationObserver);
+      simulation->addSimulationObserver(writeMQSimulationObserver);
+      //simulation->addSimulationObserver(tav);
 
       //omp_set_num_threads(1);
 
       if (myid==0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid==0) UBLOG(logINFO, "Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/CouetteFlow/CMakeLists.txt b/apps/cpu/CouetteFlow/CMakeLists.txt
index 56931592d831ded425580f40af35e5f4c4a7c1c2..9f28e30c5aeb0722fb9d0b9b13a135ecae0f9799 100644
--- a/apps/cpu/CouetteFlow/CMakeLists.txt
+++ b/apps/cpu/CouetteFlow/CMakeLists.txt
@@ -3,4 +3,4 @@
 ########################################################
 PROJECT(CouetteFlow)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES cflow.cpp )
\ No newline at end of file
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} NonNewtonianFluids FILES cflow.cpp )
\ No newline at end of file
diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp
index a60031096a0197e129a6c01c1dd9d5881dc2699f..4297d3ac14b67a41f0bf764e823d457e212806e0 100644
--- a/apps/cpu/CouetteFlow/cflow.cpp
+++ b/apps/cpu/CouetteFlow/cflow.cpp
@@ -112,24 +112,24 @@ void bflow(string configname)
       thix->setC(c);
       thix->setMu0(mu0);
 
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyPowellEyringModelNoSlipBCAlgorithm()));
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyHerschelBulkleyModelNoSlipBCStrategy()));
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyPowellEyringModelNoSlipBCStrategy()));
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelNoSlipBCStrategy()));
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(noSlipBCAdapter);
+      bcVisitor.addBC(noSlipBC);
 
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new PowellEyringModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel());
       SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel());
       kernel->setForcingX1(forcing);
       kernel->setWithForcing(true);
-      kernel->setBCProcessor(bcProc);
+      kernel->setBCSet(bcProc);
 
 
       SPtr<Grid3D> grid(new Grid3D(comm));
@@ -178,11 +178,11 @@ void bflow(string configname)
       if (myid == 0) GbSystem3D::writeGeoObject(addWallYmax.get(), pathname + "/geo/addWallYmax", WbWriterVtkXmlASCII::getInstance());
 
       //wall interactors
-      //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-      //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBC, Interactor3D::SOLID));
+      //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBC, Interactor3D::SOLID));
 
-      SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-      SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBC, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBC, Interactor3D::SOLID));
 
       ////////////////////////////////////////////
       //METIS
@@ -199,8 +199,8 @@ void bflow(string configname)
       if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
       //////////////////////////////////////
 
-      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-      ppblocks->process(0);
+      SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      ppblocks->update(0);
 
       unsigned long nob = grid->getNumberOfBlocks();
       int gl = 3;
@@ -252,29 +252,29 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
-      ppgeo.process(1);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
+      ppgeo.update(1);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname,
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname,
          WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      //calculator->addCoProcessor(migCoProcessor);
-      //calculator->addCoProcessor(restartCoProcessor);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+      simulation->addSimulationObserver(npr);
+      simulation->addSimulationObserver(writeMQSimulationObserver);
+      simulation->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      //simulation->addSimulationObserver(migSimulationObserver);
+      //simulation->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) UBLOG(logINFO, "Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/FallingSphere/FallingSphere.cpp b/apps/cpu/FallingSphere/FallingSphere.cpp
index 5f399c547e697199cbbde82b906169a8c1d5fd59..0935d578640f8930b69a4b7ba64e28fa0fcc753b 100644
--- a/apps/cpu/FallingSphere/FallingSphere.cpp
+++ b/apps/cpu/FallingSphere/FallingSphere.cpp
@@ -4,7 +4,7 @@
 
 #include "VirtualFluids.h"
 
-#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingSimulationObserver.h"
 #include "LiggghtsCouplingWrapper.h"
 #include "IBcumulantK17LBMKernel.h"
 
@@ -39,15 +39,15 @@ int main(int argc, char *argv[])
     double nuLB = 1e-2;
 
     SPtr<LBMKernel> kernel   = make_shared<IBcumulantK17LBMKernel>();
-    SPtr<BCProcessor> bcProc = make_shared<BCProcessor>();
-    kernel->setBCProcessor(bcProc);
+    SPtr<BCSet> bcProc = make_shared<BCSet>();
+    kernel->setBCSet(bcProc);
 
-    SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-    noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+    SPtr<BC> noSlipBC(new NoSlipBC());
+    noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
     //////////////////////////////////////////////////////////////////////////////////
     // BC visitor
     BoundaryConditionsBlockVisitor bcVisitor;
-    bcVisitor.addBC(noSlipBCAdapter);
+    bcVisitor.addBC(noSlipBC);
 
     SPtr<Grid3D> grid = make_shared<Grid3D>(comm);
     grid->setPeriodicX1(true);
@@ -61,7 +61,7 @@ int main(int argc, char *argv[])
     UbSystem::makeDirectory(outputPath);
     UbSystem::makeDirectory(outputPath + "/liggghts");
 
-    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, vf::lbm::dir::DIR_MMM, MetisPartitioner::RECURSIVE));
     
     SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3);
     if (myid == 0)
@@ -70,10 +70,10 @@ int main(int argc, char *argv[])
     GenBlocksGridVisitor genBlocks(gridCube);
     grid->accept(genBlocks);
 
-    SPtr<CoProcessor> ppblocks =
-        make_shared <WriteBlocksCoProcessor>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+    SPtr<SimulationObserver> ppblocks =
+        make_shared <WriteBlocksSimulationObserver>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
                                                           WbWriterVtkXmlBinary::getInstance(), comm);
-    ppblocks->process(0);
+    ppblocks->update(0);
     ppblocks.reset();
 
     double dx2 = 2.0 * dx;
@@ -84,8 +84,8 @@ int main(int argc, char *argv[])
         new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_maxX3, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
     GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
 
-    SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-    SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBC, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBC, Interactor3D::SOLID));
 
     InteractorsHelper intHelper(grid, metisVisitor, true);
     intHelper.addInteractor(wallZminInt);
@@ -136,15 +136,15 @@ int main(int argc, char *argv[])
     wrapper.execFile((char *)inFile2.c_str());
     wrapper.runUpto(demSubsteps - 1);
   
-    SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor =
-        make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units);
+    SPtr<LiggghtsCouplingSimulationObserver> lcSimulationObserver =
+        make_shared<LiggghtsCouplingSimulationObserver>(grid, lScheduler, comm, wrapper, demSubsteps, units);
 
     // boundary conditions grid
     {
         SPtr<UbScheduler> geoSch(new UbScheduler(1));
-        SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+        SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
             grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-        ppgeo->process(0);
+        ppgeo->update(0);
         ppgeo.reset();
     }
 
@@ -156,17 +156,17 @@ int main(int argc, char *argv[])
 
     // write data for visualization of macroscopic quantities
     SPtr<UbScheduler> visSch(new UbScheduler(vtkSteps));
-    SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(
-        new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(),
+    SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(
+        new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(),
                                                   SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
     int endTime = 3000; //20;
-    SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime));
-    calculator->addCoProcessor(lcCoProcessor);
-    calculator->addCoProcessor(writeMQCoProcessor);
+    SPtr<Simulation> simulation(new Simulation(grid, lScheduler, endTime));
+    simulation->addSimulationObserver(lcSimulationObserver);
+    simulation->addSimulationObserver(writeMQSimulationObserver);
 
     if (myid == 0) UBLOG(logINFO, "Simulation-start");
-    calculator->calculate();
+    simulation->run();
     if (myid == 0) UBLOG(logINFO, "Simulation-end");
 
 
diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp b/apps/cpu/FlowAroundCylinder/cylinder.cpp
index d66222495986cc6eaa26c078d7eaf225834ffaab..f8c2ac4674a7bfa98d42c0be4ebf20365f579695 100644
--- a/apps/cpu/FlowAroundCylinder/cylinder.cpp
+++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp
@@ -80,29 +80,29 @@ void run(string configname)
       SPtr<Grid3D> grid(new Grid3D(comm));
 
       //BC
-      SPtr<BCAdapter> noSlipAdapter(new NoSlipBCAdapter());
-      noSlipAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+      SPtr<BC> noSlipAdapter(new NoSlipBC());
+      noSlipAdapter->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
 
       mu::Parser fct;
       fct.SetExpr("16*U*x2*x3*(H-x2)*(H-x3)/H^4");
       fct.DefineConst("U", uLB);
       fct.DefineConst("H", H);
-      SPtr<BCAdapter> velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-      velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
+      SPtr<BC> velBC(new VelocityBC(true, false, false, fct, 0, BCFunction::INFCONST));
+      velBC->setBCStrategy(SPtr<BCStrategy>(new VelocityWithDensityBCStrategy()));
 
-      SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-      denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
+      SPtr<BC> denBC(new DensityBC(rhoLB));
+      denBC->setBCStrategy(SPtr<BCStrategy>(new NonReflectingOutflowBCStrategy()));
       
       BoundaryConditionsBlockVisitor bcVisitor;
       bcVisitor.addBC(noSlipAdapter);
-      bcVisitor.addBC(velBCAdapter);
-      bcVisitor.addBC(denBCAdapter);
+      bcVisitor.addBC(velBC);
+      bcVisitor.addBC(denBC);
 
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-      //RestartCoProcessor rp(grid, rSch, comm, pathOut, RestartCoProcessor::BINARY);
-      MPIIORestartCoProcessor rcp(grid, rSch, pathOut, comm);
+      //RestartSimulationObserver rp(grid, rSch, comm, pathOut, RestartSimulationObserver::BINARY);
+      MPIIORestartSimulationObserver rcp(grid, rSch, pathOut, comm);
       //////////////////////////////////////////////////////////////////////////
 
       ////cylinder
@@ -181,7 +181,7 @@ void run(string configname)
          GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2-blockLength, g_minX3-blockLength, g_maxX1+blockLength, g_maxX2+blockLength, g_maxX3+blockLength));
          if (myid==0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathOut+"/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
 
          if (refineLevel>0)
          {
@@ -199,10 +199,10 @@ void run(string configname)
          SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipAdapter, Interactor3D::SOLID));
 
          //inflow
-         SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBC, Interactor3D::SOLID));
 
          //outflow
-         SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBC, Interactor3D::SOLID));
 
          
          SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, DIR_00M));
@@ -217,7 +217,7 @@ void run(string configname)
          intHelper.selectBlocks();
 
 
-         ppblocks->process(0);
+         ppblocks->update(0);
          ppblocks.reset();
 
          unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -247,8 +247,8 @@ void run(string configname)
 
          SPtr<LBMKernel> kernel(new CompressibleCumulantLBMKernel());
 
-         SPtr<BCProcessor> bcProc(new BCProcessor());
-         kernel->setBCProcessor(bcProc);
+         SPtr<BCSet> bcProc(new BCSet());
+         kernel->setBCSet(bcProc);
 
          SetKernelBlockVisitor kernelVisitor(kernel, nueLB, availMem, needMem);
          grid->accept(kernelVisitor);
@@ -275,9 +275,9 @@ void run(string configname)
 
          //Postrozess
          SPtr<UbScheduler> geoSch(new UbScheduler(1));
-         SPtr<CoProcessor> ppgeo(
-            new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
-         ppgeo->process(0);
+         SPtr<SimulationObserver> ppgeo(
+            new WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
+         ppgeo->update(0);
          ppgeo.reset();
 
          if (myid==0) UBLOG(logINFO, "Preprozess - end");
@@ -302,26 +302,26 @@ void run(string configname)
 
       SPtr<UbScheduler> stepSch(new UbScheduler(outTime));
 
-	  SPtr<CoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, pathOut, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+	  SPtr<SimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, stepSch, pathOut, WbWriterVtkXmlBinary::getInstance(), conv, comm));
 
       real area = (2.0*radius*H)/(dx*dx);
       real v    = 4.0*uLB/9.0;
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, pathOut + "/results/forces.txt", comm, v, area);
+      SPtr<CalculateForcesSimulationObserver> fp = make_shared<CalculateForcesSimulationObserver>(grid, forceSch, pathOut + "/results/forces.txt", comm, v, area);
       fp->addInteractor(cylinderInt);
 
 	  SPtr<UbScheduler> nupsSch(new UbScheduler(nupsStep[0], nupsStep[1], nupsStep[2]));
-	  std::shared_ptr<CoProcessor> nupsCoProcessor(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+	  std::shared_ptr<SimulationObserver> nupsSimulationObserver(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
 	  omp_set_num_threads(numOfThreads);
 	  SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-	  SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-	  calculator->addCoProcessor(nupsCoProcessor);
-     calculator->addCoProcessor(fp);
-     calculator->addCoProcessor(writeMQCoProcessor);
+	  SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+	  simulation->addSimulationObserver(nupsSimulationObserver);
+     simulation->addSimulationObserver(fp);
+     simulation->addSimulationObserver(writeMQSimulationObserver);
 
       if(myid == 0) UBLOG(logINFO,"Simulation-start");
-	  calculator->calculate();
+	  simulation->run();
       if(myid == 0) UBLOG(logINFO,"Simulation-end");
    }
    catch(std::exception& e)
diff --git a/apps/cpu/HerschelBulkleyModel/CMakeLists.txt b/apps/cpu/HerschelBulkleyModel/CMakeLists.txt
index fe04d5c61fdbf66fb1ab0966745301330ad0866e..537402905309fe65441d9b5fbe2d48523c55947f 100644
--- a/apps/cpu/HerschelBulkleyModel/CMakeLists.txt
+++ b/apps/cpu/HerschelBulkleyModel/CMakeLists.txt
@@ -3,4 +3,4 @@
 ########################################################
 PROJECT(HerschelBulkleyModel)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES hbflow.cpp )
\ No newline at end of file
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} NonNewtonianFluids FILES hbflow.cpp )
\ No newline at end of file
diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
index dcb82533ec1da20664babe4ee1f16df0bc10cbc0..a8cf213475677b55ff4e81ceaaf80b4c4d050ea5 100644
--- a/apps/cpu/HerschelBulkleyModel/hbflow.cpp
+++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
@@ -132,27 +132,27 @@ void bflow(string configname)
       thix->setC(c);
       thix->setMu0(mu0);
 
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyPowellEyringModelNoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyHerschelBulkleyModelNoSlipBCStrategy()));
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyPowellEyringModelNoSlipBCStrategy()));
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelNoSlipBCStrategy()));
 
       mu::Parser fctVx;
       fctVx.SetExpr("u");
       fctVx.DefineConst("u", 0.001);
  
 
-      SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, false, false, fctVx, 0, BCFunction::INFCONST));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelVelocityBCAlgorithm()));
+      SPtr<BC> velocityBC(new VelocityBC(true, false, false, fctVx, 0, BCFunction::INFCONST));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+      velocityBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelVelocityBCStrategy()));
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      //bcVisitor.addBC(noSlipBCAdapter);
-      //bcVisitor.addBC(velocityBCAdapter);
+      //bcVisitor.addBC(noSlipBC);
+      //bcVisitor.addBC(velocityBC);
 
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new PowellEyringModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel());
@@ -166,7 +166,7 @@ void bflow(string configname)
       
       kernel->setForcingX1(forcing);
       kernel->setWithForcing(true);
-      kernel->setBCProcessor(bcProc);
+      kernel->setBCSet(bcProc);
 
 
       SPtr<Grid3D> grid(new Grid3D(comm));
@@ -222,13 +222,13 @@ void bflow(string configname)
 
 
       //wall interactors
-      //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-      //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBC, Interactor3D::SOLID));
+      //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBC, Interactor3D::SOLID));
 
-      SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-      SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBC, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBC, Interactor3D::SOLID));
 
-      //SPtr<D3Q27TriFaceMeshInteractor> wall45Int(new D3Q27TriFaceMeshInteractor(wall45, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      //SPtr<D3Q27TriFaceMeshInteractor> wall45Int(new D3Q27TriFaceMeshInteractor(wall45, grid, noSlipBC, Interactor3D::SOLID));
 
       ////////////////////////////////////////////
       //METIS
@@ -246,8 +246,8 @@ void bflow(string configname)
       if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
       //////////////////////////////////////
 
-      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-      ppblocks->process(0);
+      SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      ppblocks->update(0);
 
       unsigned long nob = grid->getNumberOfBlocks();
       int gl = 3;
@@ -299,39 +299,39 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
-      ppgeo.process(1);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
+      ppgeo.update(1);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       SPtr<UbScheduler> forceSch(new UbScheduler(1000));
       //real dummy = 1;
-      SPtr<CalculateTorqueCoProcessor> fp = std::make_shared<CalculateTorqueCoProcessor>(grid, forceSch, pathname + "/forces/forces.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp = std::make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, pathname + "/forces/forces.csv", comm);
       fp->addInteractor(addWallYminInt);
 
-      SPtr<CalculateTorqueCoProcessor> fp2 = std::make_shared<CalculateTorqueCoProcessor>(grid, forceSch, pathname + "/forces/forces2.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp2 = std::make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, pathname + "/forces/forces2.csv", comm);
       fp2->addInteractor(addWallYmaxInt);
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname,
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname,
          WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(fp2);
-      //calculator->addCoProcessor(migCoProcessor);
-      //calculator->addCoProcessor(restartCoProcessor);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+      simulation->addSimulationObserver(npr);
+      simulation->addSimulationObserver(writeMQSimulationObserver);
+      simulation->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      simulation->addSimulationObserver(fp);
+      simulation->addSimulationObserver(fp2);
+      //simulation->addSimulationObserver(migSimulationObserver);
+      //simulation->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) UBLOG(logINFO, "Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/HerschelBulkleySphere/CMakeLists.txt b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt
index 6902b6c6cca28ff3dccd765d9e16dd5e92a772bd..69fe09a4f0eb5b11ecf15f3bd609c9afbf79cae6 100644
--- a/apps/cpu/HerschelBulkleySphere/CMakeLists.txt
+++ b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt
@@ -3,4 +3,4 @@
 ########################################################
 PROJECT(HerschelBulkleySphere)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES hbsphere.cpp )
\ No newline at end of file
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} NonNewtonianFluids FILES hbsphere.cpp )
\ No newline at end of file
diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
index ae71a3a44926c52e04eb0df682b0495ce37c173d..2b4e96aaa1e195072eb3eb56783952e4ccd49722 100644
--- a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
+++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
@@ -102,13 +102,13 @@ void bflow(string configname)
       thix->setYieldStress(tau0);
       thix->setOmegaMin(omegaMin);
 
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyHerschelBulkleyModelNoSlipBCStrategy()));
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelNoSlipBCStrategy()));
 
-      SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
-      slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm()));
+      SPtr<BC> slipBC(new SlipBC());
+      slipBC->setBCStrategy(SPtr<BCStrategy>(new SimpleSlipBCStrategy()));
 
       mu::Parser fct;
       fct.SetExpr("U");
@@ -118,31 +118,31 @@ void bflow(string configname)
       //fct.SetExpr("16*U*x2*x3*(H-x2)*(H-x3)/H^4");
       //fct.DefineConst("U", U);
       //fct.DefineConst("H", H);
-      SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
+      SPtr<BC> velocityBC(new VelocityBC(true, false, false, fct, 0, BCFunction::INFCONST));
+      velocityBC->setBCStrategy(SPtr<BCStrategy>(new SimpleVelocityBCStrategy()));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new VelocityWithDensityBCStrategy()));
 
-      SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter());
-      densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
-      //densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
+      SPtr<BC> densityBC(new DensityBC());
+      densityBC->setBCStrategy(SPtr<BCStrategy>(new NonEqDensityBCStrategy()));
+      //densityBC->setBCStrategy(SPtr<BCStrategy>(new NonReflectingOutflowBCStrategy()));
 
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(noSlipBCAdapter);
-      bcVisitor.addBC(slipBCAdapter);
-      bcVisitor.addBC(velocityBCAdapter);
-      bcVisitor.addBC(densityBCAdapter);
+      bcVisitor.addBC(noSlipBC);
+      bcVisitor.addBC(slipBC);
+      bcVisitor.addBC(velocityBC);
+      bcVisitor.addBC(densityBC);
       
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
 
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel());
       SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
-      kernel->setBCProcessor(bcProc);
+      kernel->setBCSet(bcProc);
       //kernel->setForcingX1(forcing);
       //kernel->setWithForcing(true);
 
@@ -159,7 +159,7 @@ void bflow(string configname)
       //sphere
       SPtr<GbObject3D> sphere(new GbSphere3D(sphereCenter[0], sphereCenter[1], sphereCenter[2], radius));
       GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance());
-      SPtr<D3Q27Interactor> sphereInt(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> sphereInt(new D3Q27Interactor(sphere, grid, noSlipBC, Interactor3D::SOLID));
 
       ////////////////////////////////////////////
       //METIS
@@ -168,10 +168,10 @@ void bflow(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
-      restartCoProcessor->setLBMKernel(kernel);
-      restartCoProcessor->setBCProcessor(bcProc);
-      //restartCoProcessor->setNu(k);
+      SPtr<MPIIOMigrationSimulationObserver> restartSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, outputPath, comm));
+      restartSimulationObserver->setLBMKernel(kernel);
+      restartSimulationObserver->setBCSet(bcProc);
+      //restartSimulationObserver->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
       if (myid == 0)
@@ -234,14 +234,14 @@ void bflow(string configname)
          if (myid == 0) GbSystem3D::writeGeoObject(wallXmax.get(), outputPath + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance());
 
          //wall interactors
-         SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, slipBCAdapter, Interactor3D::SOLID));
-         SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, slipBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, slipBC, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, slipBC, Interactor3D::SOLID));
                                                                                
-         SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, slipBCAdapter, Interactor3D::SOLID));
-         SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, slipBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, slipBC, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, slipBC, Interactor3D::SOLID));
 
-         SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, velocityBCAdapter, Interactor3D::SOLID));
-         SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, densityBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, velocityBC, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, densityBC, Interactor3D::SOLID));
 
          ////////////////////////////////////////////
          //METIS
@@ -261,8 +261,8 @@ void bflow(string configname)
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-         ppblocks->process(0);
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         ppblocks->update(0);
 
          unsigned long nob = grid->getNumberOfBlocks();
          int gl = 3;
@@ -310,7 +310,7 @@ void bflow(string configname)
       }
       else
       {
-         restartCoProcessor->restart((int)restartStep);
+         restartSimulationObserver->restart((int)restartStep);
          grid->setTimeStep(restartStep);
          SetBcBlocksBlockVisitor v(sphereInt);
          grid->accept(v);
@@ -331,35 +331,35 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
-      ppgeo.process(0);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
+      ppgeo.update(0);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-      //writeMQCoProcessor->process(0);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //writeMQSimulationObserver->update(0);
 
       real area = UbMath::PI*radius*radius;
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area);
+      SPtr<CalculateForcesSimulationObserver> fp = make_shared<CalculateForcesSimulationObserver>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area);
       fp->addInteractor(sphereInt);
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      calculator->addCoProcessor(restartCoProcessor);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+      simulation->addSimulationObserver(npr);
+      simulation->addSimulationObserver(fp);
+      simulation->addSimulationObserver(writeMQSimulationObserver);
+      simulation->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      simulation->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) UBLOG(logINFO, "Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/JetBreakup/CMakeLists.txt b/apps/cpu/JetBreakup/CMakeLists.txt
index 19553ec4c1cca9dde298d377f82f8730f48269d0..b5bb536cf0c0b4820953ade37b1b5ccca265d7f2 100644
--- a/apps/cpu/JetBreakup/CMakeLists.txt
+++ b/apps/cpu/JetBreakup/CMakeLists.txt
@@ -3,4 +3,4 @@
 ########################################################
 PROJECT(JetBreakup)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES JetBreakup.cpp )
\ No newline at end of file
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} MultiphaseFlow FILES JetBreakup.cpp )
\ No newline at end of file
diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp b/apps/cpu/JetBreakup/JetBreakup.cpp
index 2115b515f1c77cd97b587449ab9881642aa6e1be..b0b25bb07aac72e0db07f92b0d8aefa281938811 100644
--- a/apps/cpu/JetBreakup/JetBreakup.cpp
+++ b/apps/cpu/JetBreakup/JetBreakup.cpp
@@ -209,10 +209,10 @@ void run(string configname)
         kernel->setInterfaceWidth(interfaceWidth);
         //dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(0.0);
 
-        SPtr<BCProcessor> bcProc(new BCProcessor());
-        // BCProcessorPtr bcProc(new ThinWallBCProcessor());
+        SPtr<BCSet> bcProc(new BCSet());
+        // BCSetPtr bcProc(new ThinWallBCSet());
 
-        kernel->setBCProcessor(bcProc);
+        kernel->setBCSet(bcProc);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
         // grid->setPeriodicX1(true);
@@ -226,15 +226,15 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        // SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        // SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        // SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        // SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         // rcp->setNu(nuLB);
         // rcp->setNuLG(nuL, nuG);
         // rcp->setDensityRatio(densityRatio);
 
         rcp->setLBMKernel(kernel);
-        rcp->setBCProcessor(bcProc);
+        rcp->setBCSet(bcProc);
         //////////////////////////////////////////////////////////////////////////
         // BC Adapter
         //////////////////////////////////////////////////////////////////////////////
@@ -246,24 +246,24 @@ void run(string configname)
         fctF1.DefineConst("R", 8.0);
         fctF1.DefineConst("x0", 0.0);
         fctF1.DefineConst("z0", 0.0);
-        // SPtr<BCAdapter> velBCAdapterF1(
-        //    new MultiphaseVelocityBCAdapter(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST));
+        // SPtr<BC> velBCF1(
+        //    new MultiphaseVelocityBC(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST));
 
         mu::Parser fctF2;
         fctF2.SetExpr("vy1");
         fctF2.DefineConst("vy1", U_LB);
 
         real startTime = 1;
-        SPtr<BCAdapter> velBCAdapterF1(
-            new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime));
-        SPtr<BCAdapter> velBCAdapterF2(
-            new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime));
+        SPtr<BC> velBCF1(
+            new MultiphaseVelocityBC(true, false, false, fctF1, phiH, 0.0, startTime));
+        SPtr<BC> velBCF2(
+            new MultiphaseVelocityBC(true, false, false, fctF2, phiH, startTime, endTime));
 
-        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+        SPtr<BC> noSlipBC(new NoSlipBC());
+        noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
 
-        SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-        denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+        SPtr<BC> denBC(new DensityBC(rhoLB));
+        denBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNonReflectingOutflowBCStrategy()));
 
         mu::Parser fctPhi_F1;
         fctPhi_F1.SetExpr("phiH");
@@ -277,13 +277,13 @@ void run(string configname)
         fctvel_F2_init.SetExpr("U");
         fctvel_F2_init.DefineConst("U", 0);
 
-        velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+        velBCF1->setBCStrategy(SPtr<BCStrategy>(new MultiphaseVelocityBCStrategy()));
         //////////////////////////////////////////////////////////////////////////////////
         // BC visitor
         MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-        bcVisitor.addBC(noSlipBCAdapter);
-        bcVisitor.addBC(denBCAdapter); // Ohne das BB?
-        bcVisitor.addBC(velBCAdapterF1);
+        bcVisitor.addBC(noSlipBC);
+        bcVisitor.addBC(denBC); // Ohne das BB?
+        bcVisitor.addBC(velBCF1);
 
         //SPtr<D3Q27Interactor> inflowF1Int;
         //SPtr<D3Q27Interactor> cylInt;
@@ -370,17 +370,17 @@ void run(string configname)
             GenBlocksGridVisitor genBlocks(gridCube);
             grid->accept(genBlocks);
 
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
-            //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter,
+            //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBC,
             //                                                        Interactor3D::SOLID, Interactor3D::POINTS));
 
             // inflowF1Int =
-            //    SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            // inflowF1Int->addBCAdapter(velBCAdapterF2);
+            //    SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBC, Interactor3D::SOLID));
+            // inflowF1Int->addBC(velBCF2);
 
-            SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBC, Interactor3D::SOLID));
 
             // Create boundary conditions geometry
             GbCuboid3DPtr wallXmin(
@@ -404,28 +404,28 @@ void run(string configname)
 
             // Add boundary conditions to grid generator
             SPtr<D3Q27Interactor> wallXminInt(
-                new D3Q27Interactor(wallXmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                new D3Q27Interactor(wallXmin, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallXmaxInt(
-                new D3Q27Interactor(wallXmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                new D3Q27Interactor(wallXmax, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallZminInt(
-                new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                new D3Q27Interactor(wallZmin, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallZmaxInt(
-                new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                new D3Q27Interactor(wallZmax, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallYminInt(
-                new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                new D3Q27Interactor(wallYmin, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallYmaxInt(
-                new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                new D3Q27Interactor(wallYmax, grid, noSlipBC, Interactor3D::SOLID));
 
-            //cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCAdapterF1, Interactor3D::SOLID));
-            //cylInt->addBCAdapter(velBCAdapterF2);
-            // SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter,
+            //cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCF1, Interactor3D::SOLID));
+            //cylInt->addBC(velBCF2);
+            // SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBC,
             // Interactor3D::SOLID));
 
-            inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapterF1, Interactor3D::SOLID));
-            inflowInt->addBCAdapter(velBCAdapterF2);
+            inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCF1, Interactor3D::SOLID));
+            inflowInt->addBC(velBCF2);
 
             SPtr<D3Q27Interactor> solidInt =
-                SPtr<D3Q27Interactor>(new D3Q27Interactor(geoSolid, grid, noSlipBCAdapter, Interactor3D::SOLID));
+                SPtr<D3Q27Interactor>(new D3Q27Interactor(geoSolid, grid, noSlipBC, Interactor3D::SOLID));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
             //intHelper.addInteractor(cylInt);
@@ -444,7 +444,7 @@ void run(string configname)
 
             intHelper.selectBlocks();
 
-            ppblocks->process(0);
+            ppblocks->update(0);
             ppblocks.reset();
 
             unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -533,7 +533,7 @@ void run(string configname)
             //}
             //    SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0);
             //    SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
-            //    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+            //    SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
             //    for (int ix3 = 0; ix3 <= 13; ix3++) {
             //        for (int ix2 = 0; ix2 <= 13; ix2++) {
@@ -548,9 +548,9 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-                ppgeo->process(0);
+                ppgeo->update(0);
                 ppgeo.reset();
             }
 
@@ -580,15 +580,15 @@ void run(string configname)
         t_ast = 7.19;
         t = (int)(t_ast/(U_LB/(D_LB)));
         visSch->addSchedule(t,t,t); //t=7.19
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-        pp->process(0);
+        pp->update(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-        auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+        auto timeDepBC = make_shared<TimeDependentBCSimulationObserver>(TimeDependentBCSimulationObserver(grid, timeBCSch));
         timeDepBC->addInteractor(inflowInt);
 
 #ifdef _OPENMP
@@ -596,15 +596,15 @@ void run(string configname)
 #endif
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(timeDepBC);
-        calculator->addCoProcessor(rcp);
+        SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+        simulation->addSimulationObserver(npr);
+        simulation->addSimulationObserver(pp);
+        simulation->addSimulationObserver(timeDepBC);
+        simulation->addSimulationObserver(rcp);
 
         if (myid == 0)
             UBLOG(logINFO, "Simulation-start");
-        calculator->calculate();
+        simulation->run();
         if (myid == 0)
             UBLOG(logINFO, "Simulation-end");
     } catch (std::exception &e) {
diff --git a/apps/cpu/LaminarTubeFlow/ltf.cpp b/apps/cpu/LaminarTubeFlow/ltf.cpp
index cbafef30c489a26b5f8df9610ec3e6ad7aa1da79..c70c2c19e7a02129ff00f8ca3bd0d7e53894831c 100644
--- a/apps/cpu/LaminarTubeFlow/ltf.cpp
+++ b/apps/cpu/LaminarTubeFlow/ltf.cpp
@@ -66,60 +66,60 @@ void run(string configname)
 
       //BC Adapter
       //////////////////////////////////////////////////////////////////////////////
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new ThinWallNoSlipBCAlgorithm()));
-      //SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-      //denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new EqDensityBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new ThinWallNoSlipBCStrategy()));
+      //SPtr<BC> denBC(new DensityBC(rhoLB));
+      //denBC->setBCStrategy(SPtr<BCStrategy>(new EqDensityBCStrategy()));
 
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
 
-      SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-      denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
-      //denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
+      SPtr<BC> denBC(new DensityBC(rhoLB));
+      denBC->setBCStrategy(SPtr<BCStrategy>(new NonReflectingOutflowBCStrategy()));
+      //denBC->setBCStrategy(SPtr<BCStrategy>(new NonEqDensityBCStrategy()));
 
       //double startTime = 5;
       mu::Parser fct1;
       fct1.SetExpr("U");
       fct1.DefineConst("U", uLB);
-      SPtr<BCAdapter> velBCAdapter1(new VelocityBCAdapter(true, false, false, fct1, 0, BCFunction::INFCONST));
-      //velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-      velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
+      SPtr<BC> velBC1(new VelocityBC(true, false, false, fct1, 0, BCFunction::INFCONST));
+      //velBC1->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+      velBC1->setBCStrategy(SPtr<BCStrategy>(new VelocityWithDensityBCStrategy()));
 
       //mu::Parser fct2;
       //fct2.SetExpr("U");
       //fct2.DefineConst("U", uLB);
-      //SPtr<BCAdapter> velBCAdapter2(new VelocityBCAdapter(true, false, false, fct2, startTime, BCFunction::INFCONST));
+      //SPtr<BC> velBC2(new VelocityBC(true, false, false, fct2, startTime, BCFunction::INFCONST));
 
       //////////////////////////////////////////////////////////////////////////////////
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(noSlipBCAdapter);
-      bcVisitor.addBC(denBCAdapter);
-      //bcVisitor.addBC(velBCAdapter1);
+      bcVisitor.addBC(noSlipBC);
+      bcVisitor.addBC(denBC);
+      //bcVisitor.addBC(velBC1);
 
       SPtr<Grid3D> grid(new Grid3D(comm));
 
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
 
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel());
       //double bulckViscosity = 3700*nuLB;
       //dynamicPointerCast<CompressibleCumulant4thOrderViscosityLBMKernel>(kernel)->setBulkViscosity(bulckViscosity);
       SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantK17LBMKernel());
-      kernel->setBCProcessor(bcProc);
-      kernel->setBCProcessor(bcProc);
+      kernel->setBCSet(bcProc);
+      kernel->setBCSet(bcProc);
 
       //////////////////////////////////////////////////////////////////////////
       SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, DIR_00M));
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      //SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm));
-      SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm));
-      migCoProcessor->setLBMKernel(kernel);
-      migCoProcessor->setBCProcessor(bcProc);
-      migCoProcessor->setNu(nuLB);
-      migCoProcessor->setNuLG(0.01, 0.01);
-      migCoProcessor->setDensityRatio(1);
+      //SPtr<MPIIOMigrationSimulationObserver> migSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, pathname + "/mig", comm));
+      SPtr<MPIIOMigrationBESimulationObserver> migSimulationObserver(new MPIIOMigrationBESimulationObserver(grid, mSch, metisVisitor, pathname + "/mig", comm));
+      migSimulationObserver->setLBMKernel(kernel);
+      migSimulationObserver->setBCSet(bcProc);
+      migSimulationObserver->setNu(nuLB);
+      migSimulationObserver->setNuLG(0.01, 0.01);
+      migSimulationObserver->setDensityRatio(1);
       //////////////////////////////////////////////////////////////////////////
 
       SPtr<D3Q27Interactor> inflowInt;
@@ -189,11 +189,11 @@ void run(string configname)
          GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2-blockLength, g_minX3-blockLength, g_maxX1+blockLength, g_maxX2+blockLength, g_maxX3+blockLength));
          if (myid==0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname+"/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
-         ppblocks->process(0);
+         ppblocks->update(0);
 
-         SPtr<D3Q27Interactor> cylinderInt(new D3Q27Interactor(cylinder, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID));
+         SPtr<D3Q27Interactor> cylinderInt(new D3Q27Interactor(cylinder, grid, noSlipBC, Interactor3D::INVERSESOLID));
 
          //double r = dynamicPointerCast<GbCylinder3D>(cylinder)->getRadius();
          //double cx1 = g_minX1;
@@ -211,16 +211,16 @@ void run(string configname)
          ////fct.DefineConst("y0", cx2);
          ////fct.DefineConst("z0", cx3);
          ////fct.DefineConst("nue", nuLB);
-         //SPtr<BCAdapter> velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-         //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-         //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
+         //SPtr<BC> velBC(new VelocityBC(true, false, false, fct, 0, BCFunction::INFCONST));
+         //velBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+         //velBC->setBCStrategy(SPtr<BCStrategy>(new VelocityWithDensityBCStrategy()));
          
-         inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapter1, Interactor3D::SOLID));
-         //inflowInt->addBCAdapter(velBCAdapter2);
+         inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBC1, Interactor3D::SOLID));
+         //inflowInt->addBC(velBC2);
 
 
          //outflow
-         SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBC, Interactor3D::SOLID));
 
          //SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
          InteractorsHelper intHelper(grid, metisVisitor);
@@ -229,7 +229,7 @@ void run(string configname)
          intHelper.addInteractor(outflowInt);
          intHelper.selectBlocks();
 
-         ppblocks->process(0);
+         ppblocks->update(0);
          ppblocks.reset();
 
          unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -268,7 +268,7 @@ void run(string configname)
 
          intHelper.setBC();
 
-         bcVisitor.addBC(velBCAdapter1);
+         bcVisitor.addBC(velBC1);
          grid->accept(bcVisitor);
 
          //initialization of distributions
@@ -280,8 +280,8 @@ void run(string configname)
          //boundary conditions grid
          {
             SPtr<UbScheduler> geoSch(new UbScheduler(1));
-            SPtr<CoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-            ppgeo->process(0);
+            SPtr<SimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+            ppgeo->update(0);
             ppgeo.reset();
          }
 
@@ -302,7 +302,7 @@ void run(string configname)
             VF_LOG_INFO("path = {}", pathname);
          }
 
-         migCoProcessor->restart((int)restartStep);
+         migSimulationObserver->restart((int)restartStep);
          grid->setTimeStep(restartStep);
 
          if (myid == 0) VF_LOG_INFO("Restart - end");
@@ -316,26 +316,26 @@ void run(string configname)
       grid->accept(setInterConnsVisitor);
 
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<CoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+      SPtr<SimulationObserver> pp(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(100, 100, 100000000));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-      //auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+      //auto timeDepBC = make_shared<TimeDependentBCSimulationObserver>(TimeDependentBCSimulationObserver(grid, timeBCSch));
       //timeDepBC->addInteractor(inflowInt);
 
       omp_set_num_threads(numOfThreads);
       numOfThreads = 1;
       SPtr<UbScheduler> stepGhostLayer(visSch);
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, int(endTime)));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(pp);
-      calculator->addCoProcessor(migCoProcessor);
-      //calculator->addCoProcessor(timeDepBC);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, int(endTime)));
+      simulation->addSimulationObserver(npr);
+      simulation->addSimulationObserver(pp);
+      simulation->addSimulationObserver(migSimulationObserver);
+      //simulation->addSimulationObserver(timeDepBC);
 
       if (myid == 0) VF_LOG_INFO("Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) VF_LOG_INFO("Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/LiggghtsApp/LiggghtsApp.cpp b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
index b3c49ccaec94747efea9c28a1b1cb8a937c03444..e9116295dd531257cae28e8703327b4e1c32a594 100644
--- a/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
+++ b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
@@ -10,7 +10,7 @@
 //#include "modify.h"
 //#include "fix_lb_coupling_onetoone.h"
 
-#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingSimulationObserver.h"
 #include "LiggghtsCouplingWrapper.h"
 #include "IBcumulantK17LBMKernel.h"
 
@@ -53,15 +53,15 @@ int main(int argc, char *argv[])
     double nuLB = 1e-2; // 5e-5;
 
     SPtr<LBMKernel> kernel   = make_shared<IBcumulantK17LBMKernel>();
-    SPtr<BCProcessor> bcProc = make_shared<BCProcessor>();
-    kernel->setBCProcessor(bcProc);
+    SPtr<BCSet> bcProc = make_shared<BCSet>();
+    kernel->setBCSet(bcProc);
 
-    SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-    noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+    SPtr<BC> noSlipBC(new NoSlipBC());
+    noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
     //////////////////////////////////////////////////////////////////////////////////
     // BC visitor
     BoundaryConditionsBlockVisitor bcVisitor;
-    bcVisitor.addBC(noSlipBCAdapter);
+    bcVisitor.addBC(noSlipBC);
 
 
 
@@ -77,7 +77,7 @@ int main(int argc, char *argv[])
     UbSystem::makeDirectory(outputPath);
     UbSystem::makeDirectory(outputPath + "/liggghts");
 
-    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, vf::lbm::dir::DIR_MMM, MetisPartitioner::RECURSIVE));
     
     SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3);
     if (myid == 0)
@@ -86,10 +86,10 @@ int main(int argc, char *argv[])
     GenBlocksGridVisitor genBlocks(gridCube);
     grid->accept(genBlocks);
 
-    SPtr<CoProcessor> ppblocks =
-        make_shared <WriteBlocksCoProcessor>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+    SPtr<SimulationObserver> ppblocks =
+        make_shared <WriteBlocksSimulationObserver>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
                                                           WbWriterVtkXmlBinary::getInstance(), comm);
-    ppblocks->process(0);
+    ppblocks->update(0);
     ppblocks.reset();
 
     double dx2 = 2.0 * dx;
@@ -100,8 +100,8 @@ int main(int argc, char *argv[])
         new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_maxX3, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
     GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
 
-    SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-    SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBC, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBC, Interactor3D::SOLID));
 
     InteractorsHelper intHelper(grid, metisVisitor, true);
     intHelper.addInteractor(wallZminInt);
@@ -148,15 +148,15 @@ int main(int argc, char *argv[])
     wrapper.runUpto(demSubsteps - 1);
 
   
-    SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor =
-        make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units);
+    SPtr<LiggghtsCouplingSimulationObserver> lcSimulationObserver =
+        make_shared<LiggghtsCouplingSimulationObserver>(grid, lScheduler, comm, wrapper, demSubsteps, units);
 
     // boundary conditions grid
     {
         SPtr<UbScheduler> geoSch(new UbScheduler(1));
-        SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+        SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
             grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-        ppgeo->process(0);
+        ppgeo->update(0);
         ppgeo.reset();
     }
 
@@ -168,17 +168,17 @@ int main(int argc, char *argv[])
 
     // write data for visualization of macroscopic quantities
     SPtr<UbScheduler> visSch(new UbScheduler(vtkSteps));
-    SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(
-        new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(),
+    SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(
+        new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(),
                                                   SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
     int endTime = 3000; //20;
-    SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime));
-    calculator->addCoProcessor(lcCoProcessor);
-    calculator->addCoProcessor(writeMQCoProcessor);
+    SPtr<Simulation> simulation(new Simulation(grid, lScheduler, endTime));
+    simulation->addSimulationObserver(lcSimulationObserver);
+    simulation->addSimulationObserver(writeMQSimulationObserver);
 
     if (myid == 0) UBLOG(logINFO, "Simulation-start");
-    calculator->calculate();
+    simulation->run();
     if (myid == 0) UBLOG(logINFO, "Simulation-end");
 
     //MPI_Init(&argc, &argv);
diff --git a/apps/cpu/Multiphase/CMakeLists.txt b/apps/cpu/Multiphase/CMakeLists.txt
index 3daebaf854a900fa1fdb9bc31b015969167de15d..0c7e43dcaf2185360c49ee78b86f34840b06b4df 100644
--- a/apps/cpu/Multiphase/CMakeLists.txt
+++ b/apps/cpu/Multiphase/CMakeLists.txt
@@ -1,3 +1,3 @@
 PROJECT(Multiphase)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES Multiphase.cpp )
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} MultiphaseFlow FILES Multiphase.cpp )
diff --git a/apps/cpu/Multiphase/Multiphase.cpp b/apps/cpu/Multiphase/Multiphase.cpp
index 4d4bc9cf82afe16309f22b69c0973acb3f96324c..4c30d97e5a9c97125b1d91c260cef1639fbf7a3e 100644
--- a/apps/cpu/Multiphase/Multiphase.cpp
+++ b/apps/cpu/Multiphase/Multiphase.cpp
@@ -112,10 +112,10 @@ void run(string configname)
         kernel->setContactAngle(theta);
         kernel->setInterfaceWidth(interfaceWidth);
 
-        SPtr<BCProcessor> bcProc(new BCProcessor());
-        // BCProcessorPtr bcProc(new ThinWallBCProcessor());
+        SPtr<BCSet> bcProc(new BCSet());
+        // BCSetPtr bcProc(new ThinWallBCSet());
 
-        kernel->setBCProcessor(bcProc);
+        kernel->setBCSet(bcProc);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
          //grid->setPeriodicX1(true);
@@ -129,15 +129,15 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        //SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         //rcp->setNu(nuLB);
         //rcp->setNuLG(nuL, nuG);
         //rcp->setDensityRatio(densityRatio);
 
         rcp->setLBMKernel(kernel);
-        rcp->setBCProcessor(bcProc);
+        rcp->setBCSet(bcProc);
         //////////////////////////////////////////////////////////////////////////
         // BC Adapter
         //////////////////////////////////////////////////////////////////////////////
@@ -149,22 +149,22 @@ void run(string configname)
         fctF1.DefineConst("R", 8.0);
         fctF1.DefineConst("x0", 0.0);
         fctF1.DefineConst("z0", 0.0);
-        //SPtr<BCAdapter> velBCAdapterF1(
-        //    new MultiphaseVelocityBCAdapter(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST));
+        //SPtr<BC> velBCF1(
+        //    new MultiphaseVelocityBC(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST));
 
         mu::Parser fctF2;
         fctF2.SetExpr("vy1");
         fctF2.DefineConst("vy1", uLB);
 
         real startTime = 30;
-        SPtr<BCAdapter> velBCAdapterF1(new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime));
-        SPtr<BCAdapter> velBCAdapterF2(new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime));
+        SPtr<BC> velBCF1(new MultiphaseVelocityBC(true, false, false, fctF1, phiH, 0.0, startTime));
+        SPtr<BC> velBCF2(new MultiphaseVelocityBC(true, false, false, fctF2, phiH, startTime, endTime));
 
-        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+        SPtr<BC> noSlipBC(new NoSlipBC());
+        noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
 
-        SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-        denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+        SPtr<BC> denBC(new DensityBC(rhoLB));
+        denBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNonReflectingOutflowBCStrategy()));
 
         mu::Parser fctPhi_F1;
         fctPhi_F1.SetExpr("phiH");
@@ -178,13 +178,13 @@ void run(string configname)
         fctvel_F2_init.SetExpr("U");
         fctvel_F2_init.DefineConst("U", 0);
 
-        velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+        velBCF1->setBCStrategy(SPtr<BCStrategy>(new MultiphaseVelocityBCStrategy()));
         //////////////////////////////////////////////////////////////////////////////////
         // BC visitor
         MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-        bcVisitor.addBC(noSlipBCAdapter);
-        bcVisitor.addBC(denBCAdapter); //Ohne das BB?
-        bcVisitor.addBC(velBCAdapterF1);
+        bcVisitor.addBC(noSlipBC);
+        bcVisitor.addBC(denBC); //Ohne das BB?
+        bcVisitor.addBC(velBCF1);
 
         SPtr<D3Q27Interactor> inflowF1Int;
         SPtr<D3Q27Interactor> cylInt;
@@ -265,16 +265,16 @@ void run(string configname)
             GenBlocksGridVisitor genBlocks(gridCube);
             grid->accept(genBlocks);
 
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
-            SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::POINTS));
+            SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBC, Interactor3D::SOLID, Interactor3D::POINTS));
 
             //inflowF1Int =
-            //    SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            //inflowF1Int->addBCAdapter(velBCAdapterF2);
+            //    SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBC, Interactor3D::SOLID));
+            //inflowF1Int->addBC(velBCF2);
 
-            SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBC, Interactor3D::SOLID));
 
             // Create boundary conditions geometry
             GbCuboid3DPtr wallXmin(new GbCuboid3D(g_minX1 - dx, g_minX2 - dx, g_minX3 - dx, g_minX1, g_maxX2 + dx, g_maxX3));
@@ -291,17 +291,17 @@ void run(string configname)
             GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
 
             // Add boundary conditions to grid generator
-            SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBC, Interactor3D::SOLID));
 
 
-            cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCAdapterF1, Interactor3D::SOLID));
-            cylInt->addBCAdapter(velBCAdapterF2);
-            //SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCF1, Interactor3D::SOLID));
+            cylInt->addBC(velBCF2);
+            //SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBC, Interactor3D::SOLID));
 
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
@@ -322,7 +322,7 @@ void run(string configname)
 
             intHelper.selectBlocks();
 
-            ppblocks->process(0);
+            ppblocks->update(0);
             ppblocks.reset();
 
             unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -400,7 +400,7 @@ void run(string configname)
                 //}
             //    SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0);
             //    SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
-            //    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+            //    SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
             //    for (int ix3 = 0; ix3 <= 13; ix3++) {
             //        for (int ix2 = 0; ix2 <= 13; ix2++) {
@@ -415,9 +415,9 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-                ppgeo->process(0);
+                ppgeo->update(0);
                 ppgeo.reset();
             }
 
@@ -455,16 +455,16 @@ void run(string configname)
         grid->accept(setConnsVisitor);
 
         SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
-            //SPtr<WriteMacroscopicQuantitiesCoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
+            //SPtr<WriteMacroscopicQuantitiesSimulationObserver> pp(new WriteMacroscopicQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-        pp->process(0);
+        pp->update(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-        auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+        auto timeDepBC = make_shared<TimeDependentBCSimulationObserver>(TimeDependentBCSimulationObserver(grid, timeBCSch));
         timeDepBC->addInteractor(cylInt);
 
 #ifdef _OPENMP
@@ -472,18 +472,18 @@ void run(string configname)
 #endif
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(timeDepBC);
-        calculator->addCoProcessor(rcp);
+        SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+        simulation->addSimulationObserver(npr);
+        simulation->addSimulationObserver(pp);
+        simulation->addSimulationObserver(timeDepBC);
+        simulation->addSimulationObserver(rcp);
 
 
 
 
         if (myid == 0)
             UBLOG(logINFO, "Simulation-start");
-        calculator->calculate();
+        simulation->run();
         if (myid == 0)
             UBLOG(logINFO, "Simulation-end");
     } catch (std::exception &e) {
diff --git a/apps/cpu/MultiphaseDropletTest.zip b/apps/cpu/MultiphaseDropletTest.zip
deleted file mode 100644
index 5eb13a6c0bacfbf392deb00c6b388ba282c038e0..0000000000000000000000000000000000000000
Binary files a/apps/cpu/MultiphaseDropletTest.zip and /dev/null differ
diff --git a/apps/cpu/MultiphaseDropletTest/CMakeLists.txt b/apps/cpu/MultiphaseDropletTest/CMakeLists.txt
index 3f01ad73a0b28f7050667dde7b9408ac00b76e42..b70fdf8fb1e93807e7812988374b28a4f9a969b4 100644
--- a/apps/cpu/MultiphaseDropletTest/CMakeLists.txt
+++ b/apps/cpu/MultiphaseDropletTest/CMakeLists.txt
@@ -1,3 +1,3 @@
 PROJECT(MultiphaseDropletTest)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES droplet.cpp )
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} MultiphaseFlow FILES droplet.cpp )
diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp
index a9d561930a77cc447bbe6c959bd7e8464f314d69..a5658a8f39055201e15619fb4dd18a6955576374 100644
--- a/apps/cpu/MultiphaseDropletTest/droplet.cpp
+++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp
@@ -169,17 +169,17 @@ void run(string configname)
         kernel->setMultiphaseModelParameters(beta, kappa);
         kernel->setContactAngle(theta);
 
-        SPtr<BCProcessor> bcProc(new BCProcessor());
-        // BCProcessorPtr bcProc(new ThinWallBCProcessor());
+        SPtr<BCSet> bcProc(new BCSet());
+        // BCSetPtr bcProc(new ThinWallBCSet());
 
-        kernel->setBCProcessor(bcProc);
+        kernel->setBCSet(bcProc);
 
-        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+        SPtr<BC> noSlipBC(new NoSlipBC());
+        noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
         //////////////////////////////////////////////////////////////////////////////////
         // BC visitor
         MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-        bcVisitor.addBC(noSlipBCAdapter);
+        bcVisitor.addBC(noSlipBC);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
         grid->setDeltaX(dx);
@@ -194,15 +194,15 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        //SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         // rcp->setNu(nuLB);
         // rcp->setNuLG(nuL, nuG);
         // rcp->setDensityRatio(densityRatio);
 
         rcp->setLBMKernel(kernel);
-        rcp->setBCProcessor(bcProc);
+        rcp->setBCSet(bcProc);
         //////////////////////////////////////////////////////////////////////////
 
         if (newStart) {
@@ -233,10 +233,10 @@ void run(string configname)
             GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - dx2, g_maxX2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
             GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
 
-            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBC, Interactor3D::SOLID));
  
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
@@ -244,7 +244,7 @@ void run(string configname)
             intHelper.addInteractor(wallYmaxInt);
             intHelper.selectBlocks();
 
-            ppblocks->process(0);
+            ppblocks->update(0);
             ppblocks.reset();
 
             unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -317,9 +317,9 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-                ppgeo->process(0);
+                ppgeo->update(0);
                 ppgeo.reset();
             }
 
@@ -380,26 +380,26 @@ void run(string configname)
         t = (int)(t_ast/std::sqrt(g_y/D));         
         visSch->addSchedule(t,t,t); //t=9
 
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
         if(grid->getTimeStep() == 0) 
-            pp->process(0);
+            pp->update(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         omp_set_num_threads(numOfThreads);
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(rcp);
+        SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+        simulation->addSimulationObserver(npr);
+        simulation->addSimulationObserver(pp);
+        simulation->addSimulationObserver(rcp);
 
 
         if (myid == 0)
             UBLOG(logINFO, "Simulation-start");
-        calculator->calculate();
+        simulation->run();
         if (myid == 0)
             UBLOG(logINFO, "Simulation-end");
             
diff --git a/apps/cpu/Nozzle/CMakeLists.txt b/apps/cpu/Nozzle/CMakeLists.txt
index b653be79cefa91cb64408bdb7e7507bd79a57b26..398cf12148921996d7d9eb73714a8ddca535ba93 100644
--- a/apps/cpu/Nozzle/CMakeLists.txt
+++ b/apps/cpu/Nozzle/CMakeLists.txt
@@ -1,3 +1,3 @@
 PROJECT(Nozzle)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES nozzle.cpp )
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling MultiphaseFlow FILES nozzle.cpp )
diff --git a/apps/cpu/Nozzle/nozzle.cpp b/apps/cpu/Nozzle/nozzle.cpp
index 54a306729006a60ec02c04cf029f529163acbe0f..6a3a7f1db25dc189c23ff5430368efcfef2f7b65 100644
--- a/apps/cpu/Nozzle/nozzle.cpp
+++ b/apps/cpu/Nozzle/nozzle.cpp
@@ -4,7 +4,7 @@
 
 #include "VirtualFluids.h"
 
-#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingSimulationObserver.h"
 #include "LiggghtsCouplingWrapper.h"
 #include "IBcumulantK17LBMKernel.h"
 
@@ -119,10 +119,10 @@ int main(int argc, char *argv[])
     //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 2400, d_part / dx, uRef);
     
 
-    //SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-    //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
-    SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-    noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+    //SPtr<BC> noSlipBC(new NoSlipBC());
+    //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
+    SPtr<BC> noSlipBC(new NoSlipBC());
+    noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
 
 
 
@@ -158,10 +158,10 @@ int main(int argc, char *argv[])
     //    fct.DefineConst("NplusOne", N + 1.0);
     
 
-    //SPtr<BCAdapter> inflowConcreteBCAdapter(new VelocityBCAdapter(false, false, true, fct, 0, BCFunction::INFCONST));
-    //inflowConcreteBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-    SPtr<BCAdapter> inflowConcreteBCAdapter(new MultiphaseVelocityBCAdapter(false, false, true, fct, phiH, 0, BCFunction::INFCONST));
-    inflowConcreteBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+    //SPtr<BC> inflowConcreteBC(new VelocityBC(false, false, true, fct, 0, BCFunction::INFCONST));
+    //inflowConcreteBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+    SPtr<BC> inflowConcreteBC(new MultiphaseVelocityBC(false, false, true, fct, phiH, 0, BCFunction::INFCONST));
+    inflowConcreteBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseVelocityBCStrategy()));
 
     
         // air inflow boundary condition
@@ -258,23 +258,23 @@ int main(int argc, char *argv[])
     fctVx3.DefineConst("NplusOne", N + 1.0);
     
 
-    //SPtr<BCAdapter> inflowAirBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-    //inflowAirBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-    SPtr<BCAdapter> inflowAirBCAdapter(new MultiphaseVelocityBCAdapter(true, false, true, fctVx1, fctVx3, fctVx3, phiL, 0, BCFunction::INFCONST));
-    inflowAirBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+    //SPtr<BC> inflowAirBC(new VelocityBC(true, false, false, fct, 0, BCFunction::INFCONST));
+    //inflowAirBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+    SPtr<BC> inflowAirBC(new MultiphaseVelocityBC(true, false, true, fctVx1, fctVx3, fctVx3, phiL, 0, BCFunction::INFCONST));
+    inflowAirBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseVelocityBCStrategy()));
 
-    SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB));
-    //outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
-    //SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB));
-    outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+    SPtr<BC> outflowBC(new DensityBC(rhoLB));
+    //outflowBC->setBCStrategy(SPtr<BCStrategy>(new NonEqDensityBCStrategy()));
+    //SPtr<BC> outflowBC(new DensityBC(rhoLB));
+    outflowBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNonReflectingOutflowBCStrategy()));
     //////////////////////////////////////////////////////////////////////////////////
     // BC visitor
     //BoundaryConditionsBlockVisitor bcVisitor;♣
     MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-    bcVisitor.addBC(noSlipBCAdapter);
-    bcVisitor.addBC(inflowConcreteBCAdapter);
-    bcVisitor.addBC(inflowAirBCAdapter);
-    bcVisitor.addBC(outflowBCAdapter);
+    bcVisitor.addBC(noSlipBC);
+    bcVisitor.addBC(inflowConcreteBC);
+    bcVisitor.addBC(inflowAirBC);
+    bcVisitor.addBC(outflowBC);
 
     // SPtr<LBMKernel> kernel   = make_shared<IBcumulantK17LBMKernel>();
     // SPtr<LBMKernel> kernel   = make_shared<CumulantK17LBMKernel>();
@@ -297,8 +297,8 @@ int main(int argc, char *argv[])
     kernel->setMultiphaseModelParameters(beta, kappa);
     kernel->setContactAngle(theta);
 
-    SPtr<BCProcessor> bcProc = make_shared<BCProcessor>();
-    kernel->setBCProcessor(bcProc);
+    SPtr<BCSet> bcProc = make_shared<BCSet>();
+    kernel->setBCSet(bcProc);
 
     SPtr<Grid3D> grid = make_shared<Grid3D>(comm);
     grid->setPeriodicX1(false);
@@ -338,80 +338,80 @@ int main(int argc, char *argv[])
     meshNozzleAirDistributor->readMeshFromSTLFileASCII(geoPath + "/01_Nozzle_Air_Distributor.stl", false);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirDistributor:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAirDistributor.get(), outputPath + "/geo/meshNozzleAirDistributor", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleAirDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirDistributor, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    SPtr<Interactor3D> intrNozzleAirDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirDistributor, grid, noSlipBC, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
     ///////////////////////////////////////////////////////////
     SPtr<GbTriFaceMesh3D> meshNozzleAirInlet = std::make_shared<GbTriFaceMesh3D>();
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirInlet:start");
     meshNozzleAirInlet->readMeshFromSTLFileASCII(geoPath + "/02_Nozzle_Air_Inlet.stl", false);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirInlet:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAirInlet.get(), outputPath + "/geo/meshNozzleAirInlet", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirInlet, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    SPtr<Interactor3D> intrNozzleAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirInlet, grid, noSlipBC, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
     ///////////////////////////////////////////////////////////
     SPtr<GbTriFaceMesh3D> meshNozzleSpacer = std::make_shared<GbTriFaceMesh3D>();
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleSpacer:start");
     meshNozzleSpacer->readMeshFromSTLFileASCII(geoPath + "/03_Nozzle_Spacer.stl", true);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleSpacer:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleSpacer.get(), outputPath + "/geo/meshNozzleSpacer", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleSpacer = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleSpacer, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    SPtr<Interactor3D> intrNozzleSpacer = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleSpacer, grid, noSlipBC, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
     ///////////////////////////////////////////////////////////
     SPtr<GbTriFaceMesh3D> meshNozzleAccDistributor = std::make_shared<GbTriFaceMesh3D>();
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccDistributor:start");
     meshNozzleAccDistributor->readMeshFromSTLFileASCII(geoPath + "/04_Nozzle_Acc_Distributor.stl", false);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccDistributor:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAccDistributor.get(), outputPath + "/geo/meshNozzleAccDistributor", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleAccDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccDistributor, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    SPtr<Interactor3D> intrNozzleAccDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccDistributor, grid, noSlipBC, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
     ///////////////////////////////////////////////////////////
     SPtr<GbTriFaceMesh3D> meshNozzleAccInlet = std::make_shared<GbTriFaceMesh3D>();
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccInlet:start");
     meshNozzleAccInlet->readMeshFromSTLFileASCII(geoPath + "/05_Nozzle_Acc_Inlet.stl", false);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccInlet:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAccInlet.get(), outputPath + "/geo/meshNozzleAccInlet", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleAccInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccInlet, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    SPtr<Interactor3D> intrNozzleAccInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccInlet, grid, noSlipBC, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
     ///////////////////////////////////////////////////////////
     SPtr<GbTriFaceMesh3D> meshNozzleVolcanNozzle1 = std::make_shared<GbTriFaceMesh3D>();
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle1:start");
     meshNozzleVolcanNozzle1->readMeshFromSTLFileBinary(geoPath + "/06_1_Nozzle_Volcan_Nozzle.stl", true);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle1:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleVolcanNozzle1.get(), outputPath + "/geo/meshNozzleVolcanNozzle1", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleVolcanNozzle1 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle1, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES);
+    SPtr<Interactor3D> intrNozzleVolcanNozzle1 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle1, grid, noSlipBC, Interactor3D::SOLID, Interactor3D::EDGES);
     ///////////////////////////////////////////////////////////
     SPtr<GbTriFaceMesh3D> meshNozzleVolcanNozzle2 = std::make_shared<GbTriFaceMesh3D>();
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle2:start");
     meshNozzleVolcanNozzle2->readMeshFromSTLFileBinary(geoPath + "/06_2_Nozzle_Volcan_Nozzle.stl", true);
     if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle2:end");
     if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleVolcanNozzle2.get(), outputPath + "/geo/meshNozzleVolcanNozzle2", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrNozzleVolcanNozzle2 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle2, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::POINTS);
+    SPtr<Interactor3D> intrNozzleVolcanNozzle2 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle2, grid, noSlipBC, Interactor3D::SOLID, Interactor3D::POINTS);
     ///////////////////////////////////////////////////////////
     //box
-    SPtr<D3Q27Interactor> intrBox = SPtr<D3Q27Interactor>(new D3Q27Interactor(gridCube, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID));
+    SPtr<D3Q27Interactor> intrBox = SPtr<D3Q27Interactor>(new D3Q27Interactor(gridCube, grid, noSlipBC, Interactor3D::INVERSESOLID));
     ///////////////////////////////////////////////////////////
     //inflow
     GbCylinder3DPtr geoInflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, 0.20105, -1.30181+0.0005, 0.390872-0.00229, 0.23, 0.013));
     if (myid == 0) GbSystem3D::writeGeoObject(geoInflow.get(), outputPath + "/geo/geoInflow", WbWriterVtkXmlBinary::getInstance());
-    SPtr<D3Q27Interactor> intrInflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, inflowConcreteBCAdapter, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> intrInflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, inflowConcreteBC, Interactor3D::SOLID));
     ///////////////////////////////////////////////////////////
     //outflow
     GbCylinder3DPtr geoOutflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, -0.22, -1.30181+0.0005, 0.390872-0.00229, -0.21, 0.013));
     //GbCylinder3DPtr geoOutflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, g_minX3, -1.30181+0.0005, 0.390872-0.00229, -0.21, 0.013));
     if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), outputPath + "/geo/geoOutflow", WbWriterVtkXmlBinary::getInstance());
-    SPtr<D3Q27Interactor> intrOutflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, outflowBCAdapter, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> intrOutflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, outflowBC, Interactor3D::SOLID));
     ///////////////////////////////////////////////////////////
     //SPtr<GbTriFaceMesh3D> geoAirInlet = std::make_shared<GbTriFaceMesh3D>();
     //if (myid == 0) UBLOG(logINFO, "Read Air_Inlet:start");
     //geoAirInlet->readMeshFromSTLFileASCII(geoPath + "/Air_Inlet.stl", true);
     //if (myid == 0) UBLOG(logINFO, "Read Air_Inlet:end");
     //if (myid == 0) GbSystem3D::writeGeoObject(geoAirInlet.get(), outputPath + "/geo/geoAirInlet", WbWriterVtkXmlBinary::getInstance());
-    //SPtr<Interactor3D> intrAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(geoAirInlet, grid, inflowAirBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES);
+    //SPtr<Interactor3D> intrAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(geoAirInlet, grid, inflowAirBC, Interactor3D::SOLID, Interactor3D::EDGES);
     /////////////////////////////////////////////////////////////
     //Fluid area
     GbCylinder3DPtr geoFluidArea(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, g_minX3, -1.30181+0.0005, 0.390872-0.00229, g_maxX3, 0.013));
     if (myid == 0) GbSystem3D::writeGeoObject(geoFluidArea.get(), outputPath + "/geo/geoFluidArea", WbWriterVtkXmlBinary::getInstance());
-    SPtr<D3Q27Interactor> intrFluidArea = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoFluidArea, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID));
+    SPtr<D3Q27Interactor> intrFluidArea = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoFluidArea, grid, noSlipBC, Interactor3D::INVERSESOLID));
     ///////////////////////////////////////////////////////////
     ///////////////////////////////////////////////////////////
     GbCylinder3DPtr geoAirInflow(new GbCylinder3D(-1.31431 - 0.0005, 0.388587, 0.1383275, -1.31431, 0.388587, 0.1383275, 0.002765));
     if (myid == 0) GbSystem3D::writeGeoObject(geoAirInflow.get(), outputPath + "/geo/geoAirInlet", WbWriterVtkXmlBinary::getInstance());
-    SPtr<Interactor3D> intrAirInflow = std::make_shared<D3Q27Interactor>(geoAirInflow, grid, inflowAirBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES);
+    SPtr<Interactor3D> intrAirInflow = std::make_shared<D3Q27Interactor>(geoAirInflow, grid, inflowAirBC, Interactor3D::SOLID, Interactor3D::EDGES);
     ///////////////////////////////////////////////////////////
 
     InteractorsHelper intHelper(grid, metisVisitor, true);
@@ -435,9 +435,9 @@ int main(int argc, char *argv[])
 
     intHelper.selectBlocks();
 
-    SPtr<CoProcessor> ppblocks = make_shared<WriteBlocksCoProcessor>(
+    SPtr<SimulationObserver> ppblocks = make_shared<WriteBlocksSimulationObserver>(
          grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
-     ppblocks->process(0);
+     ppblocks->update(0);
      ppblocks.reset();
 
      if (myid == 0) UBLOG(logINFO, Utilities::toString(grid, comm->getNumberOfProcesses()));
@@ -496,14 +496,14 @@ int main(int argc, char *argv[])
     //wrapper.runUpto(1000);
 
     SPtr<UbScheduler> lScheduler = make_shared<UbScheduler>(1); 
-    SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor =
-        make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units);
+    SPtr<LiggghtsCouplingSimulationObserver> lcSimulationObserver =
+        make_shared<LiggghtsCouplingSimulationObserver>(grid, lScheduler, comm, wrapper, demSubsteps, units);
 
     // boundary conditions grid
     {
         SPtr<UbScheduler> geoSch(new UbScheduler(1));
-        SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-        ppgeo->process(0);
+        SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+        ppgeo->update(0);
         ppgeo.reset();
     }
 
@@ -518,25 +518,25 @@ int main(int argc, char *argv[])
     omp_set_num_threads(numOfThreads);
 
     SPtr<UbScheduler> nupsSch = std::make_shared<UbScheduler>(10, 10, 100);
-    SPtr<NUPSCounterCoProcessor> nupsCoProcessor = make_shared<NUPSCounterCoProcessor>(grid, nupsSch, numOfThreads, comm);
+    SPtr<NUPSCounterSimulationObserver> nupsSimulationObserver = make_shared<NUPSCounterSimulationObserver>(grid, nupsSch, numOfThreads, comm);
 
     //// write data for visualization of macroscopic quantities
     SPtr < UbScheduler> visSch(new UbScheduler(vtkSteps));
     //SPtr<UbScheduler> visSch(new UbScheduler(1, 8700, 8800));
    // visSch->addSchedule(1, 8700, 8800);
-    SPtr<WriteMultiphaseQuantitiesCoProcessor> writeMQCoProcessor(
-        new WriteMultiphaseQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlASCII::getInstance(),
+    SPtr<WriteMultiphaseQuantitiesSimulationObserver> writeMQSimulationObserver(
+        new WriteMultiphaseQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlASCII::getInstance(),
                                                   SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-    writeMQCoProcessor->process(0);
+    writeMQSimulationObserver->update(0);
 
     int endTime = 1000000;
-    SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime));
-    calculator->addCoProcessor(nupsCoProcessor);
-   // calculator->addCoProcessor(lcCoProcessor);
-    calculator->addCoProcessor(writeMQCoProcessor);
+    SPtr<Simulation> simulation(new Simulation(grid, lScheduler, endTime));
+    simulation->addSimulationObserver(nupsSimulationObserver);
+   // Simulation->addSimulationObserver(lcSimulationObserver);
+    simulation->addSimulationObserver(writeMQSimulationObserver);
 
     if (myid == 0) UBLOG(logINFO, "Simulation-start");
-    calculator->calculate();
+    simulation->run();
     if (myid == 0) UBLOG(logINFO, "Simulation-end");
 
 
diff --git a/apps/cpu/PoiseuilleFlow/pf1.cpp b/apps/cpu/PoiseuilleFlow/pf1.cpp
index 93680117551c13a23ecc08c5dc4731d92ec78b77..0e21dea4d252dc141fa5fd75feebe24c0b80042d 100644
--- a/apps/cpu/PoiseuilleFlow/pf1.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf1.cpp
@@ -68,24 +68,24 @@ void pf1()
    //boundary conditions definition 
    //boundary conditions adapters
    //////////////////////////////////////////////////////////////////////////////
-   SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-   noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+   SPtr<BC> noSlipBC(new NoSlipBC());
+   noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
 
    //boundary conditions visitor
    BoundaryConditionsBlockVisitor bcVisitor;
-   bcVisitor.addBC(noSlipBCAdapter);
+   bcVisitor.addBC(noSlipBC);
    //////////////////////////////////////////////////////////////////////////////////
 
    //set boundary conditions for blocks and create process decomposition for MPI
-   SPtr<D3Q27Interactor> cylinderInt(new D3Q27Interactor(cylinder, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID));
+   SPtr<D3Q27Interactor> cylinderInt(new D3Q27Interactor(cylinder, grid, noSlipBC, Interactor3D::INVERSESOLID));
    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, DIR_00M));
    InteractorsHelper intHelper(grid, metisVisitor);
    intHelper.addInteractor(cylinderInt);
    intHelper.selectBlocks();
 
    //write data for visualization of block grid
-   SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
-   ppblocks->process(0);
+   SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
+   ppblocks->update(0);
    //ppblocks.reset();
 
    unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -116,8 +116,8 @@ void pf1()
    //LBM kernel definition
    SPtr<LBMKernel> kernel;
    kernel = SPtr<LBMKernel>(new IncompressibleCumulantLBMKernel());
-   SPtr<BCProcessor> bcProc(new BCProcessor());
-   kernel->setBCProcessor(bcProc);
+   SPtr<BCSet> bcProc(new BCSet());
+   kernel->setBCSet(bcProc);
 
    //set forcing
    mu::Parser fctForcingX1;
@@ -143,18 +143,18 @@ void pf1()
    grid->accept(setConnsVisitor);
 
    SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-   //SPtr<MPIIORestartCoProcessor> restartCoProcessor(new MPIIORestartCoProcessor(grid, mSch, pathOut, comm));
-   //restartCoProcessor->setLBMKernel(kernel);
-   //restartCoProcessor->setBCProcessor(bcProc);
+   //SPtr<MPIIORestartSimulationObserver> restartSimulationObserver(new MPIIORestartSimulationObserver(grid, mSch, pathOut, comm));
+   //restartSimulationObserver->setLBMKernel(kernel);
+   //restartSimulationObserver->setBCSet(bcProc);
 
-   /*SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, pathOut + "/mig", comm));
-   migCoProcessor->setLBMKernel(kernel);
-   migCoProcessor->setBCProcessor(bcProc);*/
+   /*SPtr<MPIIOMigrationSimulationObserver> migSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, pathOut + "/mig", comm));
+   migSimulationObserver->setLBMKernel(kernel);
+   migSimulationObserver->setBCSet(bcProc);*/
 
-   //SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, pathOut + "/mig", comm));
-   //migCoProcessor->setLBMKernel(kernel);
-   //migCoProcessor->setBCProcessor(bcProc);
-   //migCoProcessor->setNu(nuLB);
+   //SPtr<MPIIOMigrationBESimulationObserver> migSimulationObserver(new MPIIOMigrationBESimulationObserver(grid, mSch, pathOut + "/mig", comm));
+   //migSimulationObserver->setLBMKernel(kernel);
+   //migSimulationObserver->setBCSet(bcProc);
+   //migSimulationObserver->setNu(nuLB);
 
    //SPtr<UtilConvertor> convertProcessor(new UtilConvertor(grid, pathOut, comm));
    //convertProcessor->convert(300, 4);
@@ -163,45 +163,45 @@ void pf1()
    //write data for visualization of boundary conditions
    {
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), /*SPtr<LBMUnitConverter>(new LBMUnitConverter()),*/ comm);
-      ppgeo.process(0);
+      WriteBoundaryConditionsSimulationObserver ppgeo(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), /*SPtr<LBMUnitConverter>(new LBMUnitConverter()),*/ comm);
+      ppgeo.update(0);
    }
    
    if (myid == 0) UBLOG(logINFO, "Preprocess - end");
 
    //grid=SPtr<Grid3D>(new Grid3D(comm));
-   //restartCoProcessor->restart(200);
-   //SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathOut + "/mig", comm));
-   //migCoProcessor->setLBMKernel(kernel);
-   //migCoProcessor->setBCProcessor(bcProc);
-   //migCoProcessor->setNu(nuLB);
-   //migCoProcessor->restart(10);
+   //restartSimulationObserver->restart(200);
+   //SPtr<MPIIOMigrationBESimulationObserver> migSimulationObserver(new MPIIOMigrationBESimulationObserver(grid, mSch, metisVisitor, pathOut + "/mig", comm));
+   //migSimulationObserver->setLBMKernel(kernel);
+   //migSimulationObserver->setBCSet(bcProc);
+   //migSimulationObserver->setNu(nuLB);
+   //migSimulationObserver->restart(10);
 
-   ppblocks->process(1);
+   ppblocks->update(1);
 
    //write data for visualization of macroscopic quantities
    SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-   SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathOut, 
+   SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathOut, 
       WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
    //performance control
    SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-   SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+   SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
    //start simulation 
    //omp_set_num_threads(numOfThreads);
    SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
-   SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-   calculator->addCoProcessor(npr);
-   calculator->addCoProcessor(writeMQCoProcessor);
-   //calculator->addCoProcessor(migCoProcessor);
-   //calculator->addCoProcessor(restartCoProcessor);
+   SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+   simulation->addSimulationObserver(npr);
+   simulation->addSimulationObserver(writeMQSimulationObserver);
+   //simulation->addSimulationObserver(migSimulationObserver);
+   //simulation->addSimulationObserver(restartSimulationObserver);
 
    if (myid == 0) UBLOG(logINFO, "Simulation-start");
-   calculator->calculate();
+   simulation->run();
    if (myid == 0) UBLOG(logINFO, "Simulation-end");
    
-   ppblocks->process(10);
+   ppblocks->update(10);
 }
 
 
diff --git a/apps/cpu/RisingBubble2D/CMakeLists.txt b/apps/cpu/RisingBubble2D/CMakeLists.txt
index 5741f1441d806d59a9efd1dd689e5ddba0e5eafc..9fd9204b54a8f794caeb5f42f69323af32b79fa4 100644
--- a/apps/cpu/RisingBubble2D/CMakeLists.txt
+++ b/apps/cpu/RisingBubble2D/CMakeLists.txt
@@ -1,3 +1,3 @@
 PROJECT(RisingBubble2D)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES RisingBubble2D.cpp )
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} MultiphaseFlow FILES RisingBubble2D.cpp )
diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
index 92495242f11659b3a90b30f4df836642dee5aea8..e1bfec97664f6f91e60bfbecd90604c7c62de678 100644
--- a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
+++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
@@ -169,19 +169,19 @@ void run(string configname)
         kernel->setContactAngle(theta);
         dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(1.0);
 
-        SPtr<BCProcessor> bcProc(new BCProcessor());
+        SPtr<BCSet> bcProc(new BCSet());
 
-        kernel->setBCProcessor(bcProc);
+        kernel->setBCSet(bcProc);
 
-        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
-        SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
-        slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseSlipBCAlgorithm()));
+        SPtr<BC> noSlipBC(new NoSlipBC());
+        noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
+        SPtr<BC> slipBC(new SlipBC());
+        slipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseSlipBCStrategy()));
         //////////////////////////////////////////////////////////////////////////////////
         // BC visitor
         MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-        bcVisitor.addBC(noSlipBCAdapter);
-        bcVisitor.addBC(slipBCAdapter);
+        bcVisitor.addBC(noSlipBC);
+        bcVisitor.addBC(slipBC);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
         grid->setDeltaX(dx);
@@ -196,15 +196,15 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        //SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        //SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         // rcp->setNu(nuLB);
        //  rcp->setNuLG(nuL, nuG);
         //rcp->setDensityRatio(densityRatio);
 
         rcp->setLBMKernel(kernel);
-        rcp->setBCProcessor(bcProc);
+        rcp->setBCSet(bcProc);
         //////////////////////////////////////////////////////////////////////////
 
         if (newStart) {
@@ -240,13 +240,13 @@ void run(string configname)
             GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - dx2, g_maxX2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
             GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
 
-            SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, slipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, slipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, slipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, slipBC, Interactor3D::SOLID));
 
-            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBC, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBC, Interactor3D::SOLID));
  
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
@@ -256,7 +256,7 @@ void run(string configname)
             intHelper.addInteractor(wallYmaxInt);
             intHelper.selectBlocks();
 
-            ppblocks->process(0);
+            ppblocks->update(0);
             ppblocks.reset();
 
             unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
@@ -329,9 +329,9 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-                ppgeo->process(0);
+                ppgeo->update(0);
                 ppgeo.reset();
             }
 
@@ -395,26 +395,26 @@ void run(string configname)
         //visSch->addSchedule(t,t,t); //t=9
 
 
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
         if(grid->getTimeStep() == 0) 
-            pp->process(0);
+            pp->update(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         //omp_set_num_threads(numOfThreads);
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(rcp);
+        SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+        simulation->addSimulationObserver(npr);
+        simulation->addSimulationObserver(pp);
+        simulation->addSimulationObserver(rcp);
 
 
         if (myid == 0)
             UBLOG(logINFO, "Simulation-start");
-        calculator->calculate();
+        simulation->run();
         if (myid == 0)
             UBLOG(logINFO, "Simulation-end");
             
diff --git a/apps/cpu/ViskomatXL/CMakeLists.txt b/apps/cpu/ViskomatXL/CMakeLists.txt
index 1b72b8765177c13a3f747b5f03e80f0ef5823ae1..6dcfeabc73259c72138c2c4ac84c017c6e96463a 100644
--- a/apps/cpu/ViskomatXL/CMakeLists.txt
+++ b/apps/cpu/ViskomatXL/CMakeLists.txt
@@ -3,4 +3,4 @@
 ########################################################
 PROJECT(viskomat)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES viskomat.cpp )
\ No newline at end of file
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} NonNewtonianFluids FILES viskomat.cpp )
\ No newline at end of file
diff --git a/apps/cpu/ViskomatXL/viskomat.cpp b/apps/cpu/ViskomatXL/viskomat.cpp
index be1f8bab3f99f5577e5a9ca0b426572a87c5a6af..d1a3cc3ee62ee76d19a80ccf0901836efce87460 100644
--- a/apps/cpu/ViskomatXL/viskomat.cpp
+++ b/apps/cpu/ViskomatXL/viskomat.cpp
@@ -106,14 +106,14 @@ void bflow(string configname)
       thix->setYieldStress(tau0LB);
       //thix->setOmegaMin(omegaMin);
 
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm()));
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyHerschelBulkleyModelNoSlipBCStrategy()));
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelNoSlipBCStrategy()));
 
-      SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
-      slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm()));
-      //slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SlipBCAlgorithm()));
+      SPtr<BC> slipBC(new SlipBC());
+      slipBC->setBCStrategy(SPtr<BCStrategy>(new SimpleSlipBCStrategy()));
+      //slipBC->setBCStrategy(SPtr<BCStrategy>(new SlipBCStrategy()));
 
       //// rotation around X-axis
       mu::Parser fctVy;
@@ -148,26 +148,26 @@ void bflow(string configname)
       //mu::Parser fctVy;
       //fctVy.SetExpr("0.0");
 
-      SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelVelocityBCAlgorithm()));
+      SPtr<BC> velocityBC(new VelocityBC(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+      velocityBC->setBCStrategy(SPtr<BCStrategy>(new SimpleVelocityBCStrategy()));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new VelocityWithDensityBCStrategy()));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelVelocityBCStrategy()));
 
-      //SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter());
-      //densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
-      ////densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
+      //SPtr<BC> densityBC(new DensityBC());
+      //densityBC->setBCStrategy(SPtr<BCStrategy>(new NonEqDensityBCStrategy()));
+      ////densityBC->setBCStrategy(SPtr<BCStrategy>(new NonReflectingOutflowBCStrategy()));
 
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      //bcVisitor.addBC(noSlipBCAdapter);
-      bcVisitor.addBC(slipBCAdapter);
-      bcVisitor.addBC(velocityBCAdapter);
-      //bcVisitor.addBC(densityBCAdapter);
+      //bcVisitor.addBC(noSlipBC);
+      bcVisitor.addBC(slipBC);
+      bcVisitor.addBC(velocityBC);
+      //bcVisitor.addBC(densityBC);
       
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
 
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BGKLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel());
@@ -177,7 +177,7 @@ void bflow(string configname)
       SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
-      kernel->setBCProcessor(bcProc);
+      kernel->setBCSet(bcProc);
       //kernel->setForcingX1(forcing);
       //kernel->setWithForcing(true);
 
@@ -198,11 +198,11 @@ void bflow(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
-      //SPtr<MPIIORestartCoProcessor> restartCoProcessor(new MPIIORestartCoProcessor(grid, mSch, outputPath, comm));
-      restartCoProcessor->setLBMKernel(kernel);
-      restartCoProcessor->setBCProcessor(bcProc);
-      //restartCoProcessor->setNu(k);
+      SPtr<MPIIOMigrationSimulationObserver> restartSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, outputPath, comm));
+      //SPtr<MPIIORestartSimulationObserver> restartSimulationObserver(new MPIIORestartSimulationObserver(grid, mSch, outputPath, comm));
+      restartSimulationObserver->setLBMKernel(kernel);
+      restartSimulationObserver->setBCSet(bcProc);
+      //restartSimulationObserver->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
       ////stator
@@ -222,7 +222,7 @@ void bflow(string configname)
       //// //                                         0.5 * (g_maxX3 - g_minX3) * 0.5));
 
       // SPtr<D3Q27Interactor> statorInt =
-      //    SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      //    SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBC, Interactor3D::SOLID));
       
       SPtr<GbTriFaceMesh3D> stator = make_shared<GbTriFaceMesh3D>();
       stator->readMeshFromSTLFileBinary(geoPath + "/" + geoFile, false);
@@ -231,7 +231,7 @@ void bflow(string configname)
       //stator->translate(4.0, -73.0, -6.0);
 
       SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27TriFaceMeshInteractor>(
-         new D3Q27TriFaceMeshInteractor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES));
+         new D3Q27TriFaceMeshInteractor(stator, grid, noSlipBC, Interactor3D::SOLID, Interactor3D::EDGES));
 
       GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance());
 
@@ -250,7 +250,7 @@ void bflow(string configname)
       GbSystem3D::writeGeoObject(rotor.get(), outputPath + "/geo/rotor", WbWriterVtkXmlBinary::getInstance());
 
       SPtr<D3Q27Interactor> rotorInt =
-          SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, velocityBCAdapter, Interactor3D::INVERSESOLID));
+          SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, velocityBC, Interactor3D::INVERSESOLID));
 
       //walls
       GbCuboid3DPtr wallXmin(new GbCuboid3D(g_minX1 - deltax, g_minX2 - deltax, g_minX3 - deltax, g_minX1,
@@ -262,8 +262,8 @@ void bflow(string configname)
       if (myid == 0) GbSystem3D::writeGeoObject(wallXmax.get(), outputPath + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance());
 
       //wall interactors
-      SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, slipBCAdapter, Interactor3D::SOLID));
-      SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, slipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, slipBC, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, slipBC, Interactor3D::SOLID));
 
       if (myid == 0)
       {
@@ -320,8 +320,8 @@ void bflow(string configname)
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-         ppblocks->process(0);
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         ppblocks->update(0);
 
          unsigned long nob = grid->getNumberOfBlocks();
          int gl = 3;
@@ -365,18 +365,18 @@ void bflow(string configname)
          grid->accept(initVisitor);
 
          SPtr<UbScheduler> geoSch(new UbScheduler(1));
-         WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
-         ppgeo.process(0);
+         WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
+         ppgeo.update(0);
 
          if (myid == 0) UBLOG(logINFO, "Preprozess - end");
       }
       else
       {
-         restartCoProcessor->restart((int)restartStep);
+         restartSimulationObserver->restart((int)restartStep);
          
-         //restartCoProcessor->readBlocks((int)restartStep);
-         //restartCoProcessor->readDataSet((int)restartStep);
-         ////restartCoProcessor->readBoundaryConds((int)restartStep);
+         //restartSimulationObserver->readBlocks((int)restartStep);
+         //restartSimulationObserver->readDataSet((int)restartStep);
+         ////restartSimulationObserver->readBoundaryConds((int)restartStep);
          //grid->setTimeStep((int)restartStep);
          
          SetBcBlocksBlockVisitor v2(wallXmaxInt);
@@ -395,9 +395,9 @@ void bflow(string configname)
          grid->accept(v1);
          wallXminInt->initInteractor();
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
                                                                WbWriterVtkXmlBinary::getInstance(), comm));
-         ppblocks->process(1);
+         ppblocks->update(1);
       }
       
       //omp_set_num_threads(numOfThreads);
@@ -414,33 +414,33 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-      //writeMQCoProcessor->process(100);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //writeMQSimulationObserver->update(100);
 
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueRotor.csv", comm);
       fp->addInteractor(rotorInt);
-      SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp2 = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueStator.csv", comm);
       fp2->addInteractor(statorInt);
 
-      //SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      //calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(fp2);
-      //calculator->addCoProcessor(writeMQCoProcessor);
-      //calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      calculator->addCoProcessor(restartCoProcessor);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+      simulation->addSimulationObserver(npr);
+      //simulation->addSimulationObserver(fp);
+      simulation->addSimulationObserver(fp2);
+      //simulation->addSimulationObserver(writeMQSimulationObserver);
+      //simulation->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      simulation->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) UBLOG(logINFO, "Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/rheometer/CMakeLists.txt b/apps/cpu/rheometer/CMakeLists.txt
index d8a534096569e7c70ad4db41e0bb72decfcc5a8c..58177bdd14a1c55985818bd70e336072c62f6dc5 100644
--- a/apps/cpu/rheometer/CMakeLists.txt
+++ b/apps/cpu/rheometer/CMakeLists.txt
@@ -3,4 +3,4 @@
 ########################################################
 PROJECT(rheometer)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES rheometer.cpp )
\ No newline at end of file
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} NonNewtonianFluids FILES rheometer.cpp )
\ No newline at end of file
diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp
index 224d170696b90eeea573969b0d17d34021944eac..173299b0edaccf10971cb596c67d81720bdb3264 100644
--- a/apps/cpu/rheometer/rheometer.cpp
+++ b/apps/cpu/rheometer/rheometer.cpp
@@ -141,13 +141,13 @@ void bflow(string configname)
       thix->setYieldStress(tau0);
       //thix->setOmegaMin(omegaMin);
 
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm()));
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
+      //noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyHerschelBulkleyModelNoSlipBCStrategy()));
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelNoSlipBCStrategy()));
 
-      //SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
-      //slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm()));
+      //SPtr<BC> slipBC(new SlipBC());
+      //slipBC->setBCStrategy(SPtr<BCStrategy>(new SimpleSlipBCStrategy()));
 
       mu::Parser fctVx;
       //fctVx.SetExpr("omega*(r-x2)");
@@ -180,26 +180,26 @@ void bflow(string configname)
       //mu::Parser fctVx;
       //fctVx.SetExpr("0.0");
 
-      SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
-      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelVelocityBCAlgorithm()));
+      SPtr<BC> velocityBC(new VelocityBC(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new SimpleVelocityBCStrategy()));
+      //velocityBC->setBCStrategy(SPtr<BCStrategy>(new VelocityWithDensityBCStrategy()));
+      velocityBC->setBCStrategy(SPtr<BCStrategy>(new RheologyBinghamModelVelocityBCStrategy()));
 
-      //SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter());
-      //densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
-      ////densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
+      //SPtr<BC> densityBC(new DensityBC());
+      //densityBC->setBCStrategy(SPtr<BCStrategy>(new NonEqDensityBCStrategy()));
+      ////densityBC->setBCStrategy(SPtr<BCStrategy>(new NonReflectingOutflowBCStrategy()));
 
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(noSlipBCAdapter);
-      //bcVisitor.addBC(slipBCAdapter);
-      bcVisitor.addBC(velocityBCAdapter);
-      //bcVisitor.addBC(densityBCAdapter);
+      bcVisitor.addBC(noSlipBC);
+      //bcVisitor.addBC(slipBC);
+      bcVisitor.addBC(velocityBC);
+      //bcVisitor.addBC(densityBC);
       
-      SPtr<BCProcessor> bcProc;
-      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      SPtr<BCSet> bcProc;
+      bcProc = SPtr<BCSet>(new BCSet());
 
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BGKLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new IncompressibleCumulantLBMKernel());
@@ -209,7 +209,7 @@ void bflow(string configname)
       SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
-      kernel->setBCProcessor(bcProc);
+      kernel->setBCSet(bcProc);
       //kernel->setForcingX1(forcing);
       //kernel->setWithForcing(true);
 
@@ -230,10 +230,10 @@ void bflow(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
-      restartCoProcessor->setLBMKernel(kernel);
-      restartCoProcessor->setBCProcessor(bcProc);
-      //restartCoProcessor->setNu(k);
+      SPtr<MPIIOMigrationSimulationObserver> restartSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, outputPath, comm));
+      restartSimulationObserver->setLBMKernel(kernel);
+      restartSimulationObserver->setBCSet(bcProc);
+      //restartSimulationObserver->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
       ////stator
@@ -246,7 +246,7 @@ void bflow(string configname)
       GbSystem3D::writeGeoObject(rotor.get(), outputPath + "/geo/rotor", WbWriterVtkXmlBinary::getInstance());
 
       SPtr<D3Q27Interactor> rotorInt =
-          SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, velocityBCAdapter, Interactor3D::INVERSESOLID));
+          SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, velocityBC, Interactor3D::INVERSESOLID));
 
       ////rotor (cylinder)
       SPtr<GbObject3D> stator(new GbCylinder3D(0.5 * g_maxX1, 0.5 * g_maxX2, g_minX3- 2.0 * deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3+ 2.0 * deltax, 0.25 * g_maxX1));
@@ -256,7 +256,7 @@ void bflow(string configname)
 
       GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance());
 
-      SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBC, Interactor3D::SOLID));
 
       if (myid == 0)
       {
@@ -310,8 +310,8 @@ void bflow(string configname)
          //if (myid == 0) GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
 
          ////wall interactors
-         //SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
-         //SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+         //SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBC, Interactor3D::SOLID));
+         //SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBC, Interactor3D::SOLID));
 
          ////////////////////////////////////////////
          //METIS
@@ -328,8 +328,8 @@ void bflow(string configname)
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-         ppblocks->process(0);
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         ppblocks->update(0);
 
          unsigned long nob = grid->getNumberOfBlocks();
          int gl = 3;
@@ -377,7 +377,7 @@ void bflow(string configname)
       }
       else
       {
-         restartCoProcessor->restart((int)restartStep);
+         restartSimulationObserver->restart((int)restartStep);
          grid->setTimeStep(restartStep);
          SetBcBlocksBlockVisitor v1(rotorInt);
          grid->accept(v1);
@@ -401,37 +401,37 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
-      ppgeo.process(0);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
+      ppgeo.update(0);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-      //writeMQCoProcessor->process(0);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //writeMQSimulationObserver->update(0);
 
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.txt", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueRotor.txt", comm);
       fp->addInteractor(rotorInt);
-      SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.txt", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp2 = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueStator.txt", comm);
       fp2->addInteractor(statorInt);
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(fp2);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      //calculator->addCoProcessor(restartCoProcessor);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endTime));
+      simulation->addSimulationObserver(npr);
+      simulation->addSimulationObserver(fp);
+      simulation->addSimulationObserver(fp2);
+      simulation->addSimulationObserver(writeMQSimulationObserver);
+      simulation->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      //simulation->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) UBLOG(logINFO, "Simulation-end");
    }
    catch (std::exception& e)
diff --git a/apps/cpu/sphere/sphere.cpp b/apps/cpu/sphere/sphere.cpp
index 70dcc0ddd189f3906575e92877800ec709199a78..8a5ef89b8bf09e765236153f37cb259e075bf15e 100644
--- a/apps/cpu/sphere/sphere.cpp
+++ b/apps/cpu/sphere/sphere.cpp
@@ -43,10 +43,10 @@ void run(string configname)
       real dp_LB = 1e-6;
 //      double rhoLBinflow = dp_LB*3.0;
 
-      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
-      SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
-      slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm()));
+      SPtr<BC> noSlipBC(new NoSlipBC());
+      noSlipBC->setBCStrategy(SPtr<BCStrategy>(new NoSlipBCStrategy()));
+      SPtr<BC> slipBC(new SlipBC());
+      slipBC->setBCStrategy(SPtr<BCStrategy>(new SimpleSlipBCStrategy()));
       
       real H = 50;
       mu::Parser fct;
@@ -56,18 +56,18 @@ void run(string configname)
       //fct.SetExpr("16*U*x2*x3*(H-x2)*(H-x3)/H^4");
       //fct.DefineConst("U", uLB);
       //fct.DefineConst("H", H);
-      SPtr<BCAdapter> velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-      //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-      velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
+      SPtr<BC> velBC(new VelocityBC(true, false, false, fct, 0, BCFunction::INFCONST));
+      //velBC->setBCStrategy(SPtr<BCStrategy>(new VelocityBCStrategy()));
+      velBC->setBCStrategy(SPtr<BCStrategy>(new SimpleVelocityBCStrategy()));
 
-      SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-      denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
+      SPtr<BC> denBC(new DensityBC(rhoLB));
+      denBC->setBCStrategy(SPtr<BCStrategy>(new NonEqDensityBCStrategy()));
 
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(noSlipBCAdapter);
-      bcVisitor.addBC(slipBCAdapter);
-      bcVisitor.addBC(velBCAdapter);
-      bcVisitor.addBC(denBCAdapter);
+      bcVisitor.addBC(noSlipBC);
+      bcVisitor.addBC(slipBC);
+      bcVisitor.addBC(velBC);
+      bcVisitor.addBC(denBC);
 
       real dx = 1;
 
@@ -94,7 +94,7 @@ void run(string configname)
       //SPtr<GbObject3D> sphere(new GbSphere3D(L1 * 0.5, L2 * 0.5, L3 * 0.5, radius));
       SPtr<GbObject3D> sphere(new GbSphere3D(75, 25, 25, radius));
       GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance());
-      SPtr<D3Q27Interactor> sphereInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> sphereInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(sphere, grid, noSlipBC, Interactor3D::SOLID));
 
       if (true)
       {
@@ -164,23 +164,23 @@ void run(string configname)
          GbCuboid3DPtr geoOutflow(new GbCuboid3D(d_maxX1, d_minX2 - 4.0*blockLength, d_minX3 - 4.0*blockLength, d_maxX1 + 4.0*blockLength, d_maxX2 + 4.0*blockLength, d_maxX3 + 4.0*blockLength));
          if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), outputPath + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
 
          //walls
-         SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, slipBCAdapter, Interactor3D::SOLID));
-         SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, slipBCAdapter, Interactor3D::SOLID));
-         SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, slipBCAdapter, Interactor3D::SOLID));
-         SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, slipBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, slipBC, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, slipBC, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, slipBC, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, slipBC, Interactor3D::SOLID));
 
          //inflow
-         SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBC, Interactor3D::SOLID));
 
-         //D3Q27BoundaryConditionAdapterPtr denBCAdapterInflow(new D3Q27DensityBCAdapter(rhoLBinflow));
-         //denBCAdapterInflow->setSecondaryBcOption(0);
-         //SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, denBCAdapterInflow, Interactor3D::SOLID));
+         //D3Q27BoundaryConditionAdapterPtr denBCInflow(new D3Q27DensityBC(rhoLBinflow));
+         //denBCInflow->setSecondaryBcOption(0);
+         //SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, denBCInflow, Interactor3D::SOLID));
 
          //outflow
-         SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBC, Interactor3D::SOLID));
 
          SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, DIR_00M));
          InteractorsHelper intHelper(grid, metisVisitor);
@@ -197,7 +197,7 @@ void run(string configname)
          //PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads);
          //grid->accept(pqPartVisitor);
 
-         ppblocks->process(0);
+         ppblocks->update(0);
          ppblocks.reset();
 
          unsigned long nob = grid->getNumberOfBlocks();
@@ -219,10 +219,10 @@ void run(string configname)
          SPtr<LBMKernel> kernel(new IncompressibleCumulantLBMKernel());
          //SPtr<LBMKernel> kernel(new CompressibleCumulantLBMKernel());
 
-         SPtr<BCProcessor> bcProcessor(new BCProcessor());
+         SPtr<BCSet> bcSet(new BCSet());
 
 
-         kernel->setBCProcessor(bcProcessor);
+         kernel->setBCSet(bcSet);
 
          SetKernelBlockVisitor kernelVisitor(kernel, nuLB, availMem, needMem);
          grid->accept(kernelVisitor);
@@ -251,9 +251,9 @@ void run(string configname)
 
          //Postrozess
          SPtr<UbScheduler> geoSch(new UbScheduler(1));
-         SPtr<CoProcessor> ppgeo(
-            new WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
-         ppgeo->process(0);
+         SPtr<SimulationObserver> ppgeo(
+            new WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         ppgeo->update(0);
          ppgeo.reset();
 
          if (myid == 0) UBLOG(logINFO, "Preprozess - end");
@@ -282,25 +282,25 @@ void run(string configname)
 
       SPtr<UbScheduler> stepSch(new UbScheduler(outstep));
       //stepSch->addSchedule(10000, 0, 1000000);
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, outputPath, WbWriterVtkXmlBinary::getInstance(), conv,comm));
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, stepSch, outputPath, WbWriterVtkXmlBinary::getInstance(), conv,comm));
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       real area = UbMath::PI * radius * radius;
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, uLB, area);
+      SPtr<CalculateForcesSimulationObserver> fp = make_shared<CalculateForcesSimulationObserver>(grid, forceSch, outputPath + "/forces/forces.txt", comm, uLB, area);
       fp->addInteractor(sphereInt);
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
-      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endstep));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(writeMQCoProcessor);
+      SPtr<Simulation> simulation(new Simulation(grid, stepGhostLayer, endstep));
+      simulation->addSimulationObserver(npr);
+      simulation->addSimulationObserver(fp);
+      simulation->addSimulationObserver(writeMQSimulationObserver);
 
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculator->calculate();
+      simulation->run();
       if (myid == 0) UBLOG(logINFO, "Simulation-end");
 
    }
diff --git a/cpu.cmake b/cpu.cmake
index 13f216203bfeefb9c550b8be470af4cf181a44b4..4898ab83d1fb48d0a30a9a10759a6279f0a105eb 100644
--- a/cpu.cmake
+++ b/cpu.cmake
@@ -22,14 +22,16 @@
 #SET(CMAKE_BUILD_TYPE DEBUG)
 #ENDIF()
 
-SET(USE_METIS ON CACHE BOOL "include METIS library support")
-SET(USE_VTK OFF CACHE BOOL "include VTK library support")
-SET(USE_CATALYST OFF CACHE BOOL "include Paraview Catalyst support")
+SET(VFCPU_USE_METIS ON CACHE BOOL "include METIS library support")
+SET(VFCPU_USE_VTK OFF CACHE BOOL "include VTK library support")
+SET(VFCPU_USE_CATALYST OFF CACHE BOOL "include Paraview Catalyst support")
 
-SET(USE_HLRN_LUSTRE OFF CACHE BOOL "include HLRN Lustre support")
-SET(USE_DEM_COUPLING OFF CACHE BOOL "PE plugin")
+SET(VFCPU_USE_HLRN_LUSTRE OFF CACHE BOOL "include HLRN Lustre support")
+SET(VFCPU_USE_DEM_COUPLING OFF CACHE BOOL "PE plugin")
 
-SET(USE_LIGGGHTS OFF CACHE BOOL "include LIGGGHTS library support")
+SET(VFCPU_ENABLE_LiggghtsCoupling OFF CACHE BOOL "enable coupling with LIGGGHTS library")
+SET(VFCPU_ENABLE_NonNewtonianFluids OFF CACHE BOOL "enable non-Newtonian fluids module")
+SET(VFCPU_ENABLE_MultiphaseFlow OFF CACHE BOOL "enable multiphase flow module")
 
 #MPI
 IF((NOT ${CMAKE_CXX_COMPILER} MATCHES mpicxx) AND (NOT ${CMAKE_CXX_COMPILER} MATCHES mpiicpc))# OR NOT ${CMAKE_CXX_COMPILER} MATCHES cc OR NOT ${CMAKE_CXX_COMPILER} MATCHES mpiCC)
@@ -37,32 +39,38 @@ IF((NOT ${CMAKE_CXX_COMPILER} MATCHES mpicxx) AND (NOT ${CMAKE_CXX_COMPILER} MAT
 ENDIF()
 #SET(MPI_CXX_LINK_FLAGS -mpe=mpilog)
 
+if(VFCPU_ENABLE_LiggghtsCoupling)
+    add_subdirectory(src/cpu/LiggghtsCoupling)
+    SET(VFCPU_USE_VTK ON CACHE BOOL "include VTK library support" FORCE)
+endif()
+
+
 #VTK
-IF(${USE_VTK})
+IF(${VFCPU_USE_VTK})
     FIND_PACKAGE(VTK REQUIRED)
     INCLUDE_DIRECTORIES(${VTK_INCLUDE_DIRS})
 ENDIF()
 
-IF(${USE_CATALYST})
+IF(${VFCPU_USE_CATALYST})
     find_package(ParaView 4.3 REQUIRED COMPONENTS vtkPVPythonCatalyst)
     include("${PARAVIEW_USE_FILE}")
 ENDIF()
 
-IF(${USE_METIS})
+IF(${VFCPU_USE_METIS})
     list(APPEND VF_COMPILER_DEFINITION VF_METIS)
 ENDIF()
-IF(${USE_VTK})
+IF(${VFCPU_USE_VTK})
     list(APPEND VF_COMPILER_DEFINITION VF_VTK)
 ENDIF()
-IF(${USE_CATALYST})
+IF(${VFCPU_USE_CATALYST})
     list(APPEND VF_COMPILER_DEFINITION VF_CATALYST)
 ENDIF()
 
-IF(${USE_BOOST})
+IF(${VFCPU_USE_BOOST})
     list(APPEND VF_COMPILER_DEFINITION VF_BOOST)
 ENDIF()
 
-IF(${USE_HLRN_LUSTRE})
+IF(${VFCPU_USE_HLRN_LUSTRE})
     list(APPEND VF_COMPILER_DEFINITION HLRN_LUSTRE)
 ENDIF()
 
@@ -71,12 +79,10 @@ IF(${CMAKE_SYSTEM_PROCESSOR} MATCHES "ia64")
     LIST(APPEND VF_COMPILER_DEFINITION _M_IA64)
 ENDIF()
 
-if(${USE_METIS} AND NOT METIS_INCLUDEDIR)
+if(${VFCPU_USE_METIS} AND NOT METIS_INCLUDEDIR)
     add_subdirectory(${VF_THIRD_DIR}/metis/metis-5.1.0)
 endif()
 
-
-
 add_subdirectory(${VF_THIRD_DIR}/MuParser)
 
 add_subdirectory(src/cpu/VirtualFluidsCore)
@@ -85,8 +91,12 @@ if(BUILD_VF_PYTHON_BINDINGS)
     add_subdirectory(src/cpu/simulationconfig)
 endif()
 
-if(USE_LIGGGHTS)
-    add_subdirectory(src/cpu/LiggghtsCoupling)
+if(VFCPU_ENABLE_NonNewtonianFluids)
+    add_subdirectory(src/cpu/NonNewtonianFluids)
+endif()
+
+if(VFCPU_ENABLE_MultiphaseFlow)
+    add_subdirectory(src/cpu/MultiphaseFlow)
 endif()
 
 set (APPS_ROOT_CPU "${VF_ROOT_DIR}/apps/cpu/")
diff --git a/src/basics/geometry3d/CoordinateTransformation3D.h b/src/basics/geometry3d/CoordinateTransformation3D.h
index a0f88c1f6b22bfe0655736802c423a00ee2357e2..d5560e84c6c18b1878d236b06dff688bcc709451 100644
--- a/src/basics/geometry3d/CoordinateTransformation3D.h
+++ b/src/basics/geometry3d/CoordinateTransformation3D.h
@@ -137,10 +137,10 @@ private:
     bool active;
     bool transformation;
 
-    friend class MPIIOCoProcessor;
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
-    friend class MPIIOMigrationBECoProcessor;
+    friend class MPIIOSimulationObserver;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
+    friend class MPIIOMigrationBESimulationObserver;
     friend class CheckpointConverter;
 };
 
diff --git a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp
index 2dc4ab61c602e37ff8edd6397306dad036655e8c..838cd086adf298f53776ae5dc50e3e0e8279a7c7 100644
--- a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp
+++ b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp
@@ -84,7 +84,7 @@ SPtr<LBMKernel> IBcumulantK17LBMKernel::clone()
     kernel->setNX(nx);
     std::dynamic_pointer_cast<IBcumulantK17LBMKernel>(kernel)->initDataSet();
     kernel->setCollisionFactor(this->collFactor);
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -138,7 +138,7 @@ void IBcumulantK17LBMKernel::calculate(int step)
     nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
     restDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
diff --git a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h
index 6b19ada8dbc7bd07239c4086f4ab666f1031f28d..c13233ba733762fce9122f24b354cf10feef1c9a 100644
--- a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h
+++ b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h
@@ -35,7 +35,7 @@
 #define IBcumulantK17LBMKernel_h__
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "UbTiming.h"
 #include "CbArray4D.h"
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.cpp
similarity index 90%
rename from src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp
rename to src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.cpp
index bf923b2a216df1c6b82c9538daf4f33a65b24fd6..a3332aed105cb4371f1e2c19c79d7181b09df952 100644
--- a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.cpp
@@ -1,7 +1,7 @@
-#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingSimulationObserver.h"
 #include "GbSphere3D.h"
 #include "mpi/MPICommunicator.h"
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LiggghtsCouplingWrapper.h"
 #include "Grid3D.h"
 #include "Block3D.h"
@@ -12,23 +12,23 @@
 #include "LBMUnitConverter.h"
 #include "fix_lb_coupling_onetoone.h"
 
-LiggghtsCouplingCoProcessor::LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+LiggghtsCouplingSimulationObserver::LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                          SPtr<vf::mpi::Communicator> comm,
                                                          LiggghtsCouplingWrapper &wrapper, int demSteps,
                                                          SPtr<LBMUnitConverter> units)
-    : CoProcessor(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units)
+    : SimulationObserver(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units)
 {
 
 }
 
-LiggghtsCouplingCoProcessor::~LiggghtsCouplingCoProcessor()
+LiggghtsCouplingSimulationObserver::~LiggghtsCouplingSimulationObserver()
 {
 }
 
-void LiggghtsCouplingCoProcessor::process(double actualTimeStep)
+void LiggghtsCouplingSimulationObserver::update(double actualTimeStep)
 { 
     if (comm->getProcessID() == 0)
-        std::cout << "LiggghtsCouplingCoProcessor step: " << actualTimeStep << "\n";
+        std::cout << "LiggghtsCouplingSimulationObserver step: " << actualTimeStep << "\n";
     
     //comm->barrier();
 
@@ -45,7 +45,7 @@ void LiggghtsCouplingCoProcessor::process(double actualTimeStep)
     //comm->barrier();
 }
 
-void LiggghtsCouplingCoProcessor::setSpheresOnLattice()
+void LiggghtsCouplingSimulationObserver::setSpheresOnLattice()
 {
     std::vector<int> excludeType;
 
@@ -88,7 +88,7 @@ void LiggghtsCouplingCoProcessor::setSpheresOnLattice()
     }
 }
 
-void LiggghtsCouplingCoProcessor::setSingleSphere3D(double *x, double *v, double *omega, /* double *com,*/ double r,
+void LiggghtsCouplingSimulationObserver::setSingleSphere3D(double *x, double *v, double *omega, /* double *com,*/ double r,
                                                     int id /*, bool initVelFlag*/)
 {
     int level = 0;
@@ -172,7 +172,7 @@ void LiggghtsCouplingCoProcessor::setSingleSphere3D(double *x, double *v, double
 
 }
 
-double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double const dy_, double const dz_,
+double LiggghtsCouplingSimulationObserver::calcSolidFraction(double const dx_, double const dy_, double const dz_,
                                                       double const r_)
 {
     static int const slicesPerDim = 5;
@@ -219,7 +219,7 @@ double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double c
     return fraction * ((double)n);
 }
 
-  void LiggghtsCouplingCoProcessor::setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega)
+  void LiggghtsCouplingSimulationObserver::setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega)
 {
     p.uPart[0] = v[0];
     p.uPart[1] = v[1];
@@ -235,7 +235,7 @@ double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double c
 }
 
 
-void LiggghtsCouplingCoProcessor::setToZero(IBdynamicsParticleData &p)
+void LiggghtsCouplingSimulationObserver::setToZero(IBdynamicsParticleData &p)
 {
     p.uPart[0]      = 0;
     p.uPart[1]      = 0;
@@ -244,7 +244,7 @@ void LiggghtsCouplingCoProcessor::setToZero(IBdynamicsParticleData &p)
     p.partId        = 0;
 }
 
-void LiggghtsCouplingCoProcessor::getForcesFromLattice()
+void LiggghtsCouplingSimulationObserver::getForcesFromLattice()
 {
     static std::vector<double> force, torque;
     static typename ParticleData::ParticleDataArrayVector x_lb;
@@ -319,7 +319,7 @@ void LiggghtsCouplingCoProcessor::getForcesFromLattice()
     couplingFix->comm_force_torque();
 }
 
-void LiggghtsCouplingCoProcessor::SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque)
+void LiggghtsCouplingSimulationObserver::SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque)
 {
     int nx = grid->getNX1(), ny = grid->getNX2(), nz = grid->getNX3();
 
@@ -402,12 +402,12 @@ void LiggghtsCouplingCoProcessor::SumForceTorque3D(ParticleData::ParticleDataArr
     }
  }
 
-void LiggghtsCouplingCoProcessor::addForce(int const partId, int const coord, double const value, double *force)
+void LiggghtsCouplingSimulationObserver::addForce(int const partId, int const coord, double const value, double *force)
 {
     force[3 * partId + coord] += value;
 }
 
-void LiggghtsCouplingCoProcessor::addTorque(int const partId, int const coord, double const value, double *torque)
+void LiggghtsCouplingSimulationObserver::addTorque(int const partId, int const coord, double const value, double *torque)
 {
     torque[3 * partId + coord] += value;
 }
\ No newline at end of file
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.h
similarity index 88%
rename from src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h
rename to src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.h
index 3e87c89d2b92e2d34465cc41ddeab98eee85c5ed..0ae1786dd72346456621f3f4cf584679fca64f42 100644
--- a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.h
@@ -26,15 +26,15 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file LiggghtsCouplingCoProcessor.h
+//! \file LiggghtsCouplingSimulationObserver.h
 //! \ingroup LiggghtsCoupling
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef LiggghtsCouplingCoProcessor_h
-#define LiggghtsCouplingCoProcessor_h
+#ifndef LiggghtsCouplingSimulationObserver_h
+#define LiggghtsCouplingSimulationObserver_h
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 #include "lammps.h"
 #include "input.h"
@@ -45,7 +45,7 @@
 #include <vector>
 
 
-class CoProcessor;
+class SimulationObserver;
 namespace vf::mpi {class Communicator;}
 class LiggghtsCouplingWrapper;
 class Grid3D;
@@ -58,14 +58,14 @@ struct ParticleData {
     typedef typename std::vector<double> ParticleDataScalarVector;
 };
 
-class LiggghtsCouplingCoProcessor : public CoProcessor
+class LiggghtsCouplingSimulationObserver : public SimulationObserver
 {
 public:
-    LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm,
+    LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm,
                                 LiggghtsCouplingWrapper &wrapper, int demSteps, SPtr<LBMUnitConverter> units);
-    virtual ~LiggghtsCouplingCoProcessor();
+    virtual ~LiggghtsCouplingSimulationObserver();
 
-    void process(double actualTimeStep) override;
+    void update(double actualTimeStep) override;
 
     
 protected:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
index 73e399fb6ab3df0ea06620da4b5c0f6fedc8428e..d438f80f53fcefd553813b0c9517e0fe545af96f 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
@@ -26,43 +26,43 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseNoSlipBCAlgorithm.cpp
+//! \file MultiphaseNoSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#include "MultiphaseNoSlipBCAlgorithm.h"
+#include "MultiphaseNoSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-MultiphaseNoSlipBCAlgorithm::MultiphaseNoSlipBCAlgorithm()
+MultiphaseNoSlipBCStrategy::MultiphaseNoSlipBCStrategy()
 {
-   BCAlgorithm::type = BCAlgorithm::MultiphaseNoSlipBCAlgorithm;
-   BCAlgorithm::preCollision = false;
+   BCStrategy::type = BCStrategy::MultiphaseNoSlipBCStrategy;
+   BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-MultiphaseNoSlipBCAlgorithm::~MultiphaseNoSlipBCAlgorithm()
+MultiphaseNoSlipBCStrategy::~MultiphaseNoSlipBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> MultiphaseNoSlipBCAlgorithm::clone()
+SPtr<BCStrategy> MultiphaseNoSlipBCStrategy::clone()
 {
-   SPtr<BCAlgorithm> bc(new MultiphaseNoSlipBCAlgorithm());
+   SPtr<BCStrategy> bc(new MultiphaseNoSlipBCStrategy());
    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void MultiphaseNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNoSlipBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
+void MultiphaseNoSlipBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
 {
 	this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNoSlipBCAlgorithm::applyBC()
+void MultiphaseNoSlipBCStrategy::applyBC()
 {
    real f[D3Q27System::ENDF+1];
    real h[D3Q27System::ENDF+1];
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
similarity index 86%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.h
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
index dc6e5bc6a558b18e2b70bfea8ab1ed4bf1853a82..390c2952e43398e7437ea61d1bc11890d454b9bc 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseNoSlipBCAlgorithm.h
+//! \file MultiphaseNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#ifndef MultiphaseNoSlipBCAlgorithm_h__
-#define MultiphaseNoSlipBCAlgorithm_h__
+#ifndef MultiphaseNoSlipBCStrategy_h__
+#define MultiphaseNoSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
 //! A class implements no-slip boundary condition for multiphase simulations
-class MultiphaseNoSlipBCAlgorithm : public BCAlgorithm
+class MultiphaseNoSlipBCStrategy : public BCStrategy
 {
 public:
-   MultiphaseNoSlipBCAlgorithm();
-   virtual ~MultiphaseNoSlipBCAlgorithm();
-   SPtr<BCAlgorithm> clone() override;
+   MultiphaseNoSlipBCStrategy();
+   virtual ~MultiphaseNoSlipBCStrategy();
+   SPtr<BCStrategy> clone() override;
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void addDistributionsH(SPtr<DistributionArray3D> distributionsH) override;
    void applyBC() override;
 };
-#endif // MultiphaseNoSlipBCAlgorithm_h__
+#endif // MultiphaseNoSlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
similarity index 80%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
index 0a334b37c6096a285ea7dd25b56790de0222098e..58faec07f46d9b6d708ce83dfc823838bcfcc4df 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
@@ -26,48 +26,48 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseNonReflectingOutflowBCAlgorithm.cpp
+//! \file MultiphaseNonReflectingOutflowBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#include "MultiphaseNonReflectingOutflowBCAlgorithm.h"
+#include "MultiphaseNonReflectingOutflowBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
 
-MultiphaseNonReflectingOutflowBCAlgorithm::MultiphaseNonReflectingOutflowBCAlgorithm()
+MultiphaseNonReflectingOutflowBCStrategy::MultiphaseNonReflectingOutflowBCStrategy()
 {
-    BCAlgorithm::type = BCAlgorithm::NonReflectingOutflowBCAlgorithm;
-    BCAlgorithm::preCollision = true;
+    BCStrategy::type = BCStrategy::NonReflectingOutflowBCStrategy;
+    BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
-MultiphaseNonReflectingOutflowBCAlgorithm::~MultiphaseNonReflectingOutflowBCAlgorithm()
+MultiphaseNonReflectingOutflowBCStrategy::~MultiphaseNonReflectingOutflowBCStrategy()
 {
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> MultiphaseNonReflectingOutflowBCAlgorithm::clone()
+SPtr<BCStrategy> MultiphaseNonReflectingOutflowBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new MultiphaseNonReflectingOutflowBCAlgorithm());
+    SPtr<BCStrategy> bc(new MultiphaseNonReflectingOutflowBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void MultiphaseNonReflectingOutflowBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
+void MultiphaseNonReflectingOutflowBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
 {
     this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH2)
+void MultiphaseNonReflectingOutflowBCStrategy::addDistributionsH2(SPtr<DistributionArray3D> distributionsH2)
 {
     this->distributionsH2 = distributionsH2;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
+void MultiphaseNonReflectingOutflowBCStrategy::applyBC()
 {
     using namespace D3Q27System;
 //    using namespace UbMath;
@@ -123,15 +123,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
 
     switch (direction) {
         case DIR_P00:
-            f[DIR_P00] = ftemp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_P00];
-            f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_PP0];
-            f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_PM0];
-            f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_P0P];
-            f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_P0M];
-            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_PPP];
-            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_PMP];
-            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_PPM];
-            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[DIR_PMM];
+            f[DIR_P00] = ftemp[DIR_P00] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P00];
+            f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PP0];
+            f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PM0];
+            f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P0P];
+            f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P0M];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PPP];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PMP];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PPM];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PMM];
 
             distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
             distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -143,15 +143,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
             distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
 
-            h[DIR_P00] = htemp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_P00];
-            h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_PP0];
-            h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_PM0];
-            h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_P0P];
-            h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_P0M];
-            h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_PPP];
-            h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_PMP];
-            h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_PPM];
-            h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[DIR_PMM];
+            h[DIR_P00] = htemp[DIR_P00] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_P00];
+            h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PP0];
+            h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PM0];
+            h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_P0P];
+            h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_P0M];
+            h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PPP];
+            h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PMP];
+            h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PPM];
+            h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PMM];
 
             distributionsH->setDistributionInvForDirection(h[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
             distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -163,15 +163,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
             distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
 
-            h2[DIR_P00] = c1o2 * (h2temp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P00]);
-            h2[DIR_PP0] = c1o2 * (h2temp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PP0]);
-            h2[DIR_PM0] = c1o2 * (h2temp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PM0]);
-            h2[DIR_P0P] = c1o2 * (h2temp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P0P]);
-            h2[DIR_P0M] = c1o2 * (h2temp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P0M]);
-            h2[DIR_PPP] = c1o2 * (h2temp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PPP]);
-            h2[DIR_PMP] = c1o2 * (h2temp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PMP]);
-            h2[DIR_PPM] = c1o2 * (h2temp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PPM]);
-            h2[DIR_PMM] = c1o2 * (h2temp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PMM]);
+            h2[DIR_P00] = c1o2 * (h2temp[DIR_P00] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_P00]);
+            h2[DIR_PP0] = c1o2 * (h2temp[DIR_PP0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_PP0]);
+            h2[DIR_PM0] = c1o2 * (h2temp[DIR_PM0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_PM0]);
+            h2[DIR_P0P] = c1o2 * (h2temp[DIR_P0P] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_P0P]);
+            h2[DIR_P0M] = c1o2 * (h2temp[DIR_P0M] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_P0M]);
+            h2[DIR_PPP] = c1o2 * (h2temp[DIR_PPP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_PPP]);
+            h2[DIR_PMP] = c1o2 * (h2temp[DIR_PMP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_PMP]);
+            h2[DIR_PPM] = c1o2 * (h2temp[DIR_PPM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_PPM]);
+            h2[DIR_PMM] = c1o2 * (h2temp[DIR_PMM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h2[DIR_PMM]);
 
             distributionsH2->setDistributionInvForDirection(h2[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
             distributionsH2->setDistributionInvForDirection(h2[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -185,15 +185,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
 
             break;
         case DIR_M00:
-            f[DIR_M00] = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M00];
-            f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MP0];
-            f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MM0];
-            f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0P];
-            f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0M];
-            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPP];
-            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMP];
-            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPM];
-            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMM];
+            f[DIR_M00] = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M00];
+            f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MP0];
+            f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MM0];
+            f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M0P];
+            f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M0M];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MPP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MMP];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MPM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MMM];
 
             distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
             distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
@@ -205,15 +205,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
             distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
-            h[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M00];
-            h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MP0];
-            h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MM0];
-            h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0P];
-            h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0M];
-            h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPP];
-            h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMP];
-            h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPM];
-            h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMM];
+            h[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_M00];
+            h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MP0];
+            h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MM0];
+            h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_M0P];
+            h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_M0M];
+            h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MPP];
+            h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MMP];
+            h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MPM];
+            h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MMM];
 
             distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
             distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
@@ -225,15 +225,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
             distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
-            h2[DIR_M00] = c1o2 * (htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M00]);
-            h2[DIR_MP0] = c1o2 * (htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MP0]);
-            h2[DIR_MM0] = c1o2 * (htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MM0]);
-            h2[DIR_M0P] = c1o2 * (htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0P]);
-            h2[DIR_M0M] = c1o2 * (htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0M]);
-            h2[DIR_MPP] = c1o2 * (htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPP]);
-            h2[DIR_MMP] = c1o2 * (htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMP]);
-            h2[DIR_MPM] = c1o2 * (htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPM]);
-            h2[DIR_MMM] = c1o2 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMM]);
+            h2[DIR_M00] = c1o2 * (htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_M00]);
+            h2[DIR_MP0] = c1o2 * (htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_MP0]);
+            h2[DIR_MM0] = c1o2 * (htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_MM0]);
+            h2[DIR_M0P] = c1o2 * (htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_M0P]);
+            h2[DIR_M0M] = c1o2 * (htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_M0M]);
+            h2[DIR_MPP] = c1o2 * (htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_MPP]);
+            h2[DIR_MMP] = c1o2 * (htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_MMP]);
+            h2[DIR_MPM] = c1o2 * (htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_MPM]);
+            h2[DIR_MMM] = c1o2 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h2[DIR_MMM]);
 
             distributionsH2->setDistributionInvForDirection(h2[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
             distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
@@ -246,15 +246,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
             break;
         case DIR_0P0:
-            f[DIR_0P0] = ftemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_0P0];
-            f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_PP0];
-            f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_MP0];
-            f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_0PP];
-            f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_0PM];
-            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_PPP];
-            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_MPP];
-            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_PPM];
-            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[DIR_MPM];
+            f[DIR_0P0] = ftemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0P0];
+            f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PP0];
+            f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MP0];
+            f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0PP];
+            f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0PM];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PPP];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MPP];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PPM];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MPM];
 
             distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
             distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -266,15 +266,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
             distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
 
-            h[DIR_0P0] = htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_0P0];
-            h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_PP0];
-            h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_MP0];
-            h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_0PP];
-            h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_0PM];
-            h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_PPP];
-            h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_MPP];
-            h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_PPM];
-            h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[DIR_MPM];
+            h[DIR_0P0] = htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_0P0];
+            h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_PP0];
+            h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_MP0];
+            h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_0PP];
+            h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_0PM];
+            h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_PPP];
+            h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_MPP];
+            h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_PPM];
+            h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_MPM];
 
             distributionsH->setDistributionInvForDirection(h[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
             distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -286,15 +286,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
             distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
 
-            h2[DIR_0P0] = c1o2 * (htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0P0]);
-            h2[DIR_PP0] = c1o2 * (htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PP0]);
-            h2[DIR_MP0] = c1o2 * (htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MP0]);
-            h2[DIR_0PP] = c1o2 * (htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0PP]);
-            h2[DIR_0PM] = c1o2 * (htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0PM]);
-            h2[DIR_PPP] = c1o2 * (htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PPP]);
-            h2[DIR_MPP] = c1o2 * (htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MPP]);
-            h2[DIR_PPM] = c1o2 * (htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PPM]);
-            h2[DIR_MPM] = c1o2 * (htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MPM]);
+            h2[DIR_0P0] = c1o2 * (htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_0P0]);
+            h2[DIR_PP0] = c1o2 * (htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_PP0]);
+            h2[DIR_MP0] = c1o2 * (htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_MP0]);
+            h2[DIR_0PP] = c1o2 * (htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_0PP]);
+            h2[DIR_0PM] = c1o2 * (htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_0PM]);
+            h2[DIR_PPP] = c1o2 * (htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_PPP]);
+            h2[DIR_MPP] = c1o2 * (htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_MPP]);
+            h2[DIR_PPM] = c1o2 * (htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_PPM]);
+            h2[DIR_MPM] = c1o2 * (htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h2[DIR_MPM]);
 
             distributionsH2->setDistributionInvForDirection(h2[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
             distributionsH2->setDistributionInvForDirection(h2[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -308,15 +308,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
 
             break;
         case DIR_0M0:
-            f[DIR_0M0] = ftemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_0M0];
-            f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_PM0];
-            f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_MM0];
-            f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_0MP];
-            f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_0MM];
-            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_PMP];
-            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_MMP];
-            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_PMM];
-            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[DIR_MMM];
+            f[DIR_0M0] = ftemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0M0];
+            f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PM0];
+            f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MM0];
+            f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0MP];
+            f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0MM];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PMP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MMP];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PMM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MMM];
 
             distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
             distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
@@ -328,15 +328,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
             distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
-            h[DIR_0M0] = htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_0M0];
-            h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_PM0];
-            h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_MM0];
-            h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_0MP];
-            h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_0MM];
-            h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_PMP];
-            h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_MMP];
-            h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_PMM];
-            h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[DIR_MMM];
+            h[DIR_0M0] = htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_0M0];
+            h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_PM0];
+            h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_MM0];
+            h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_0MP];
+            h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_0MM];
+            h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_PMP];
+            h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_MMP];
+            h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_PMM];
+            h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_MMM];
 
             distributionsH->setDistributionInvForDirection(h[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
             distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
@@ -348,15 +348,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
             distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
-            h2[DIR_0M0] = c1o2 * (htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0M0]);
-            h2[DIR_PM0] = c1o2 * (htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PM0]);
-            h2[DIR_MM0] = c1o2 * (htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MM0]);
-            h2[DIR_0MP] = c1o2 * (htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0MP]);
-            h2[DIR_0MM] = c1o2 * (htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0MM]);
-            h2[DIR_PMP] = c1o2 * (htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PMP]);
-            h2[DIR_MMP] = c1o2 * (htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MMP]);
-            h2[DIR_PMM] = c1o2 * (htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PMM]);
-            h2[DIR_MMM] = c1o2 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MMM]);
+            h2[DIR_0M0] = c1o2 * (htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_0M0]);
+            h2[DIR_PM0] = c1o2 * (htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_PM0]);
+            h2[DIR_MM0] = c1o2 * (htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_MM0]);
+            h2[DIR_0MP] = c1o2 * (htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_0MP]);
+            h2[DIR_0MM] = c1o2 * (htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_0MM]);
+            h2[DIR_PMP] = c1o2 * (htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_PMP]);
+            h2[DIR_MMP] = c1o2 * (htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_MMP]);
+            h2[DIR_PMM] = c1o2 * (htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_PMM]);
+            h2[DIR_MMM] = c1o2 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h2[DIR_MMM]);
 
             distributionsH2->setDistributionInvForDirection(h2[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
             distributionsH2->setDistributionInvForDirection(h2[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
@@ -370,15 +370,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
 
             break;
         case DIR_00P:
-            f[DIR_00P] = ftemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_00P];
-            f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_P0P];
-            f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_M0P];
-            f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_0PP];
-            f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_0MP];
-            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_PPP];
-            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_MPP];
-            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_PMP];
-            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[DIR_MMP];
+            f[DIR_00P] = ftemp[DIR_00P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_00P];
+            f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_P0P];
+            f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_M0P];
+            f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_0PP];
+            f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_0MP];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_PPP];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_MPP];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_PMP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_MMP];
 
             distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
             distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
@@ -390,15 +390,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
             distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
 
-            h[DIR_00P] = htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_00P];
-            h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_P0P];
-            h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_M0P];
-            h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_0PP];
-            h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_0MP];
-            h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_PPP];
-            h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_MPP];
-            h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_PMP];
-            h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[DIR_MMP];
+            h[DIR_00P] = htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_00P];
+            h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_P0P];
+            h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_M0P];
+            h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_0PP];
+            h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_0MP];
+            h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_PPP];
+            h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_MPP];
+            h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_PMP];
+            h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_MMP];
 
             distributionsH->setDistributionInvForDirection(h[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
             distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
@@ -410,15 +410,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
             distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
 
-            h2[DIR_00P] = c1o2 * (htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_00P]);
-            h2[DIR_P0P] = c1o2 * (htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_P0P]);
-            h2[DIR_M0P] = c1o2 * (htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_M0P]);
-            h2[DIR_0PP] = c1o2 * (htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_0PP]);
-            h2[DIR_0MP] = c1o2 * (htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_0MP]);
-            h2[DIR_PPP] = c1o2 * (htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_PPP]);
-            h2[DIR_MPP] = c1o2 * (htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_MPP]);
-            h2[DIR_PMP] = c1o2 * (htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_PMP]);
-            h2[DIR_MMP] = c1o2 * (htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_MMP]);
+            h2[DIR_00P] = c1o2 * (htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_00P]);
+            h2[DIR_P0P] = c1o2 * (htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_P0P]);
+            h2[DIR_M0P] = c1o2 * (htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_M0P]);
+            h2[DIR_0PP] = c1o2 * (htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_0PP]);
+            h2[DIR_0MP] = c1o2 * (htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_0MP]);
+            h2[DIR_PPP] = c1o2 * (htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_PPP]);
+            h2[DIR_MPP] = c1o2 * (htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_MPP]);
+            h2[DIR_PMP] = c1o2 * (htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_PMP]);
+            h2[DIR_MMP] = c1o2 * (htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h2[DIR_MMP]);
 
             distributionsH2->setDistributionInvForDirection(h2[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
             distributionsH2->setDistributionInvForDirection(h2[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
@@ -432,15 +432,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
 
             break;
         case DIR_00M:
-            f[DIR_00M] = ftemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_00M];
-            f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_P0M];
-            f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_M0M];
-            f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_0PM];
-            f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_0MM];
-            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_PPM];
-            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_MPM];
-            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_PMM];
-            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[DIR_MMM];
+            f[DIR_00M] = ftemp[DIR_00M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_00M];
+            f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_P0M];
+            f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_M0M];
+            f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_0PM];
+            f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_0MM];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_PPM];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_MPM];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_PMM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_MMM];
 
             distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
             distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
@@ -452,15 +452,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
             distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
-            h[DIR_00M] = htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_00M];
-            h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_P0M];
-            h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_M0M];
-            h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_0PM];
-            h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_0MM];
-            h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_PPM];
-            h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_MPM];
-            h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_PMM];
-            h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[DIR_MMM];
+            h[DIR_00M] = htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_00M];
+            h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_P0M];
+            h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_M0M];
+            h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_0PM];
+            h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_0MM];
+            h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_PPM];
+            h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_MPM];
+            h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_PMM];
+            h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_MMM];
 
             distributionsH->setDistributionInvForDirection(h[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
             distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
@@ -472,15 +472,15 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
             distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
             distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
-            h2[DIR_00M] = c1o2 * (htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_00M]);
-            h2[DIR_P0M] = c1o2 * (htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_P0M]);
-            h2[DIR_M0M] = c1o2 * (htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_M0M]);
-            h2[DIR_0PM] = c1o2 * (htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_0PM]);
-            h2[DIR_0MM] = c1o2 * (htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_0MM]);
-            h2[DIR_PPM] = c1o2 * (htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_PPM]);
-            h2[DIR_MPM] = c1o2 * (htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_MPM]);
-            h2[DIR_PMM] = c1o2 * (htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_PMM]);
-            h2[DIR_MMM] = c1o2 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_MMM]);
+            h2[DIR_00M] = c1o2 * (htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_00M]);
+            h2[DIR_P0M] = c1o2 * (htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_P0M]);
+            h2[DIR_M0M] = c1o2 * (htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_M0M]);
+            h2[DIR_0PM] = c1o2 * (htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_0PM]);
+            h2[DIR_0MM] = c1o2 * (htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_0MM]);
+            h2[DIR_PPM] = c1o2 * (htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_PPM]);
+            h2[DIR_MPM] = c1o2 * (htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_MPM]);
+            h2[DIR_PMM] = c1o2 * (htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_PMM]);
+            h2[DIR_MMM] = c1o2 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h2[DIR_MMM]);
 
             distributionsH2->setDistributionInvForDirection(h2[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
             distributionsH2->setDistributionInvForDirection(h2[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
index 3fa67b2763eb5a3d6d456f72b2fdada5a6040782..3aae2ce0384e67cd0024106fb7de3d9b1b1dd7a8 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseNonReflectingOutflowBCAlgorithm.h
+//! \file MultiphaseNonReflectingOutflowBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#ifndef MultiphaseNonReflectingOutflowBCAlgorithm_h__
-#define MultiphaseNonReflectingOutflowBCAlgorithm_h__
+#ifndef MultiphaseNonReflectingOutflowBCStrategy_h__
+#define MultiphaseNonReflectingOutflowBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 //! A class implements non reflecting outflow boundary condition for multiphase simulations
-class MultiphaseNonReflectingOutflowBCAlgorithm : public BCAlgorithm
+class MultiphaseNonReflectingOutflowBCStrategy : public BCStrategy
 {
 public:
-    MultiphaseNonReflectingOutflowBCAlgorithm();
-    ~MultiphaseNonReflectingOutflowBCAlgorithm();
-    SPtr<BCAlgorithm> clone();
+    MultiphaseNonReflectingOutflowBCStrategy();
+    ~MultiphaseNonReflectingOutflowBCStrategy();
+    SPtr<BCStrategy> clone();
     void addDistributions(SPtr<DistributionArray3D> distributions);
     void addDistributionsH(SPtr<DistributionArray3D> distributionsH);
     void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2);
     void applyBC();
 };
-#endif // MultiphaseNonReflectingOutflowBCAlgorithm_h__
+#endif // MultiphaseNonReflectingOutflowBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
index 19fbcc77d39f644addbc6ce79c24f369144dca8a..904a0ff19ff5b54c6aa083bbce3ba24d9766e720 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
@@ -26,43 +26,43 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseSlipBCAlgorithm.cpp
+//! \file MultiphaseSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#include "MultiphaseSlipBCAlgorithm.h"
+#include "MultiphaseSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-MultiphaseSlipBCAlgorithm::MultiphaseSlipBCAlgorithm()
+MultiphaseSlipBCStrategy::MultiphaseSlipBCStrategy()
 {
-   BCAlgorithm::type = BCAlgorithm::SlipBCAlgorithm;
-   BCAlgorithm::preCollision = false;
+   BCStrategy::type = BCStrategy::SlipBCStrategy;
+   BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-MultiphaseSlipBCAlgorithm::~MultiphaseSlipBCAlgorithm()
+MultiphaseSlipBCStrategy::~MultiphaseSlipBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> MultiphaseSlipBCAlgorithm::clone()
+SPtr<BCStrategy> MultiphaseSlipBCStrategy::clone()
 {
-   SPtr<BCAlgorithm> bc(new MultiphaseSlipBCAlgorithm());
+   SPtr<BCStrategy> bc(new MultiphaseSlipBCStrategy());
    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void MultiphaseSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseSlipBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
+void MultiphaseSlipBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
 {
 	this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseSlipBCAlgorithm::applyBC()
+void MultiphaseSlipBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
@@ -101,7 +101,7 @@ void MultiphaseSlipBCAlgorithm::applyBC()
          const int invDir = D3Q27System::INVDIR[fdir];
          real q = bcPtr->getQ(invDir);// m+m q=0 stabiler
          //vx3=0;
-         real velocity = 0.0;
+         real velocity = vf::lbm::constant::c0o1;
          switch (invDir)
          {
          case DIR_P00: velocity = (vf::lbm::constant::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
@@ -132,7 +132,7 @@ void MultiphaseSlipBCAlgorithm::applyBC()
          case DIR_MPP: velocity = (vf::lbm::constant::c1o36*(-vx1+vx2+vx3)); break;
          default: throw UbException(UB_EXARGS, "unknown error");
          }
-         real fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q));
+         real fReturn = ((vf::lbm::constant::c1o1-q)/(vf::lbm::constant::c1o1+q))*((f[invDir]-feq[invDir])/(vf::lbm::constant::c1o1-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(vf::lbm::constant::c1o1+q));
          distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
 
 		 //real hReturn = ((1.0-q)/(1.0+q))*((h[invDir]-heq[invDir])/(1.0-collFactorPh)+heq[invDir])+((q/(1.0+q))*(h[invDir]+h[fdir]));
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.h
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
index 53d41d33ca333b7a7bf5515883eef697a20fb04a..1eb25a958505eb2fca2509763acf2f14bdf93414 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
@@ -26,26 +26,26 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseSlipBCAlgorithm.h
+//! \file MultiphaseSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#ifndef MultiphaseSlipBCAlgorithm_h__
-#define MultiphaseSlipBCAlgorithm_h__
+#ifndef MultiphaseSlipBCStrategy_h__
+#define MultiphaseSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
 //! A class implements slip boundary condition for multiphase simulation
-class MultiphaseSlipBCAlgorithm : public BCAlgorithm
+class MultiphaseSlipBCStrategy : public BCStrategy
 {
 public:
-   MultiphaseSlipBCAlgorithm();
-   virtual ~MultiphaseSlipBCAlgorithm();
-   SPtr<BCAlgorithm> clone() override;
+   MultiphaseSlipBCStrategy();
+   virtual ~MultiphaseSlipBCStrategy();
+   SPtr<BCStrategy> clone() override;
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void addDistributionsH(SPtr<DistributionArray3D> distributionsH) override;
    void applyBC() override;
 
 };
-#endif // SlipBCAlgorithm_h__
+#endif // SlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAdapter.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
similarity index 82%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAdapter.cpp
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
index ee8761f98fe151282cedd24b07b4a608f8ad3873..1adf45607c2015f287b0ec310b77c7af7bc9848f 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAdapter.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
@@ -26,12 +26,12 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseVelocityBCAdapter.cpp
+//! \file MultiphaseVelocityBC.cpp
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#include "MultiphaseVelocityBCAdapter.h"
+#include "MultiphaseVelocityBC.h"
 #include "basics/utilities/UbLogger.h"
 #include "basics/utilities/UbMath.h"
 #include "basics/utilities/UbTuple.h"
@@ -39,7 +39,7 @@
 using namespace std;
 
 
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const BCFunction& velVxBC)
+MultiphaseVelocityBC::MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const BCFunction& velVxBC)
 {
    if(vx1) this->vx1BCs.push_back(velVxBC);
    if(vx2) this->vx2BCs.push_back(velVxBC);
@@ -47,7 +47,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function, const real& phiBC, const real& startTime, const real& endTime )
+MultiphaseVelocityBC::MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function, const real& phiBC, const real& startTime, const real& endTime )
 {
    if(vx1) this->vx1BCs.push_back(BCFunction(function,startTime,endTime));
    if(vx2) this->vx2BCs.push_back(BCFunction(function,startTime,endTime));
@@ -58,7 +58,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const
 
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function1, const mu::Parser& function2, const mu::Parser& function3, const real& phiBC, const real& startTime, const real& endTime )
+MultiphaseVelocityBC::MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function1, const mu::Parser& function2, const mu::Parser& function3, const real& phiBC, const real& startTime, const real& endTime )
 {
    if(vx1) this->vx1BCs.push_back(BCFunction(function1,startTime,endTime));
    if(vx2) this->vx2BCs.push_back(BCFunction(function2,startTime,endTime));
@@ -67,7 +67,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const string& functionstring, const real& startTime, const real& endTime )
+MultiphaseVelocityBC::MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const string& functionstring, const real& startTime, const real& endTime )
 {
    if(vx1) this->vx1BCs.push_back(BCFunction(functionstring,startTime,endTime));
    if(vx2) this->vx2BCs.push_back(BCFunction(functionstring,startTime,endTime));
@@ -75,7 +75,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const bool& vx1, const
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const BCFunction& velBC, bool x1Dir, bool x2Dir, bool x3Dir)
+MultiphaseVelocityBC::MultiphaseVelocityBC(const BCFunction& velBC, bool x1Dir, bool x2Dir, bool x3Dir)
 {
    if(x1Dir) this->vx1BCs.push_back(velBC);
    if(x2Dir) this->vx2BCs.push_back(velBC);
@@ -83,7 +83,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const BCFunction& velBC
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const BCFunction& velVx1BC, const BCFunction& velVx2BC, const BCFunction& velVx3BC)
+MultiphaseVelocityBC::MultiphaseVelocityBC(const BCFunction& velVx1BC, const BCFunction& velVx2BC, const BCFunction& velVx3BC)
 {
    if( velVx1BC.getEndTime()!=-Ub::inf ) this->vx1BCs.push_back(velVx1BC);
    if( velVx2BC.getEndTime()!=-Ub::inf ) this->vx2BCs.push_back(velVx2BC);
@@ -91,7 +91,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const BCFunction& velVx
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const vector< BCFunction >& velVx1BCs, const vector< BCFunction >& velVx2BCs, const vector< BCFunction >& velVx3BCs)
+MultiphaseVelocityBC::MultiphaseVelocityBC(const vector< BCFunction >& velVx1BCs, const vector< BCFunction >& velVx2BCs, const vector< BCFunction >& velVx3BCs)
 {
    this->vx1BCs = velVx1BCs;
    this->vx2BCs = velVx2BCs;
@@ -99,7 +99,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const vector< BCFunctio
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const real& vx1, const real& vx1StartTime, const real& vx1EndTime,
+MultiphaseVelocityBC::MultiphaseVelocityBC(const real& vx1, const real& vx1StartTime, const real& vx1EndTime,
                                                const real& vx2, const real& vx2StartTime, const real& vx2EndTime,
                                                const real& vx3, const real& vx3StartTime, const real& vx3EndTime )
 {
@@ -109,7 +109,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const real& vx1, const
    this->init();
 }
 /*==========================================================*/
-MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const string& vx1Function, const real& vx1StartTime, const real& vx1EndTime,
+MultiphaseVelocityBC::MultiphaseVelocityBC(const string& vx1Function, const real& vx1StartTime, const real& vx1EndTime,
                                                const string& vx2Function, const real& vx2StartTime, const real& vx2EndTime,
                                                const string& vx3Function, const real& vx3StartTime, const real& vx3EndTime ) 
 {
@@ -119,7 +119,7 @@ MultiphaseVelocityBCAdapter::MultiphaseVelocityBCAdapter(const string& vx1Functi
    this->init();
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::setNewVelocities(const real& vx1, const real& vx1StartTime, const real& vx1EndTime,
+void MultiphaseVelocityBC::setNewVelocities(const real& vx1, const real& vx1StartTime, const real& vx1EndTime,
                                               const real& vx2, const real& vx2StartTime, const real& vx2EndTime,
                                               const real& vx3, const real& vx3StartTime, const real& vx3EndTime )
 {
@@ -130,7 +130,7 @@ void MultiphaseVelocityBCAdapter::setNewVelocities(const real& vx1, const real&
    this->init();
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::init()
+void MultiphaseVelocityBC::init()
 {
    this->unsetTimeDependent();
    
@@ -155,7 +155,7 @@ void MultiphaseVelocityBCAdapter::init()
    catch(...)                          { throw UbException(UB_EXARGS,"unknown exception" ); }
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::init(std::vector<BCFunction>& vxBCs)
+void MultiphaseVelocityBC::init(std::vector<BCFunction>& vxBCs)
 {
    for(size_t pos=0; pos<vxBCs.size(); ++pos)
    {
@@ -174,7 +174,7 @@ void MultiphaseVelocityBCAdapter::init(std::vector<BCFunction>& vxBCs)
    }
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::init(const D3Q27Interactor* const& interactor, const real& time)
+void MultiphaseVelocityBC::init(const D3Q27Interactor* const& interactor, const real& time)
 {
    this->timeStep       = time;
    this->tmpVx1Function = this->tmpVx2Function = this->tmpVx3Function = NULL;
@@ -259,31 +259,31 @@ void MultiphaseVelocityBCAdapter::init(const D3Q27Interactor* const& interactor,
       }
    }
 
-   UBLOG(logDEBUG4,"D3Q27VelocityBCAdapter::init(time="<<time<<") "
+   UBLOG(logDEBUG4,"D3Q27VelocityBC::init(time="<<time<<") "
                    <<", vx1= \""<<(tmpVx1Function ? tmpVx1Function->GetExpr() : "-")<<"\""
                    <<", vx2= \""<<(tmpVx2Function ? tmpVx2Function->GetExpr() : "-")<<"\""
                    <<", vx3= \""<<(tmpVx3Function ? tmpVx3Function->GetExpr() : "-")<<"\""
                    <<", timedependent="<<boolalpha<<this->isTimeDependent()   );
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::update( const D3Q27Interactor* const& interactor, const real& time ) 
+void MultiphaseVelocityBC::update( const D3Q27Interactor* const& interactor, const real& time ) 
 {
    this->init(interactor,time);
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::adaptBCForDirection( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& q, const int& fdirection, const real& time )
+void MultiphaseVelocityBC::adaptBCForDirection( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& q, const int& fdirection, const real& time )
 {
    bc->setVelocityBoundaryFlag(D3Q27System::INVDIR[fdirection],secondaryBcOption);
    bc->setQ((real)q,fdirection);
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::adaptBC( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& time ) 
+void MultiphaseVelocityBC::adaptBC( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& time ) 
 {
    this->setNodeVelocity(interactor,bc,worldX1,worldX2,worldX3,time);
-   bc->setBcAlgorithmType(algorithmType);
+   bc->setBCStrategyType(algorithmType);
 }
 /*==========================================================*/
-void MultiphaseVelocityBCAdapter::setNodeVelocity( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& timestep) 
+void MultiphaseVelocityBC::setNodeVelocity( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& timestep) 
 {
    //Geschwindigkeiten setzen
    try
@@ -304,11 +304,11 @@ void MultiphaseVelocityBCAdapter::setNodeVelocity( const D3Q27Interactor& intera
    catch(...)                          { throw UbException(UB_EXARGS,"unknown exception" ); }
 }
 /*==========================================================*/
-UbTupleDouble3 MultiphaseVelocityBCAdapter::getVelocity(const real& x1, const real& x2, const real& x3, const real& timeStep) const
+UbTupleDouble3 MultiphaseVelocityBC::getVelocity(const real& x1, const real& x2, const real& x3, const real& timeStep) const
 {
-	real vx1 = 0.0;
-	real vx2 = 0.0;
-	real vx3 = 0.0;
+	real vx1 = vf::lbm::constant::c0o1;
+	real vx2 = vf::lbm::constant::c0o1;
+	real vx3 = vf::lbm::constant::c0o1;
    this->x1 = x1;
    this->x2 = x2;
    this->x3 = x3;
@@ -321,10 +321,10 @@ UbTupleDouble3 MultiphaseVelocityBCAdapter::getVelocity(const real& x1, const re
    return UbTupleDouble3(vx1,vx2,vx3);
 }
 /*==========================================================*/
-string MultiphaseVelocityBCAdapter::toString()
+string MultiphaseVelocityBC::toString()
 {
    stringstream info;
-   info<<"D3Q27VelocityBCAdapter:\n";
+   info<<"D3Q27VelocityBC:\n";
    info<<" #vx1-functions = "<<(int)vx1BCs.size()<<endl;
    info<<" #vx2-functions = "<<(int)vx2BCs.size()<<endl;
    info<<" #vx3-functions = "<<(int)vx3BCs.size()<<endl;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAdapter.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.h
similarity index 80%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAdapter.h
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.h
index 60d93cdecd141834b9800c08fc9b6d1e4fab3c92..e01237cf96e14bffbbfeac43469d32c907d56dd7 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAdapter.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.h
@@ -26,12 +26,12 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseVelocityBCAdapter.h
+//! \file MultiphaseVelocityBC.h
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
-#ifndef MultiphaseVelocityBCAdapter_H
-#define MultiphaseVelocityBCAdapter_H
+#ifndef MultiphaseVelocityBC_H
+#define MultiphaseVelocityBC_H
 
 #include <iostream>
 #include <string>
@@ -45,7 +45,7 @@
 class UbFileOutput;
 class UbFileInput;
 
-#include <BCAdapter.h>
+#include <BC.h>
 #include <BCFunction.h>
 
 //! \brief A class provides an interface for velocity boundary condition for multiphase simulation in grid generator.
@@ -61,8 +61,8 @@ class UbFileInput;
 //!        vx2BCs.push_back(BCFunction(0.002, 200, 300) );   //t=[200..300[ -> vx2 = 0.002
 //!        vx2BCs.push_back(BCFunction(0.043, 300, 600) );   //t=[300..600] -> vx2 = 0.043
 //!
-//!        VelocityBCAdapter bcAdapter(vx1BCs,vx2BCs,vx3BCs);
-//!        bcAdapter.setTimePeriodic(); //->  t=[0  ..100[ -> vx1 = 0.01
+//!        VelocityBC BC(vx1BCs,vx2BCs,vx3BCs);
+//!        BC.setTimePeriodic(); //->  t=[0  ..100[ -> vx1 = 0.01
 //!                                     //    t=[100..200[ -> vx1 = 0.004
 //!                                     //    t=[200..400[ -> vx1 = 0.03
 //!                                     //    t=[400..500[ -> vx1 = 0.01
@@ -81,34 +81,34 @@ class UbFileInput;
 //!    fct.SetExpr("max(vmax*(1.0-4.0*((x2-x2_vmax)^2+(x3-x3_vmax)^2)/H^2),0.0)"); //paraboloid (with vmax for
 //!    (0/x2_vmax/x3_vmax) fct.DefineConst("x2Vmax", 0.0            ); //x2-Pos für vmax fct.DefineConst("x3Vmax", 0.0
 //!    ); //x3-Pos für vmax fct.DefineConst("H"     , diameterOfPipe); fct.DefineConst("vmax"  , vmax           );
-//!    VelocityBCAdapter velBC(true, false ,false ,fct, 0, BCFunction::INFCONST);
+//!    VelocityBC velBC(true, false ,false ,fct, 0, BCFunction::INFCONST);
 //! \endcode 
 
-class MultiphaseVelocityBCAdapter : public BCAdapter
+class MultiphaseVelocityBC : public BC
 {
 public:
    //constructors
-   MultiphaseVelocityBCAdapter() { this->init(); }
+   MultiphaseVelocityBC() { this->init(); }
    
-   MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const BCFunction& velVxBC );
+   MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const BCFunction& velVxBC );
 
-   MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function, const real& phiBC, const real& startTime, const real& endTime  );
+   MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function, const real& phiBC, const real& startTime, const real& endTime  );
 
-   MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function1, const mu::Parser& function2, const mu::Parser& function3, const real& phiBC, const real& startTime, const real& endTime );
+   MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const mu::Parser& function1, const mu::Parser& function2, const mu::Parser& function3, const real& phiBC, const real& startTime, const real& endTime );
    
-   MultiphaseVelocityBCAdapter(const bool& vx1, const bool& vx2, const bool& vx3, const std::string& functionstring, const real& startTime, const real& endTime );
+   MultiphaseVelocityBC(const bool& vx1, const bool& vx2, const bool& vx3, const std::string& functionstring, const real& startTime, const real& endTime );
 
-   MultiphaseVelocityBCAdapter(const BCFunction& velBC, bool x1Dir, bool x2Dir, bool x3Dir);
+   MultiphaseVelocityBC(const BCFunction& velBC, bool x1Dir, bool x2Dir, bool x3Dir);
 
-   MultiphaseVelocityBCAdapter(const BCFunction& velVx1BC, const BCFunction& velVx2BC, const BCFunction& velVx3BC);
+   MultiphaseVelocityBC(const BCFunction& velVx1BC, const BCFunction& velVx2BC, const BCFunction& velVx3BC);
 
-   MultiphaseVelocityBCAdapter(const std::vector< BCFunction >& velVx1BCs, const std::vector< BCFunction >& velVx2BCs, const std::vector< BCFunction >& velVx3BCs);
+   MultiphaseVelocityBC(const std::vector< BCFunction >& velVx1BCs, const std::vector< BCFunction >& velVx2BCs, const std::vector< BCFunction >& velVx3BCs);
 
-   MultiphaseVelocityBCAdapter(const real& vx1, const real& vx1StartTime, const real& vx1EndTime,
+   MultiphaseVelocityBC(const real& vx1, const real& vx1StartTime, const real& vx1EndTime,
                           const real& vx2, const real& vx2StartTime, const real& vx2EndTime,
                           const real& vx3, const real& vx3StartTime, const real& vx3EndTime);
 
-   MultiphaseVelocityBCAdapter(const std::string& vx1Function, const real& vx1StartTime, const real& vx1EndTime,
+   MultiphaseVelocityBC(const std::string& vx1Function, const real& vx1StartTime, const real& vx1EndTime,
                           const std::string& vx2Function, const real& vx2StartTime, const real& vx2EndTime,
                           const std::string& vx3Function, const real& vx3StartTime, const real& vx3EndTime ); 
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
similarity index 89%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
index b6ddf4b46925e770cfcdcc5390d41ed816b992bc..a34fe21384e818e8069d21194abcc8b3f7718531 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
@@ -26,47 +26,47 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseVelocityBCAlgorithm.cpp
+//! \file MultiphaseVelocityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#include "MultiphaseVelocityBCAlgorithm.h"
+#include "MultiphaseVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-MultiphaseVelocityBCAlgorithm::MultiphaseVelocityBCAlgorithm()
+MultiphaseVelocityBCStrategy::MultiphaseVelocityBCStrategy()
 {
-   BCAlgorithm::type = BCAlgorithm::MultiphaseVelocityBCAlgorithm;
-   BCAlgorithm::preCollision = false;
+   BCStrategy::type = BCStrategy::MultiphaseVelocityBCStrategy;
+   BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-MultiphaseVelocityBCAlgorithm::~MultiphaseVelocityBCAlgorithm()
+MultiphaseVelocityBCStrategy::~MultiphaseVelocityBCStrategy()
 {
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> MultiphaseVelocityBCAlgorithm::clone()
+SPtr<BCStrategy> MultiphaseVelocityBCStrategy::clone()
 {
-   SPtr<BCAlgorithm> bc(new MultiphaseVelocityBCAlgorithm());
+   SPtr<BCStrategy> bc(new MultiphaseVelocityBCStrategy());
    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void MultiphaseVelocityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
+void MultiphaseVelocityBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
 {
 	this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH)
+void MultiphaseVelocityBCStrategy::addDistributionsH2(SPtr<DistributionArray3D> distributionsH)
 {
     this->distributionsH2 = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::applyBC()
+void MultiphaseVelocityBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
@@ -89,7 +89,7 @@ void MultiphaseVelocityBCAlgorithm::applyBC()
    vx1=bcPtr->getBoundaryVelocityX1();
    vx2 = bcPtr->getBoundaryVelocityX2();
    vx3 = bcPtr->getBoundaryVelocityX3();
-   p1 = 0.0;
+   p1 = vf::lbm::constant::c0o1;
    D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
    D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3);
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.h
rename to src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
index 0cfd9a3baa2a13780f39f3dbce024f982907f916..4e99c876aca206eae0cae3bcf8c643d9ce930b87 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
@@ -26,27 +26,27 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file MultiphaseVelocityBCAlgorithm.h
+//! \file MultiphaseVelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Hesameddin Safari
 //=======================================================================================
 
-#ifndef MultiphaseVelocityBCAlgorithm_h__
-#define MultiphaseVelocityBCAlgorithm_h__
+#ifndef MultiphaseVelocityBCStrategy_h__
+#define MultiphaseVelocityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 //! A class implements velocity boundary condition for multiphase simulations
-class MultiphaseVelocityBCAlgorithm : public BCAlgorithm
+class MultiphaseVelocityBCStrategy : public BCStrategy
 {
 public:
-   MultiphaseVelocityBCAlgorithm();
-   ~MultiphaseVelocityBCAlgorithm();
-   SPtr<BCAlgorithm> clone() override;
+   MultiphaseVelocityBCStrategy();
+   ~MultiphaseVelocityBCStrategy();
+   SPtr<BCStrategy> clone() override;
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void addDistributionsH(SPtr<DistributionArray3D> distributionsH) override;
    void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) override;
    void applyBC() override;
 };
 
-#endif // MultiphaseVelocityBCAlgorithm_h__
+#endif // MultiphaseVelocityBCStrategy_h__
 
diff --git a/src/cpu/MultiphaseFlow/CMakeLists.txt b/src/cpu/MultiphaseFlow/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..35765164bce5ce208f1c43fcc7345cbd77f4e999
--- /dev/null
+++ b/src/cpu/MultiphaseFlow/CMakeLists.txt
@@ -0,0 +1 @@
+vf_add_library(PUBLIC_LINK VirtualFluidsCore)
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.cpp
index 3b660f6dcb985be987d0c0d46f2b29bc15fab468..834d37944bc0b47ac5d3fc5dd10194bdf63184d9 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.cpp
@@ -69,7 +69,7 @@ SPtr<LBMKernel> MultiphaseCumulantLBMKernel::clone()
     kernel->setPhaseFieldRelaxation(this->tauH);
     kernel->setMobility(this->mob);
 
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -100,7 +100,7 @@ void MultiphaseCumulantLBMKernel::calculate(int step)
     nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
     zeroDistributionsH     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -1290,7 +1290,7 @@ void MultiphaseCumulantLBMKernel::findNeighbors(CbArray3D<real, IndexerX3X2X1>::
     using namespace vf::lbm::dir;
 
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     phi[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.h
index 1402e35f0626399c30875d3f58bbcd256367d965..a42f6d5eaf907cd3706546c7afcd67d93e9985f2 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphaseCumulantLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
index c294a381f6c4309577022ca16ee781775f22a31f..92302b342927ccaf4e6d49e3a073fec732fac6ba 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
@@ -79,7 +79,7 @@ SPtr<LBMKernel> MultiphasePressureFilterCompressibleAirLBMKernel::clone()
 	kernel->setMobility(this->mob);
 	kernel->setInterfaceWidth(this->interfaceWidth);
 
-	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setBCSet(bcSet->clone(kernel));
 	kernel->setWithForcing(withForcing);
 	kernel->setForcingX1(muForcingX1);
 	kernel->setForcingX2(muForcingX2);
@@ -168,7 +168,7 @@ void MultiphasePressureFilterCompressibleAirLBMKernel::calculate(int step)
 
 	CbArray3D<real, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -1630,7 +1630,7 @@ void MultiphasePressureFilterCompressibleAirLBMKernel::findNeighbors(CbArray3D<r
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi[DIR_000] = (*ph)(x1, x2, x3);
 
@@ -1651,7 +1651,7 @@ void MultiphasePressureFilterCompressibleAirLBMKernel::findNeighbors2(CbArray3D<
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi2[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
index 65be707f90d1327cad559cc7f9361e74508bcd30..56d31b53c8ed42358e898869e8193bcf7779743a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphasePressureFilterCompressibleAirLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.cpp
index 0aafeb0b03afcfb0fe10196bc8c149a0979bdfc2..7e167838ad9ce09f2fd16769c1217602e700e607 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.cpp
@@ -79,7 +79,7 @@ SPtr<LBMKernel> MultiphasePressureFilterLBMKernel::clone()
 	kernel->setMobility(this->mob);
 	kernel->setInterfaceWidth(this->interfaceWidth);
 
-	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setBCSet(bcSet->clone(kernel));
 	kernel->setWithForcing(withForcing);
 	kernel->setForcingX1(muForcingX1);
 	kernel->setForcingX2(muForcingX2);
@@ -168,7 +168,7 @@ void MultiphasePressureFilterLBMKernel::calculate(int step)
 
 	CbArray3D<real, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -1748,7 +1748,7 @@ void MultiphasePressureFilterLBMKernel::findNeighbors(CbArray3D<real, IndexerX3X
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.h
index d13a5aeffa95cc3ee4980edf5cc93650ecc617a3..fc2783b4f844a0acb00386c64ff034bfa900928b 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphasePressureFilterLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.cpp
index f6cb731fb4eec7e49d7b946ada6fb1cf30456f2e..45e3131c29cd6dfa3364c72ab4642cc7fc4acc62 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.cpp
@@ -70,7 +70,7 @@ SPtr<LBMKernel> MultiphaseScratchCumulantLBMKernel::clone()
     kernel->setPhaseFieldRelaxation(this->tauH);
     kernel->setMobility(this->mob);
 
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -155,7 +155,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
     nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
     zeroDistributionsH     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -3062,7 +3062,7 @@ void MultiphaseScratchCumulantLBMKernel::findNeighbors(CbArray3D<real, IndexerX3
     using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     phi[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.h
index 6f10c9b5db0e2272d734de02a55dab1452f79d1a..db4e547a2054f1a37468bb726f4f3fc20c33bd53 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphaseScratchCumulantLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
index 8ea6c1f786e700fafaa8cb8d4fe900618852a192..c1cbdd6256f86f5307f2df2ebc36549126020c66 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
@@ -85,7 +85,7 @@ SPtr<LBMKernel> MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::clone()
 	kernel->setMobility(this->mob);
 	kernel->setInterfaceWidth(this->interfaceWidth);
 
-	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setBCSet(bcSet->clone(kernel));
 	kernel->setWithForcing(withForcing);
 	kernel->setForcingX1(muForcingX1);
 	kernel->setForcingX2(muForcingX2);
@@ -170,7 +170,7 @@ void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::calculate(int step)
 
 	CbArray3D<real, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -2982,7 +2982,7 @@ void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors(CbArra
 	using namespace vf::lbm::dir;
 	using namespace vf::lbm::constant;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi[DIR_000] = (*ph)(x1, x2, x3);
     if (phi[DIR_000] < 0) {
@@ -3007,7 +3007,7 @@ void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors2(CbArr
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi2[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
index e2dc6d86abf7525231510df4f052cfc0768df457..98ca6108dca8f0835bc5e4e9479f696791cc354c 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphaseSimpleVelocityBaseExternalPressureLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
index 2ece81e93758e0e4923d44c2f3498ea1bdbdd67b..c5bb37f3c04ae2b8bb1164bc34e69a55b38298e0 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
@@ -71,7 +71,7 @@ SPtr<LBMKernel> MultiphaseTwoPhaseFieldsCumulantLBMKernel::clone()
     kernel->setPhaseFieldRelaxation(this->tauH);
     kernel->setMobility(this->mob);
 
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -160,7 +160,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
     nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
     zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -3174,7 +3174,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors(CbArray3D<real, In
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     phi[DIR_000] = (*ph)(x1, x2, x3);
 
@@ -3195,7 +3195,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors2(CbArray3D<real, I
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi2[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
index dbc94d613c4683fb19cb92a7ab7d075da41ab231..34730f454faf81a126eb1431fb623f0447f52fa1 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphaseTwoPhaseFieldsCumulantLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
index 0d49dc68a5e331da2b30a906b2adebb3e1eadb7b..1b0e6c85a4ffe371611423a7f9200065a7ef31a3 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
@@ -83,7 +83,7 @@ SPtr<LBMKernel> MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::clone()
     kernel->setMobility(this->mob);
 	kernel->setInterfaceWidth(this->interfaceWidth);
 
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -176,7 +176,7 @@ void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::calculate(int step)
 
 	CbArray3D<real, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -3540,7 +3540,7 @@ void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::findNeighbors(CbArray3D<re
     using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     phi[DIR_000] = (*ph)(x1, x2, x3);
 
@@ -3561,7 +3561,7 @@ void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::findNeighbors2(CbArray3D<r
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi2[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
index 138b24410b10b4631b1411fba3e803bde504531a..c486caf0c0fb64c3a9a7366b55bb3150c139468a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphaseTwoPhaseFieldsPressureFilterLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
index afde9ef8bca08b862210ea7dea90db349d219dca..020549cf976714bcde5b5bb01fd9cc0d6dfec16d 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
@@ -73,7 +73,7 @@ SPtr<LBMKernel> MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::clone()
     kernel->setPhaseFieldRelaxation(this->tauH);
     kernel->setMobility(this->mob);
 
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -162,7 +162,7 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::calculate(int step)
     nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
     zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -3471,7 +3471,7 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::findNeighbors(CbArray3D<
     using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     phi[DIR_000] = (*ph)(x1, x2, x3);
 
@@ -3492,7 +3492,7 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::findNeighbors2(CbArray3D
 	using namespace D3Q27System;
 	using namespace vf::lbm::dir;
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	phi2[DIR_000] = (*ph)(x1, x2, x3);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
rename to src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
index a34858ae47c0cb5b10755b21df14290fa242115a..34c0f5b8db234c27a2f55f7c8dee4a7c33bdc949 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
+++ b/src/cpu/MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
@@ -35,7 +35,7 @@
 #define MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
rename to src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
index ffc32b9535e477bf2f8de080f8bf45545cb336dd..7669dec49c77bc2621bd903f614d2c3d3d03e2a4 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
+++ b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteMultiphaseQuantitiesCoProcessor.h"
-#include "BCProcessor.h"
+#include "WriteMultiphaseQuantitiesSimulationObserver.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
 #include <vector>
@@ -47,14 +47,14 @@
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 #include <logger/Logger.h>
 
-WriteMultiphaseQuantitiesCoProcessor::WriteMultiphaseQuantitiesCoProcessor() = default;
+WriteMultiphaseQuantitiesSimulationObserver::WriteMultiphaseQuantitiesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMultiphaseQuantitiesCoProcessor::WriteMultiphaseQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMultiphaseQuantitiesSimulationObserver::WriteMultiphaseQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
                                                                              std::shared_ptr<vf::mpi::Communicator> comm)
-        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+        : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -69,21 +69,21 @@ WriteMultiphaseQuantitiesCoProcessor::WriteMultiphaseQuantitiesCoProcessor(SPtr<
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::init()
+void WriteMultiphaseQuantitiesSimulationObserver::init()
 {}
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::process(real step)
+void WriteMultiphaseQuantitiesSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    //UBLOG(logDEBUG3, "WriteMultiphaseQuantitiesCoProcessor::update:" << step);
-    VF_LOG_DEBUG("WriteMultiphaseQuantitiesCoProcessor::update:: {}", step);
+    //UBLOG(logDEBUG3, "WriteMultiphaseQuantitiesSimulationObserver::update:" << step);
+    VF_LOG_DEBUG("WriteMultiphaseQuantitiesSimulationObserver::update:: {}", step);
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::collectData(real step)
+void WriteMultiphaseQuantitiesSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -120,22 +120,22 @@ void WriteMultiphaseQuantitiesCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin())
+        if (step == SimulationObserver::scheduler->getMinBegin())
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else
         {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        //UBLOG(logINFO, "WriteMultiphaseQuantitiesCoProcessor step: " << istep);
-        VF_LOG_INFO("WriteMultiphaseQuantitiesCoProcessor step: {}", istep);
+        //UBLOG(logINFO, "WriteMultiphaseQuantitiesSimulationObserver step: " << istep);
+        VF_LOG_INFO("WriteMultiphaseQuantitiesSimulationObserver step: {}", istep);
     }
 
     clearData();
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::clearData()
+void WriteMultiphaseQuantitiesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -144,7 +144,7 @@ void WriteMultiphaseQuantitiesCoProcessor::clearData()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMultiphaseQuantitiesSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     using namespace D3Q27System;
  //   using namespace UbMath;
@@ -167,7 +167,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     data.resize(datanames.size());
 
 
-    SPtr<BCArray3D> bcArray                  = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                  = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributionsF = kernel->getDataSet()->getFdistributions();
     SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
     SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions();
@@ -474,7 +474,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     }
 }
 
-real WriteMultiphaseQuantitiesCoProcessor::gradX1_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::gradX1_phi(const real *const &h)
 {
     using namespace D3Q27System;
     real sum = 0.0;
@@ -483,7 +483,7 @@ real WriteMultiphaseQuantitiesCoProcessor::gradX1_phi(const real *const &h)
     }
     return 3.0 * sum;
 }
-real WriteMultiphaseQuantitiesCoProcessor::gradX2_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::gradX2_phi(const real *const &h)
 {
     using namespace D3Q27System;
     real sum = 0.0;
@@ -493,7 +493,7 @@ real WriteMultiphaseQuantitiesCoProcessor::gradX2_phi(const real *const &h)
     return 3.0 * sum;
 }
 
-real WriteMultiphaseQuantitiesCoProcessor::gradX3_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::gradX3_phi(const real *const &h)
 {
     using namespace D3Q27System;
     real sum = 0.0;
@@ -503,7 +503,7 @@ real WriteMultiphaseQuantitiesCoProcessor::gradX3_phi(const real *const &h)
     return 3.0 * sum;
 }
 
-real WriteMultiphaseQuantitiesCoProcessor::nabla2_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::nabla2_phi(const real *const &h)
 {
     using namespace vf::lbm::dir;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h
rename to src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
index de09654bb01b8bd851df3afcea1fb3445386fff0..452a06d3bbb23943995f42ce84d712aa3c01b6a4 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h
+++ b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteMultiphaseQuantitiesCoProcessor_H
-#define WriteMultiphaseQuantitiesCoProcessor_H
+#ifndef WriteMultiphaseQuantitiesSimulationObserver_H
+#define WriteMultiphaseQuantitiesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -50,11 +50,11 @@ class WbWriter;
 class Block3D;
 
 //! \brief A class writes macroscopic quantities information to a VTK-file
-class WriteMultiphaseQuantitiesCoProcessor : public CoProcessor
+class WriteMultiphaseQuantitiesSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMultiphaseQuantitiesCoProcessor();
-    //! \brief Construct WriteMultiphaseQuantitiesCoProcessor object
+    WriteMultiphaseQuantitiesSimulationObserver();
+    //! \brief Construct WriteMultiphaseQuantitiesSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
@@ -62,11 +62,11 @@ public:
     //! \param writer is WbWriter object
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
-    WriteMultiphaseQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteMultiphaseQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                           WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMultiphaseQuantitiesCoProcessor() override = default;
+    ~WriteMultiphaseQuantitiesSimulationObserver() override = default;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Collect data for VTK-file
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
index b4eee2dfbd952d27835dbaab24da84c041999a21..1b8dc581c37fea66b6f5725330d5d693917adf7d 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
@@ -32,15 +32,15 @@
 //=======================================================================================
 
 #include "MultiphaseBoundaryConditionsBlockVisitor.h"
-#include "BCAdapter.h"
+#include "BC.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "D3Q27System.h"
-#include "BCAdapter.h"
+#include "BC.h"
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "LBMKernel.h"
@@ -67,14 +67,14 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
          throw UbException(UB_EXARGS, "LBMKernel in " + block->toString() + "is not exist!");
       }
 
-      SPtr<BCProcessor> bcProcessor = kernel->getBCProcessor();
+      SPtr<BCSet> bcSet = kernel->getBCSet();
 
-      if (!bcProcessor)
+      if (!bcSet)
       {
          throw UbException(UB_EXARGS,"Boundary Conditions Processor is not exist!" );
       }
 
-      SPtr<BCArray3D> bcArray = bcProcessor->getBCArray();
+      SPtr<BCArray3D> bcArray = bcSet->getBCArray();
 
       bool compressible = kernel->getCompressible();
       real collFactorL = kernel->getCollisionFactorL();
@@ -93,7 +93,7 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
       int maxX3 = (int)bcArray->getNX3();
       SPtr<BoundaryConditions> bcPtr;
 
-      bcProcessor->clearBC();
+      bcSet->clearBC();
 
       SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
 	  SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
@@ -109,8 +109,8 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
                {
                   if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL)
                   {
-                     char alg = bcPtr->getBcAlgorithmType();
-                     SPtr<BCAlgorithm> bca = bcMap[alg];
+                     char alg = bcPtr->getBCStrategyType();
+                     SPtr<BCStrategy> bca = bcMap[alg];
                      
                      if (bca)
                      {
@@ -129,7 +129,7 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
 						bca->setPhiBound(phiL, phiH);
                         bca->setCompressible(compressible);
                         bca->setBcArray(bcArray);
-                        bcProcessor->addBC(bca);
+                        bcSet->addBC(bca);
                      }
                   }
                }
@@ -139,9 +139,9 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
    }
 }
 //////////////////////////////////////////////////////////////////////////
-void MultiphaseBoundaryConditionsBlockVisitor::addBC(SPtr<BCAdapter> bc)
+void MultiphaseBoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
 {
-   bcMap.insert(std::make_pair(bc->getBcAlgorithmType(), bc->getAlgorithm()));
+   bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getAlgorithm()));
 }
 
 
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
similarity index 95%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
index e6cbc69c8bb2431e552d01210c73e450661961c3..cc04246d411dfc91f225598c269c1a10893817f5 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
@@ -37,8 +37,8 @@
 #include "Block3DVisitor.h"
 #include <map>
 
-class BCAdapter;
-class BCAlgorithm;
+class BC;
+class BCStrategy;
 
 class MultiphaseBoundaryConditionsBlockVisitor : public Block3DVisitor
 {
@@ -47,9 +47,9 @@ public:
    virtual ~MultiphaseBoundaryConditionsBlockVisitor();
    
    void visit(SPtr<Grid3D> grid, SPtr<Block3D> block);
-   void addBC(SPtr<BCAdapter> bc);
+   void addBC(SPtr<BC> bc);
 protected:
 private:
-   std::map<char, SPtr<BCAlgorithm>> bcMap;
+   std::map<char, SPtr<BCStrategy>> bcMap;
 };
 #endif // MultiphaseBoundaryConditionsBlockVisitor_h__
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp b/src/cpu/MultiphaseFlow/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
index fc57572c9183f7ba23701d37703fa0c900e1ccc4..3588e502583fd1a60ffa7a8113bc8c6eeb2fac69 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
@@ -33,7 +33,7 @@
 
 #include "MultiphaseInitDistributionsBlockVisitor.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
@@ -174,7 +174,7 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt
 		if (!kernel)
 			throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString());
 
-		SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+		SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
         SPtr<EsoTwist3D> distributionsF = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getFdistributions()); 
 		SPtr<EsoTwist3D> distributionsH = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getHdistributions());
         SPtr<EsoTwist3D> distributionsH2 = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getH2distributions());
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h b/src/cpu/MultiphaseFlow/Visitors/MultiphaseInitDistributionsBlockVisitor.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseInitDistributionsBlockVisitor.h
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp b/src/cpu/MultiphaseFlow/Visitors/MultiphaseSetKernelBlockVisitor.cpp
similarity index 89%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseSetKernelBlockVisitor.cpp
index 8885b09ea0e19d56bce205334263a7b5c1f16313..04590a0d9e6700720bd3addc824ec4eb04fd94a3 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseSetKernelBlockVisitor.cpp
@@ -58,24 +58,24 @@ void MultiphaseSetKernelBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> blo
 
 				newKernel->setDataSet(dataSet);
 
-				SPtr<BCProcessor> bcProc = block->getKernel()->getBCProcessor();
+				SPtr<BCSet> bcProc = block->getKernel()->getBCSet();
 				if (!bcProc)
 				{
-					UB_THROW(UbException(UB_EXARGS, "It is not possible to change a BCProcessor in kernel! Old BCProcessor is not exist!"));
+					UB_THROW(UbException(UB_EXARGS, "It is not possible to change a BCSet in kernel! Old BCSet is not exist!"));
 				}
-				newKernel->setBCProcessor(bcProc);
+				newKernel->setBCSet(bcProc);
 				block->setKernel(newKernel);
 			}
 			break;
 
 		case MultiphaseSetKernelBlockVisitor::ChangeKernelWithData:
 			{
-				SPtr<BCProcessor> bcProc = block->getKernel()->getBCProcessor();
+				SPtr<BCSet> bcProc = block->getKernel()->getBCSet();
 				if (!bcProc)
 				{
-					UB_THROW(UbException(UB_EXARGS, "It is not possible to change a BCProcessor in kernel! Old BCProcessor is not exist!"));
+					UB_THROW(UbException(UB_EXARGS, "It is not possible to change a BCSet in kernel! Old BCSet is not exist!"));
 				}
-				newKernel->setBCProcessor(bcProc);
+				newKernel->setBCSet(bcProc);
 				block->setKernel(newKernel);
 			}
 			break;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h b/src/cpu/MultiphaseFlow/Visitors/MultiphaseSetKernelBlockVisitor.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseSetKernelBlockVisitor.h
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp b/src/cpu/MultiphaseFlow/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
index 0c3fd6de0de70a3506cc2a9a00be80c267ad538a..1ba1863af98cdff2967a43985d0314b8d827e0cc 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
@@ -33,7 +33,7 @@
 
 #include "MultiphaseVelocityFormInitDistributionsBlockVisitor.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
@@ -178,7 +178,7 @@ void MultiphaseVelocityFormInitDistributionsBlockVisitor::visit(const SPtr<Grid3
 		if (!kernel)
 			throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString());
 
-		SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+		SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
         SPtr<EsoTwist3D> distributionsF = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getFdistributions()); 
 		SPtr<EsoTwist3D> distributionsH = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getHdistributions());
         SPtr<EsoTwist3D> distributionsH2 = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getH2distributions());
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h b/src/cpu/MultiphaseFlow/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h
rename to src/cpu/MultiphaseFlow/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyBinghamModelNoSlipBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
similarity index 77%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyBinghamModelNoSlipBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
index 45c9c0c21dba308862c8d4a8c1c1827a4a07e7c7..24c96da39c87a156574327fb92ad758d2025e639 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyBinghamModelNoSlipBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
@@ -26,29 +26,29 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyBinghamModelNoSlipBCAlgorithm.h
+//! \file RheologyBinghamModelNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef RheologyBinghamModelNoSlipBCAlgorithm_h__
-#define RheologyBinghamModelNoSlipBCAlgorithm_h__
+#ifndef RheologyBinghamModelNoSlipBCStrategy_h__
+#define RheologyBinghamModelNoSlipBCStrategy_h__
 
-#include "RheologyNoSlipBCAlgorithm.h"
-#include "Rheology.h"
+#include "RheologyNoSlipBCStrategy.h"
+#include "cpu/NonNewtonianFluids/LBM/Rheology.h"
 
-class RheologyBinghamModelNoSlipBCAlgorithm : public RheologyNoSlipBCAlgorithm
+class RheologyBinghamModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 {
 public:
-   RheologyBinghamModelNoSlipBCAlgorithm()
+   RheologyBinghamModelNoSlipBCStrategy()
    {
-      BCAlgorithm::type = BCAlgorithm::RheologyBinghamModelNoSlipBCAlgorithm;
-      BCAlgorithm::preCollision = true;
+      BCStrategy::type = BCStrategy::RheologyBinghamModelNoSlipBCStrategy;
+      BCStrategy::preCollision = true;
    }
-   ~RheologyBinghamModelNoSlipBCAlgorithm() {}
-   SPtr<BCAlgorithm> clone() override
+   ~RheologyBinghamModelNoSlipBCStrategy() {}
+   SPtr<BCStrategy> clone() override
    {
-      SPtr<BCAlgorithm> bc(new RheologyBinghamModelNoSlipBCAlgorithm());
+      SPtr<BCStrategy> bc(new RheologyBinghamModelNoSlipBCStrategy());
       return bc;
    }
 protected:
@@ -57,4 +57,4 @@ protected:
       return Rheology::getBinghamCollFactor(omegaInf, shearRate, drho);
    }
 };
-#endif // BinghamModelNoSlipBCAlgorithm_h__
+#endif // BinghamModelNoSlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyBinghamModelVelocityBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
similarity index 77%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyBinghamModelVelocityBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
index 2837238c40ec02bffe7a8eccb4fedb5100846d55..bbff469c0ebef26eaf57859d56e4bd27c39b358a 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyBinghamModelVelocityBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
@@ -26,29 +26,29 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyBinghamModelVelocityBCAlgorithm.h
+//! \file RheologyBinghamModelVelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef BinghamModelVelocityBCAlgorithm_h__
-#define BinghamModelVelocityBCAlgorithm_h__
+#ifndef BinghamModelVelocityBCStrategy_h__
+#define BinghamModelVelocityBCStrategy_h__
 
-#include "RheologyVelocityBCAlgorithm.h"
-#include "Rheology.h"
+#include "RheologyVelocityBCStrategy.h"
+#include "cpu/NonNewtonianFluids/LBM/Rheology.h"
 
-class RheologyBinghamModelVelocityBCAlgorithm : public RheologyVelocityBCAlgorithm
+class RheologyBinghamModelVelocityBCStrategy : public RheologyVelocityBCStrategy
 {
 public:
-   RheologyBinghamModelVelocityBCAlgorithm()
+   RheologyBinghamModelVelocityBCStrategy()
    {
-      BCAlgorithm::type = BCAlgorithm::RheologyBinghamModelVelocityBCAlgorithm;
-      BCAlgorithm::preCollision = true;
+      BCStrategy::type = BCStrategy::RheologyBinghamModelVelocityBCStrategy;
+      BCStrategy::preCollision = true;
    }
-   ~RheologyBinghamModelVelocityBCAlgorithm() {}
-   SPtr<BCAlgorithm> clone() override
+   ~RheologyBinghamModelVelocityBCStrategy() {}
+   SPtr<BCStrategy> clone() override
    {
-      SPtr<BCAlgorithm> bc(new RheologyBinghamModelVelocityBCAlgorithm());
+      SPtr<BCStrategy> bc(new RheologyBinghamModelVelocityBCStrategy());
       return bc;
    }
 protected:
@@ -57,4 +57,4 @@ protected:
       return Rheology::getBinghamCollFactor(omegaInf, shearRate, drho);
    }
 };
-#endif // BinghamModelVelocityBCAlgorithm_h__
+#endif // BinghamModelVelocityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
similarity index 76%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
index c9b76b563dd16044ee109acbdc8eff73cde95959..c29c6e9cebc3092358369bc16c5bfe5b65215ea9 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
@@ -26,28 +26,28 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyHerschelBulkleyModelNoSlipBCAlgorithm.h
+//! \file RheologyHerschelBulkleyModelNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef RheologyHerschelBulkleyModelNoSlipBCAlgorithm_h__
-#define RheologyHerschelBulkleyModelNoSlipBCAlgorithm_h__
+#ifndef RheologyHerschelBulkleyModelNoSlipBCStrategy_h__
+#define RheologyHerschelBulkleyModelNoSlipBCStrategy_h__
 
-#include "RheologyNoSlipBCAlgorithm.h"
-#include "Rheology.h"
+#include "RheologyNoSlipBCStrategy.h"
+#include "cpu/NonNewtonianFluids/LBM/Rheology.h"
 
-class RheologyHerschelBulkleyModelNoSlipBCAlgorithm : public RheologyNoSlipBCAlgorithm
+class RheologyHerschelBulkleyModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 {
 public:
-   RheologyHerschelBulkleyModelNoSlipBCAlgorithm() 
+   RheologyHerschelBulkleyModelNoSlipBCStrategy() 
    {
-      BCAlgorithm::type = BCAlgorithm::RheologyHerschelBulkleyModelNoSlipBCAlgorithm;
-      BCAlgorithm::preCollision = true;
+      BCStrategy::type = BCStrategy::RheologyHerschelBulkleyModelNoSlipBCStrategy;
+      BCStrategy::preCollision = true;
    }
-   ~RheologyHerschelBulkleyModelNoSlipBCAlgorithm() {}
-   SPtr<BCAlgorithm> clone() override
+   ~RheologyHerschelBulkleyModelNoSlipBCStrategy() {}
+   SPtr<BCStrategy> clone() override
    {
-      SPtr<BCAlgorithm> bc(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm());
+      SPtr<BCStrategy> bc(new RheologyHerschelBulkleyModelNoSlipBCStrategy());
       return bc;
    }
 protected:
@@ -56,4 +56,4 @@ protected:
       return Rheology::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
    }
 };
-#endif // RheologyHerschelBulkleyModelNoSlipBCAlgorithm_h__
\ No newline at end of file
+#endif // RheologyHerschelBulkleyModelNoSlipBCStrategy_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyNoSlipBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.cpp
similarity index 91%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyNoSlipBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.cpp
index 73bf54ad7eccbd42deb2454fa5d0a060cf6b5c15..3765a58743c4702741e815e28aade64007e13494 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyNoSlipBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.cpp
@@ -26,21 +26,21 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyNoSlipBCAlgorithm.cpp
+//! \file RheologyNoSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "RheologyNoSlipBCAlgorithm.h"
+#include "RheologyNoSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
 //////////////////////////////////////////////////////////////////////////
-void RheologyNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void RheologyNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void RheologyNoSlipBCAlgorithm::applyBC()
+void RheologyNoSlipBCStrategy::applyBC()
 {
    real f[D3Q27System::ENDF + 1];
    real feq[D3Q27System::ENDF + 1];
@@ -59,7 +59,7 @@ void RheologyNoSlipBCAlgorithm::applyBC()
          //quadratic bounce back
          const int invDir = D3Q27System::INVDIR[fDir];
          real q = bcPtr->getQ(invDir);
-         real fReturn =(f[invDir] + q * f[fDir] + q * collFactorF * (feq[invDir] - f[invDir] + feq[fDir] - f[fDir])) / (1.0 + q);
+         real fReturn =(f[invDir] + q * f[fDir] + q * collFactorF * (feq[invDir] - f[invDir] + feq[fDir] - f[fDir])) / (vf::lbm::constant::c1o1 + q);
          distributions->setDistributionInvForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], invDir);
       }
    }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyNoSlipBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyNoSlipBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
index c8c38ad7fcf3e35378b1e5dd14938cdad230f185..611d87bcd3b6e275869b6ec430b7a1f349c0aa3e 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyNoSlipBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
@@ -26,27 +26,27 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyNoSlipBCAlgorithm.h
+//! \file RheologyNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef RheologyNoSlipBCAlgorithm_h__
-#define RheologyNoSlipBCAlgorithm_h__
+#ifndef RheologyNoSlipBCStrategy_h__
+#define RheologyNoSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class RheologyNoSlipBCAlgorithm : public BCAlgorithm
+class RheologyNoSlipBCStrategy : public BCStrategy
 {
 public:
-   RheologyNoSlipBCAlgorithm() = default;
-   ~RheologyNoSlipBCAlgorithm() = default;
-   virtual SPtr<BCAlgorithm> clone() override { UB_THROW(UbException("real clone() - belongs in the derived class")); }
+   RheologyNoSlipBCStrategy() = default;
+   ~RheologyNoSlipBCStrategy() = default;
+   virtual SPtr<BCStrategy> clone() override { UB_THROW(UbException("real clone() - belongs in the derived class")); }
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void applyBC() override;
 protected:
    virtual real getRheologyCollFactor(real omegaInf, real shearRate, real drho) const = 0; // { UB_THROW(UbException("real getRheologyCollFactor() - belongs in the derived class")); }
 };
-#endif // RheologyNoSlipBCAlgorithm_h__
+#endif // RheologyNoSlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyPowellEyringModelNoSlipBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
similarity index 76%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyPowellEyringModelNoSlipBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
index a6a3a5a745f193d66f2d87303ab5df1fd62826eb..f867ab1dc2df84bb8498728295a1f6d7cf734d83 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyPowellEyringModelNoSlipBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
@@ -26,28 +26,28 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyPowellEyringModelNoSlipBCAlgorithm.h
+//! \file RheologyPowellEyringModelNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef RheologyPowellEyringModelNoSlipBCAlgorithm_h__
-#define RheologyPowellEyringModelNoSlipBCAlgorithm_h__
+#ifndef RheologyPowellEyringModelNoSlipBCStrategy_h__
+#define RheologyPowellEyringModelNoSlipBCStrategy_h__
 
-#include "RheologyNoSlipBCAlgorithm.h"
-#include "Rheology.h"
+#include "RheologyNoSlipBCStrategy.h"
+#include "cpu/NonNewtonianFluids/LBM/Rheology.h"
 
-class RheologyPowellEyringModelNoSlipBCAlgorithm : public RheologyNoSlipBCAlgorithm
+class RheologyPowellEyringModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 {
 public:
-   RheologyPowellEyringModelNoSlipBCAlgorithm() 
+   RheologyPowellEyringModelNoSlipBCStrategy() 
    {
-      BCAlgorithm::type = BCAlgorithm::RheologyPowellEyringModelNoSlipBCAlgorithm;
-      BCAlgorithm::preCollision = true;
+      BCStrategy::type = BCStrategy::RheologyPowellEyringModelNoSlipBCStrategy;
+      BCStrategy::preCollision = true;
    }
-   ~RheologyPowellEyringModelNoSlipBCAlgorithm() {}
-   SPtr<BCAlgorithm> clone() override
+   ~RheologyPowellEyringModelNoSlipBCStrategy() {}
+   SPtr<BCStrategy> clone() override
    {
-      SPtr<BCAlgorithm> bc(new RheologyPowellEyringModelNoSlipBCAlgorithm());
+      SPtr<BCStrategy> bc(new RheologyPowellEyringModelNoSlipBCStrategy());
       return bc;
    }
 protected:
@@ -56,4 +56,4 @@ protected:
       return Rheology::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
    }
 };
-#endif // RheologyPowellEyringModelNoSlipBCAlgorithm_h__
\ No newline at end of file
+#endif // RheologyPowellEyringModelNoSlipBCStrategy_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyVelocityBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.cpp
similarity index 89%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyVelocityBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.cpp
index 5bc11cbb4cadc7b6e28fd163b8479413673c3b1c..817c86eed4b3a180b14464ec65975f1362265b20 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyVelocityBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.cpp
@@ -26,30 +26,30 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyVelocityBCAlgorithm.cpp
+//! \file RheologyVelocityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "RheologyVelocityBCAlgorithm.h"
+#include "RheologyVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-RheologyVelocityBCAlgorithm::RheologyVelocityBCAlgorithm()
+RheologyVelocityBCStrategy::RheologyVelocityBCStrategy()
 {
-   //BCAlgorithm::type = BCAlgorithm::RheologyVelocityBCAlgorithm;
-   //BCAlgorithm::preCollision = false;
+   //BCStrategy::type = BCStrategy::RheologyVelocityBCStrategy;
+   //BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-RheologyVelocityBCAlgorithm::~RheologyVelocityBCAlgorithm()
+RheologyVelocityBCStrategy::~RheologyVelocityBCStrategy()
 {
 }
 //////////////////////////////////////////////////////////////////////////
-void RheologyVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void RheologyVelocityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void RheologyVelocityBCAlgorithm::applyBC()
+void RheologyVelocityBCStrategy::applyBC()
 {
     using namespace vf::lbm::constant;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyVelocityBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyVelocityBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
index 91ac9ec574b9252c4d2842b9134d4190878d9daf..00c08230cf19fd73bfa56b7949239e62be72fbd4 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologyVelocityBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
@@ -26,29 +26,29 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file RheologyVelocityBCAlgorithm.h
+//! \file RheologyVelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef RheologyVelocityBCAlgorithm_h__
-#define RheologyVelocityBCAlgorithm_h__
+#ifndef RheologyVelocityBCStrategy_h__
+#define RheologyVelocityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class RheologyVelocityBCAlgorithm : public BCAlgorithm
+class RheologyVelocityBCStrategy : public BCStrategy
 {
 public:
-   RheologyVelocityBCAlgorithm();
-   ~RheologyVelocityBCAlgorithm();
-   virtual SPtr<BCAlgorithm> clone() override { UB_THROW(UbException("real clone() - belongs in the derived class")); }
+   RheologyVelocityBCStrategy();
+   ~RheologyVelocityBCStrategy();
+   virtual SPtr<BCStrategy> clone() override { UB_THROW(UbException("real clone() - belongs in the derived class")); }
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void applyBC() override;
 protected:
    virtual real getRheologyCollFactor(real omegaInf, real shearRate, real drho) const = 0; // { UB_THROW(UbException("real getRheologyCollFactor() - belongs in the derived class")); }
 };
 
-#endif // RheologyVelocityBCAlgorithm_h__
+#endif // RheologyVelocityBCStrategy_h__
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
similarity index 84%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
index ebdf07f25ba489a87b637646271171bdc6de6d58..70981c5d0e4178eb0b58ac807305635be5a7fdfd 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
@@ -26,51 +26,51 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyDensityBCAlgorithm.cpp
+//! \file ThixotropyDensityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "ThixotropyDensityBCAlgorithm.h"
+#include "ThixotropyDensityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-ThixotropyDensityBCAlgorithm::ThixotropyDensityBCAlgorithm()
+ThixotropyDensityBCStrategy::ThixotropyDensityBCStrategy()
 {
-	BCAlgorithm::type = BCAlgorithm::ThixotropyDensityBCAlgorithm;
-	BCAlgorithm::preCollision = false;
-	BCAlgorithm::thixotropy = true;
+	BCStrategy::type = BCStrategy::ThixotropyDensityBCStrategy;
+	BCStrategy::preCollision = false;
+	BCStrategy::thixotropy = true;
 	lambdaBC = 0.0;
 }
 //////////////////////////////////////////////////////////////////////////
-ThixotropyDensityBCAlgorithm::~ThixotropyDensityBCAlgorithm()
+ThixotropyDensityBCStrategy::~ThixotropyDensityBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> ThixotropyDensityBCAlgorithm::clone()
+SPtr<BCStrategy> ThixotropyDensityBCStrategy::clone()
 {
-	SPtr<BCAlgorithm> bc(new ThixotropyDensityBCAlgorithm());
-	dynamicPointerCast<ThixotropyDensityBCAlgorithm>(bc)->setLambdaBC(lambdaBC);
+	SPtr<BCStrategy> bc(new ThixotropyDensityBCStrategy());
+	dynamicPointerCast<ThixotropyDensityBCStrategy>(bc)->setLambdaBC(lambdaBC);
 	return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void ThixotropyDensityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
 	this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-//void ThixotropyDensityBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions)
+//void ThixotropyDensityBCStrategy::addDistributionsF(DistributionArray3DPtr distributions)
 //{
 //	this->distributionsf = distributions;
 //}
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyDensityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+void ThixotropyDensityBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributions)
 {
 	this->distributionsH = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyDensityBCAlgorithm::applyBC()
+void ThixotropyDensityBCStrategy::applyBC()
 {
 	using namespace vf::lbm::dir;
     using namespace D3Q27System;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
index 2b83eed0ef9720b247751011e4d49d70df4b5e71..a40500fe5b9e5ca2136bba71e3723e75db33bd50 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
@@ -26,23 +26,23 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyDensityBCAlgorithm.h
+//! \file ThixotropyDensityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef ThixotropyDensityBCAlgorithm_h__
-#define ThixotropyDensityBCAlgorithm_h__
+#ifndef ThixotropyDensityBCStrategy_h__
+#define ThixotropyDensityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
 
-class ThixotropyDensityBCAlgorithm : public BCAlgorithm
+class ThixotropyDensityBCStrategy : public BCStrategy
 {
 public:
-	ThixotropyDensityBCAlgorithm();
-	virtual ~ThixotropyDensityBCAlgorithm();
-	SPtr<BCAlgorithm> clone();
+	ThixotropyDensityBCStrategy();
+	virtual ~ThixotropyDensityBCStrategy();
+	SPtr<BCStrategy> clone();
 	void addDistributions(SPtr<DistributionArray3D> distributions);
 	//void addDistributionsF(SPtr<DistributionArray3D> distributions);
 	void addDistributionsH(SPtr<DistributionArray3D> distributions);
@@ -54,5 +54,5 @@ protected:
 private:
 	real lambdaBC;
 };
-#endif // ThixotropyDensityBCAlgorithm_h__
+#endif // ThixotropyDensityBCStrategy_h__
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
similarity index 76%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
index e973a0091ea12db88e21052c3addc8fa4db8e995..4a1b4016763d222138f38916f62fe6c257b4c537 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
@@ -26,49 +26,49 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyNoSlipBCAlgorithm.cpp
+//! \file ThixotropyNoSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "ThixotropyNoSlipBCAlgorithm.h"
+#include "ThixotropyNoSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-ThixotropyNoSlipBCAlgorithm::ThixotropyNoSlipBCAlgorithm()
+ThixotropyNoSlipBCStrategy::ThixotropyNoSlipBCStrategy()
 {
-	BCAlgorithm::type = BCAlgorithm::ThixotropyNoSlipBCAlgorithm;
-	BCAlgorithm::preCollision = false;
-	BCAlgorithm::thixotropy = true;
+	BCStrategy::type = BCStrategy::ThixotropyNoSlipBCStrategy;
+	BCStrategy::preCollision = false;
+	BCStrategy::thixotropy = true;
 	
 }
 //////////////////////////////////////////////////////////////////////////
-ThixotropyNoSlipBCAlgorithm::~ThixotropyNoSlipBCAlgorithm()
+ThixotropyNoSlipBCStrategy::~ThixotropyNoSlipBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> ThixotropyNoSlipBCAlgorithm::clone()
+SPtr<BCStrategy> ThixotropyNoSlipBCStrategy::clone()
 {
-	SPtr<BCAlgorithm> bc(new ThixotropyNoSlipBCAlgorithm());
+	SPtr<BCStrategy> bc(new ThixotropyNoSlipBCStrategy());
 	return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void ThixotropyNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
 	this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-//void ThixotropyNoSlipBCAlgorithm::addDistributionsF(SPtr<DistributionArray3D> distributions)
+//void ThixotropyNoSlipBCStrategy::addDistributionsF(SPtr<DistributionArray3D> distributions)
 //{
 //	this->distributionsf = distributions;
 //}
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyNoSlipBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+void ThixotropyNoSlipBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributions)
 {
 	this->distributionsH = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyNoSlipBCAlgorithm::applyBC()
+void ThixotropyNoSlipBCStrategy::applyBC()
 {
 	real f[D3Q27System::ENDF + 1];
 	real feq[D3Q27System::ENDF + 1];
@@ -91,8 +91,8 @@ void ThixotropyNoSlipBCAlgorithm::applyBC()
 			//quadratic bounce back
 			const int invDir = D3Q27System::INVDIR[fdir];
 			real q = bcPtr->getQ(invDir);
-			real fReturnf = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) + ((q / (1.0 + q))*(f[invDir] + f[fdir]));
-			real fReturnh = ((1.0 - q) / (1.0 + q))*((h[invDir] - heq[invDir]) / (1.0 - collFactor) + heq[invDir]) + ((q / (1.0 + q))*(h[invDir] + h[fdir]));
+			real fReturnf = ((vf::lbm::constant::c1o1 - q) / (vf::lbm::constant::c1o1 + q))*((f[invDir] - feq[invDir]) / (vf::lbm::constant::c1o1 - collFactor) + feq[invDir]) + ((q / (vf::lbm::constant::c1o1 + q))*(f[invDir] + f[fdir]));
+			real fReturnh = ((vf::lbm::constant::c1o1 - q) / (vf::lbm::constant::c1o1 + q))*((h[invDir] - heq[invDir]) / (vf::lbm::constant::c1o1 - collFactor) + heq[invDir]) + ((q / (vf::lbm::constant::c1o1 + q))*(h[invDir] + h[fdir]));
 
 			distributions->setDistributionForDirection(fReturnf, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
 			distributionsH->setDistributionForDirection(fReturnh, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
index e3e0ebc348909bd7152cdcbb9d1ede2253c80497..edd8952333f9607429e78ea917edf360768743c7 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
@@ -26,21 +26,21 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyNoSlipBCAlgorithm.h
+//! \file ThixotropyNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef ThixotropyNoSlipBCAlgorithm_h__
-#define ThixotropyNoSlipBCAlgorithm_h__
+#ifndef ThixotropyNoSlipBCStrategy_h__
+#define ThixotropyNoSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
-class ThixotropyNoSlipBCAlgorithm : public BCAlgorithm
+class ThixotropyNoSlipBCStrategy : public BCStrategy
 {
 public:
-	ThixotropyNoSlipBCAlgorithm();
-	virtual ~ThixotropyNoSlipBCAlgorithm();
-	SPtr<BCAlgorithm> clone();
+	ThixotropyNoSlipBCStrategy();
+	virtual ~ThixotropyNoSlipBCStrategy();
+	SPtr<BCStrategy> clone();
 	void addDistributions(SPtr<DistributionArray3D> distributions);
 	//void addDistributionsF(DistributionArray3DPtr distributions);
 	void addDistributionsH(SPtr<DistributionArray3D> distributions);
@@ -50,5 +50,5 @@ protected:
 private:
 
 };
-#endif // ThixotropyNoSlipBCAlgorithm_h__
+#endif // ThixotropyNoSlipBCStrategy_h__
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
similarity index 54%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
index 8124520338db470a080df868df39df0b8b9d66ed..f93e315c3be4e10daf1684b648bfe8ce9d06b3be 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
@@ -26,51 +26,52 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyNonReflectingOutflowBCAlgorithm.cpp
+//! \file ThixotropyNonReflectingOutflowBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "ThixotropyNonReflectingOutflowBCAlgorithm.h"
+#include "ThixotropyNonReflectingOutflowBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-ThixotropyNonReflectingOutflowBCAlgorithm::ThixotropyNonReflectingOutflowBCAlgorithm()
+ThixotropyNonReflectingOutflowBCStrategy::ThixotropyNonReflectingOutflowBCStrategy()
 {
-	BCAlgorithm::type = BCAlgorithm::ThixotropyNonReflectingOutflowBCAlgorithm;
-	BCAlgorithm::preCollision = true;
-	BCAlgorithm::thixotropy = true;
+	BCStrategy::type = BCStrategy::ThixotropyNonReflectingOutflowBCStrategy;
+	BCStrategy::preCollision = true;
+	BCStrategy::thixotropy = true;
 }
 //////////////////////////////////////////////////////////////////////////
-ThixotropyNonReflectingOutflowBCAlgorithm::~ThixotropyNonReflectingOutflowBCAlgorithm()
+ThixotropyNonReflectingOutflowBCStrategy::~ThixotropyNonReflectingOutflowBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> ThixotropyNonReflectingOutflowBCAlgorithm::clone()
+SPtr<BCStrategy> ThixotropyNonReflectingOutflowBCStrategy::clone()
 {
-	SPtr<BCAlgorithm> bc(new ThixotropyNonReflectingOutflowBCAlgorithm());
+	SPtr<BCStrategy> bc(new ThixotropyNonReflectingOutflowBCStrategy());
 	return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyNonReflectingOutflowBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void ThixotropyNonReflectingOutflowBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
 	this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-//void ThixotropyNonReflectingOutflowBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions)
+//void ThixotropyNonReflectingOutflowBCStrategy::addDistributionsF(DistributionArray3DPtr distributions)
 //{
 //	this->distributionsf = distributions;
 //}
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyNonReflectingOutflowBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+void ThixotropyNonReflectingOutflowBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributions)
 {
 	this->distributionsH = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
+void ThixotropyNonReflectingOutflowBCStrategy::applyBC()
 {
    using namespace vf::lbm::dir;
    using namespace D3Q27System;
+   using namespace vf::lbm::constant;
 
    real f[ENDF + 1];
    real ftemp[ENDF + 1];
@@ -97,16 +98,16 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
 
    switch (direction)
    {
-   case DIR_P00:
-      f[DIR_P00] = ftemp[DIR_P00] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_P00];
-      f[DIR_PP0] = ftemp[DIR_PP0] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PP0];
-      f[DIR_PM0] = ftemp[DIR_PM0] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PM0];
-      f[DIR_P0P] = ftemp[DIR_P0P] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_P0P];
-      f[DIR_P0M] = ftemp[DIR_P0M] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_P0M];
-      f[DIR_PPP] = ftemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PPP];
-      f[DIR_PMP] = ftemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PMP];
-      f[DIR_PPM] = ftemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PPM];
-      f[DIR_PMM] = ftemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PMM];
+      case DIR_P00:
+      f[DIR_P00] = ftemp[DIR_P00] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P00];
+      f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PP0];
+      f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PM0];
+      f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P0P];
+      f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P0M];
+      f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PPP];
+      f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PMP];
+      f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PPM];
+      f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PMM];
 
       distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
       distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -119,15 +120,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
       break;
    case DIR_M00:
-      f[DIR_M00] = ftemp[DIR_M00] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_M00];
-      f[DIR_MP0] = ftemp[DIR_MP0] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MP0];
-      f[DIR_MM0] = ftemp[DIR_MM0] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MM0];
-      f[DIR_M0P] = ftemp[DIR_M0P] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_M0P];
-      f[DIR_M0M] = ftemp[DIR_M0M] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_M0M];
-      f[DIR_MPP] = ftemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MPP];
-      f[DIR_MMP] = ftemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MMP];
-      f[DIR_MPM] = ftemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MPM];
-      f[DIR_MMM] = ftemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MMM];
+      f[DIR_M00] = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M00];
+      f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MP0];
+      f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MM0];
+      f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M0P];
+      f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M0M];
+      f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MPP];
+      f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MMP];
+      f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MPM];
+      f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MMM];
 
       distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
       distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
@@ -140,15 +141,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
    case DIR_0P0:
-      f[DIR_0P0] = ftemp[DIR_0P0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_0P0];
-      f[DIR_PP0] = ftemp[DIR_PP0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_PP0];
-      f[DIR_MP0] = ftemp[DIR_MP0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_MP0];
-      f[DIR_0PP] = ftemp[DIR_0PP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_0PP];
-      f[DIR_0PM] = ftemp[DIR_0PM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_0PM];
-      f[DIR_PPP] = ftemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_PPP];
-      f[DIR_MPP] = ftemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_MPP];
-      f[DIR_PPM] = ftemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_PPM];
-      f[DIR_MPM] = ftemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_MPM];
+      f[DIR_0P0] = ftemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0P0];
+      f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PP0];
+      f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MP0];
+      f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0PP];
+      f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0PM];
+      f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PPP];
+      f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MPP];
+      f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PPM];
+      f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MPM];
 
       distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
       distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -161,15 +162,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
       break;
    case DIR_0M0:
-      f[DIR_0M0] = ftemp[DIR_0M0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_0M0];
-      f[DIR_PM0] = ftemp[DIR_PM0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_PM0];
-      f[DIR_MM0] = ftemp[DIR_MM0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_MM0];
-      f[DIR_0MP] = ftemp[DIR_0MP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_0MP];
-      f[DIR_0MM] = ftemp[DIR_0MM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_0MM];
-      f[DIR_PMP] = ftemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_PMP];
-      f[DIR_MMP] = ftemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_MMP];
-      f[DIR_PMM] = ftemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_PMM];
-      f[DIR_MMM] = ftemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_MMM];
+      f[DIR_0M0] = ftemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0M0];
+      f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PM0];
+      f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MM0];
+      f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0MP];
+      f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0MM];
+      f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PMP];
+      f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MMP];
+      f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PMM];
+      f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MMM];
 
       distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
       distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
@@ -182,15 +183,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
    case DIR_00P:
-      f[DIR_00P] = ftemp[DIR_00P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_00P];
-      f[DIR_P0P] = ftemp[DIR_P0P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_P0P];
-      f[DIR_M0P] = ftemp[DIR_M0P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_M0P];
-      f[DIR_0PP] = ftemp[DIR_0PP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_0PP];
-      f[DIR_0MP] = ftemp[DIR_0MP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_0MP];
-      f[DIR_PPP] = ftemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_PPP];
-      f[DIR_MPP] = ftemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_MPP];
-      f[DIR_PMP] = ftemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_PMP];
-      f[DIR_MMP] = ftemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_MMP];
+      f[DIR_00P] = ftemp[DIR_00P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_00P];
+      f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_P0P];
+      f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_M0P];
+      f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_0PP];
+      f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_0MP];
+      f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_PPP];
+      f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_MPP];
+      f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_PMP];
+      f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_MMP];
 
       distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
       distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
@@ -203,15 +204,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
       break;
    case DIR_00M:
-      f[DIR_00M] = ftemp[DIR_00M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_00M];
-      f[DIR_P0M] = ftemp[DIR_P0M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_P0M];
-      f[DIR_M0M] = ftemp[DIR_M0M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_M0M];
-      f[DIR_0PM] = ftemp[DIR_0PM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_0PM];
-      f[DIR_0MM] = ftemp[DIR_0MM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_0MM];
-      f[DIR_PPM] = ftemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_PPM];
-      f[DIR_MPM] = ftemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_MPM];
-      f[DIR_PMM] = ftemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_PMM];
-      f[DIR_MMM] = ftemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_MMM];
+      f[DIR_00M] = ftemp[DIR_00M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_00M];
+      f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_P0M];
+      f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_M0M];
+      f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_0PM];
+      f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_0MM];
+      f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_PPM];
+      f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_MPM];
+      f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_PMM];
+      f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_MMM];
 
       distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
       distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
@@ -242,15 +243,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
    switch (direction)
    {
    case DIR_P00:
-      h[DIR_P00]  = htemp[DIR_P00] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_P00];
-      h[DIR_PP0] = htemp[DIR_PP0] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_PP0];
-      h[DIR_PM0] = htemp[DIR_PM0] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_PM0];
-      h[DIR_P0P] = htemp[DIR_P0P] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_P0P];
-      h[DIR_P0M] = htemp[DIR_P0M] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_P0M];
-      h[DIR_PPP] = htemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_PPP];
-      h[DIR_PMP] = htemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_PMP];
-      h[DIR_PPM] = htemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_PPM];
-      h[DIR_PMM] = htemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * h[DIR_PMM];
+      h[DIR_P00]  = htemp[DIR_P00] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_P00];
+      h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PP0];
+      h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PM0];
+      h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_P0P];
+      h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_P0M];
+      h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PPP];
+      h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PMP];
+      h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PPM];
+      h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * h[DIR_PMM];
 
       distributionsH->setDistributionInvForDirection(h[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
       distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -263,15 +264,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
       break;
    case DIR_M00:
-      h[DIR_M00] = htemp[DIR_M00] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_M00];
-      h[DIR_MP0] = htemp[DIR_MP0] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_MP0];
-      h[DIR_MM0] = htemp[DIR_MM0] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_MM0];
-      h[DIR_M0P] = htemp[DIR_M0P] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_M0P];
-      h[DIR_M0M] = htemp[DIR_M0M] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_M0M];
-      h[DIR_MPP] = htemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_MPP];
-      h[DIR_MMP] = htemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_MMP];
-      h[DIR_MPM] = htemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_MPM];
-      h[DIR_MMM] = htemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * h[DIR_MMM];
+      h[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_M00];
+      h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MP0];
+      h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MM0];
+      h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_M0P];
+      h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_M0M];
+      h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MPP];
+      h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MMP];
+      h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MPM];
+      h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * h[DIR_MMM];
 
       distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
       distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
@@ -284,15 +285,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
    case DIR_0P0:
-      h[DIR_0P0] = htemp[DIR_0P0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_0P0];
-      h[DIR_PP0] = htemp[DIR_PP0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_PP0];
-      h[DIR_MP0] = htemp[DIR_MP0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_MP0];
-      h[DIR_0PP] = htemp[DIR_0PP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_0PP];
-      h[DIR_0PM] = htemp[DIR_0PM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_0PM];
-      h[DIR_PPP] = htemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_PPP];
-      h[DIR_MPP] = htemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_MPP];
-      h[DIR_PPM] = htemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_PPM];
-      h[DIR_MPM] = htemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * h[DIR_MPM];
+      h[DIR_0P0] = htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_0P0];
+      h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_PP0];
+      h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_MP0];
+      h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_0PP];
+      h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_0PM];
+      h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_PPP];
+      h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_MPP];
+      h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_PPM];
+      h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * h[DIR_MPM];
 
       distributionsH->setDistributionInvForDirection(h[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
       distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -305,15 +306,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
       break;
    case DIR_0M0:
-      h[DIR_0M0] = htemp[DIR_0M0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_0M0];
-      h[DIR_PM0] = htemp[DIR_PM0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_PM0];
-      h[DIR_MM0] = htemp[DIR_MM0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_MM0];
-      h[DIR_0MP] = htemp[DIR_0MP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_0MP];
-      h[DIR_0MM] = htemp[DIR_0MM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_0MM];
-      h[DIR_PMP] = htemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_PMP];
-      h[DIR_MMP] = htemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_MMP];
-      h[DIR_PMM] = htemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_PMM];
-      h[DIR_MMM] = htemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * h[DIR_MMM];
+      h[DIR_0M0] = htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_0M0];
+      h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_PM0];
+      h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_MM0];
+      h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_0MP];
+      h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_0MM];
+      h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_PMP];
+      h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_MMP];
+      h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_PMM];
+      h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * h[DIR_MMM];
 
       distributionsH->setDistributionInvForDirection(h[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
       distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
@@ -326,15 +327,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
    case DIR_00P:
-      h[DIR_00P] = htemp[DIR_00P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_00P];
-      h[DIR_P0P] = htemp[DIR_P0P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_P0P];
-      h[DIR_M0P] = htemp[DIR_M0P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_M0P];
-      h[DIR_0PP] = htemp[DIR_0PP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_0PP];
-      h[DIR_0MP] = htemp[DIR_0MP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_0MP];
-      h[DIR_PPP] = htemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_PPP];
-      h[DIR_MPP] = htemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_MPP];
-      h[DIR_PMP] = htemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_PMP];
-      h[DIR_MMP] = htemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * h[DIR_MMP];
+      h[DIR_00P] = htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_00P];
+      h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_P0P];
+      h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_M0P];
+      h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_0PP];
+      h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_0MP];
+      h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_PPP];
+      h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_MPP];
+      h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_PMP];
+      h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * h[DIR_MMP];
 
       distributionsH->setDistributionInvForDirection(h[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
       distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
@@ -347,15 +348,15 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
       distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
       break;
    case DIR_00M:
-      h[DIR_00M] = htemp[DIR_00M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_00M];
-      h[DIR_P0M] = htemp[DIR_P0M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_P0M];
-      h[DIR_M0M] = htemp[DIR_M0M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_M0M];
-      h[DIR_0PM] = htemp[DIR_0PM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_0PM];
-      h[DIR_0MM] = htemp[DIR_0MM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_0MM];
-      h[DIR_PPM] = htemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_PPM];
-      h[DIR_MPM] = htemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_MPM];
-      h[DIR_PMM] = htemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_PMM];
-      h[DIR_MMM] = htemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * h[DIR_MMM];
+      h[DIR_00M] = htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_00M];
+      h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_P0M];
+      h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_M0M];
+      h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_0PM];
+      h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_0MM];
+      h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_PPM];
+      h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_MPM];
+      h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_PMM];
+      h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * h[DIR_MMM];
 
       distributionsH->setDistributionInvForDirection(h[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
       distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
index cabc67bd67111b873c9c62db748d1f04eb006c56..7ae90994a13ab1a0842a0abbad596d1762bd4927 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
@@ -26,22 +26,22 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyNonReflectingOutflowBCAlgorithm.h
+//! \file ThixotropyNonReflectingOutflowBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef ThixotropyNonReflectingOutflowBCAlgorithm_h__
-#define ThixotropyNonReflectingOutflowBCAlgorithm_h__
+#ifndef ThixotropyNonReflectingOutflowBCStrategy_h__
+#define ThixotropyNonReflectingOutflowBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
 
-class ThixotropyNonReflectingOutflowBCAlgorithm : public BCAlgorithm
+class ThixotropyNonReflectingOutflowBCStrategy : public BCStrategy
 {
 public:
-	ThixotropyNonReflectingOutflowBCAlgorithm();
-	virtual ~ThixotropyNonReflectingOutflowBCAlgorithm();
-	SPtr<BCAlgorithm> clone();
+	ThixotropyNonReflectingOutflowBCStrategy();
+	virtual ~ThixotropyNonReflectingOutflowBCStrategy();
+	SPtr<BCStrategy> clone();
 	void addDistributions(SPtr<DistributionArray3D> distributions);
 	//void addDistributionsF(SPtr<DistributionArray3D> distributions);
 	void addDistributionsH(SPtr<DistributionArray3D> distributions);
@@ -53,5 +53,5 @@ protected:
 private:
 	//LBMReal lambdaBC;
 };
-#endif // ThixotropyNonReflectingOutflowBCAlgorithm_h__
+#endif // ThixotropyNonReflectingOutflowBCStrategy_h__
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
similarity index 81%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
index 189f52fd3088392be0db5b144158ed97623beafe..08c23b723c2ce7dc16774365dfaf9b4b65f4aaff 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
@@ -26,50 +26,50 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyVelocityBCAlgorithm.cpp
+//! \file ThixotropyVelocityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "ThixotropyVelocityBCAlgorithm.h"
+#include "ThixotropyVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-ThixotropyVelocityBCAlgorithm::ThixotropyVelocityBCAlgorithm()
+ThixotropyVelocityBCStrategy::ThixotropyVelocityBCStrategy()
 {
-	BCAlgorithm::type = BCAlgorithm::ThixotropyVelocityBCAlgorithm;
-	BCAlgorithm::preCollision = false;
-	BCAlgorithm::thixotropy = true;
-	lambdaBC = 0.0;
+	BCStrategy::type = BCStrategy::ThixotropyVelocityBCStrategy;
+	BCStrategy::preCollision = false;
+	BCStrategy::thixotropy = true;
+	lambdaBC = vf::lbm::constant::c0o1;
 }
 //////////////////////////////////////////////////////////////////////////
-ThixotropyVelocityBCAlgorithm::~ThixotropyVelocityBCAlgorithm()
+ThixotropyVelocityBCStrategy::~ThixotropyVelocityBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> ThixotropyVelocityBCAlgorithm::clone()
+SPtr<BCStrategy> ThixotropyVelocityBCStrategy::clone()
 {
-	SPtr<BCAlgorithm> bc(new ThixotropyVelocityBCAlgorithm());
-	dynamicPointerCast<ThixotropyVelocityBCAlgorithm>(bc)->setLambdaBC(lambdaBC);
+	SPtr<BCStrategy> bc(new ThixotropyVelocityBCStrategy());
+	dynamicPointerCast<ThixotropyVelocityBCStrategy>(bc)->setLambdaBC(lambdaBC);
 	return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void ThixotropyVelocityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
 	this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-//void ThixotropyVelocityBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions)
+//void ThixotropyVelocityBCStrategy::addDistributionsF(DistributionArray3DPtr distributions)
 //{
 //	this->distributionsf = distributions;
 //}
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyVelocityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+void ThixotropyVelocityBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributions)
 {
 	this->distributionsH = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyVelocityBCAlgorithm::applyBC()
+void ThixotropyVelocityBCStrategy::applyBC()
 {
 	using namespace vf::lbm::dir;
 
@@ -84,7 +84,7 @@ void ThixotropyVelocityBCAlgorithm::applyBC()
 	calcMacrosFct(f, drho, vx1, vx2, vx3);
 	calcFeqFct(feq, drho, vx1, vx2, vx3);
 
-	rho = 1.0 + drho * compressibleFactor;
+	rho = vf::lbm::constant::c1o1 + drho * compressibleFactor;
 
 	//calcDiffusionMacrosFctPost(h, concentration, fl1, fl2, fl3, m100, collFactor);
 	real lambda = D3Q27System::getDensity(h);
@@ -127,7 +127,7 @@ void ThixotropyVelocityBCAlgorithm::applyBC()
 			const int invDir = D3Q27System::INVDIR[fdir];
 			real q = bcPtr->getQ(invDir);// m+m q=0 stabiler
 			real velocity = bcPtr->getBoundaryVelocity(invDir);
-			real fReturn = ((1.0 - q) / (1.0 + q)) * ((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) + ((q * (f[invDir] + f[fdir]) - velocity * rho) / (1.0 + q));
+			real fReturn = ((vf::lbm::constant::c1o1 - q) / (vf::lbm::constant::c1o1 + q)) * ((f[invDir] - feq[invDir]) / (vf::lbm::constant::c1o1 - collFactor) + feq[invDir]) + ((q * (f[invDir] + f[fdir]) - velocity * rho) / (vf::lbm::constant::c1o1 + q));
 			distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
 
 			real htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
index bea3b0a374a128f1de88b1ef3d6e75c0ad34190a..93cf6d2206efe942c57024e979ef9a4f970c2807 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
@@ -26,22 +26,22 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyVelocityBCAlgorithm.h
+//! \file ThixotropyVelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef ThixotropyVelocityBCAlgorithm_h__
-#define ThixotropyVelocityBCAlgorithm_h__
+#ifndef ThixotropyVelocityBCStrategy_h__
+#define ThixotropyVelocityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
 
-class ThixotropyVelocityBCAlgorithm : public BCAlgorithm
+class ThixotropyVelocityBCStrategy : public BCStrategy
 {
 public:
-	ThixotropyVelocityBCAlgorithm();
-	virtual ~ThixotropyVelocityBCAlgorithm();
-	SPtr<BCAlgorithm> clone();
+	ThixotropyVelocityBCStrategy();
+	virtual ~ThixotropyVelocityBCStrategy();
+	SPtr<BCStrategy> clone();
 	void addDistributions(SPtr<DistributionArray3D> distributions);
 	void addDistributionsH(SPtr<DistributionArray3D> distributions);
 	void applyBC();
@@ -52,5 +52,5 @@ protected:
 private:
 	real lambdaBC;
 };
-#endif // ThixotropyVelocityBCAlgorithm_h__
+#endif // ThixotropyVelocityBCStrategy_h__
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
similarity index 83%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
index 6c2622fc7838381de8fa94b12a97d35146b78b43..ea4fc700d0da6e465422a9ee9e319774e2bb66b7 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
@@ -26,43 +26,43 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyVelocityWithDensityBCAlgorithm.cpp
+//! \file ThixotropyVelocityWithDensityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "ThixotropyVelocityWithDensityBCAlgorithm.h"
+#include "ThixotropyVelocityWithDensityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BCArray3D.h"
 
-ThixotropyVelocityWithDensityBCAlgorithm::ThixotropyVelocityWithDensityBCAlgorithm()
+ThixotropyVelocityWithDensityBCStrategy::ThixotropyVelocityWithDensityBCStrategy()
 {
-   BCAlgorithm::type = BCAlgorithm::ThixotropyVelocityWithDensityBCAlgorithm;
-   BCAlgorithm::preCollision = false;
+   BCStrategy::type = BCStrategy::ThixotropyVelocityWithDensityBCStrategy;
+   BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-ThixotropyVelocityWithDensityBCAlgorithm::~ThixotropyVelocityWithDensityBCAlgorithm()
+ThixotropyVelocityWithDensityBCStrategy::~ThixotropyVelocityWithDensityBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> ThixotropyVelocityWithDensityBCAlgorithm::clone()
+SPtr<BCStrategy> ThixotropyVelocityWithDensityBCStrategy::clone()
 {
-   SPtr<BCAlgorithm> bc(new ThixotropyVelocityWithDensityBCAlgorithm());
-   dynamicPointerCast<ThixotropyVelocityWithDensityBCAlgorithm>(bc)->setLambdaBC(lambdaBC);
+   SPtr<BCStrategy> bc(new ThixotropyVelocityWithDensityBCStrategy());
+   dynamicPointerCast<ThixotropyVelocityWithDensityBCStrategy>(bc)->setLambdaBC(lambdaBC);
    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyVelocityWithDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void ThixotropyVelocityWithDensityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyVelocityWithDensityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+void ThixotropyVelocityWithDensityBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributions)
 {
    this->distributionsH = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThixotropyVelocityWithDensityBCAlgorithm::applyBC()
+void ThixotropyVelocityWithDensityBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
@@ -76,7 +76,7 @@ void ThixotropyVelocityWithDensityBCAlgorithm::applyBC()
    real rho, vx1, vx2, vx3, drho;
    calcMacrosFct(f, drho, vx1, vx2, vx3);
    
-   rho = 1.0+drho*compressibleFactor;
+   rho = vf::lbm::constant::c1o1+drho*compressibleFactor;
   
    ///////////////////////////////////////////////////////////////////
    // Rheology
@@ -116,7 +116,7 @@ void ThixotropyVelocityWithDensityBCAlgorithm::applyBC()
             const int invDir = D3Q27System::INVDIR[fdir];
             real velocity = bcPtr->getBoundaryVelocity(fdir);
 
-            real fReturn = (f[fdir] + f[invDir] - velocity*rho) / 2.0 - drho*D3Q27System::WEIGTH[invDir];
+            real fReturn = (f[fdir] + f[invDir] - velocity*rho) / vf::lbm::constant::c2o1 - drho*D3Q27System::WEIGTH[invDir];
             distributions->setDistributionForDirection(fReturn, nX1, nX2, nX3, invDir);
          }
       }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
similarity index 86%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.h
rename to src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
index d69e79a223e3db56cb6a37014bbf030183adf606..74d33efc0a1dbb693280665d0d27e541081b2fd3 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
@@ -26,27 +26,27 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThixotropyVelocityWithDensityBCAlgorithm.h
+//! \file ThixotropyVelocityWithDensityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef ThixotropyVelocityWithDensityBCAlgorithm_h__
-#define ThixotropyVelocityWithDensityBCAlgorithm_h__
+#ifndef ThixotropyVelocityWithDensityBCStrategy_h__
+#define ThixotropyVelocityWithDensityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
 //!  \brief Class implements Dirichlet boundary condition for velocity. Set density in system. It is used together with non reflecting outflow.  
 
-class ThixotropyVelocityWithDensityBCAlgorithm : public BCAlgorithm
+class ThixotropyVelocityWithDensityBCStrategy : public BCStrategy
 {
 public:
-   ThixotropyVelocityWithDensityBCAlgorithm();
-   ~ThixotropyVelocityWithDensityBCAlgorithm();
-   SPtr<BCAlgorithm> clone();
+   ThixotropyVelocityWithDensityBCStrategy();
+   ~ThixotropyVelocityWithDensityBCStrategy();
+   SPtr<BCStrategy> clone();
    void addDistributions(SPtr<DistributionArray3D> distributions);
    void addDistributionsH(SPtr<DistributionArray3D> distributions);
    void applyBC();
@@ -57,4 +57,4 @@ protected:
 private:
    real lambdaBC;
 };
-#endif // ThixotropyVelocityWithDensityBCAlgorithm_h__
+#endif // ThixotropyVelocityWithDensityBCStrategy_h__
diff --git a/src/cpu/NonNewtonianFluids/CMakeLists.txt b/src/cpu/NonNewtonianFluids/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..35765164bce5ce208f1c43fcc7345cbd77f4e999
--- /dev/null
+++ b/src/cpu/NonNewtonianFluids/CMakeLists.txt
@@ -0,0 +1 @@
+vf_add_library(PUBLIC_LINK VirtualFluidsCore)
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/Rheology.cpp b/src/cpu/NonNewtonianFluids/LBM/Rheology.cpp
similarity index 100%
rename from src/cpu/VirtualFluidsCore/LBM/Rheology.cpp
rename to src/cpu/NonNewtonianFluids/LBM/Rheology.cpp
diff --git a/src/cpu/VirtualFluidsCore/LBM/Rheology.h b/src/cpu/NonNewtonianFluids/LBM/Rheology.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/LBM/Rheology.h
rename to src/cpu/NonNewtonianFluids/LBM/Rheology.h
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyBinghamModelLBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/RheologyBinghamModelLBMKernel.h
similarity index 98%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyBinghamModelLBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyBinghamModelLBMKernel.h
index da51e6c4e11f67ff48efe7a34c7eeaf900e9e730..61ff8c86d65db9d36b0a6919927704ffc2618716 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyBinghamModelLBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyBinghamModelLBMKernel.h
@@ -50,7 +50,7 @@ public:
 		kernel->setNX(nx);
 		kernel->setCollisionFactor(collFactor);
 		dynamicPointerCast<RheologyBinghamModelLBMKernel>(kernel)->initDataSet();
-		kernel->setBCProcessor(bcProcessor->clone(kernel));
+		kernel->setBCSet(bcSet->clone(kernel));
 		kernel->setWithForcing(withForcing);
 		kernel->setForcingX1(muForcingX1);
 		kernel->setForcingX2(muForcingX2);
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyHerschelBulkleyModelLBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/RheologyHerschelBulkleyModelLBMKernel.h
similarity index 98%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyHerschelBulkleyModelLBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyHerschelBulkleyModelLBMKernel.h
index 2422efefd52cdbfac183a9fdd19b9b2f5a5fee70..55435e1b4c1243aaefd5f7f141ec2da84c594116 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyHerschelBulkleyModelLBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyHerschelBulkleyModelLBMKernel.h
@@ -49,7 +49,7 @@ public:
 		kernel->setNX(nx);
 		kernel->setCollisionFactor(collFactor);
 		dynamicPointerCast<RheologyHerschelBulkleyModelLBMKernel>(kernel)->initDataSet();
-		kernel->setBCProcessor(bcProcessor->clone(kernel));
+		kernel->setBCSet(bcSet->clone(kernel));
 		kernel->setWithForcing(withForcing);
 		kernel->setForcingX1(muForcingX1);
 		kernel->setForcingX2(muForcingX2);
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp b/src/cpu/NonNewtonianFluids/LBM/RheologyInterpolationProcessor.cpp
similarity index 100%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp
rename to src/cpu/NonNewtonianFluids/LBM/RheologyInterpolationProcessor.cpp
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.h b/src/cpu/NonNewtonianFluids/LBM/RheologyInterpolationProcessor.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyInterpolationProcessor.h
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.cpp b/src/cpu/NonNewtonianFluids/LBM/RheologyK17LBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.cpp
rename to src/cpu/NonNewtonianFluids/LBM/RheologyK17LBMKernel.cpp
index 81dfc86d12daa48d9b238097e4e82f907b64abfb..a85b63c9391b83f6b329dd56abc035c3f74d54a5 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.cpp
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyK17LBMKernel.cpp
@@ -71,7 +71,7 @@ SPtr<LBMKernel> RheologyK17LBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<RheologyK17LBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -126,7 +126,7 @@ void RheologyK17LBMKernel::calculate(int step)
    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
    const int bcArrayMaxX2 = (int)bcArray->getNX2();
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/RheologyK17LBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyK17LBMKernel.h
index 80bf7dcb346f500d75a31eca68fefdd092f2e9e8..1244bb031c1dffda3ea369739a5e9436238e1e0a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyK17LBMKernel.h
@@ -35,7 +35,7 @@
 #define RheologyK17LBMKernel_h__
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel.cpp b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel.cpp
rename to src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel.cpp
index 2b65887c1b0461a836f29a2aff7dc809dbb733e8..4906cb2a6e34cc14df2d9acaca52736c23da4816 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel.cpp
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel.cpp
@@ -83,7 +83,7 @@ void RheologyModelLBMKernel::calculate(int step)
 	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
 	zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -903,7 +903,7 @@ void RheologyModelLBMKernel::calculate(int step)
 //	kernel->setCollisionFactor(collFactor);
 //	collFactorF = collFactor;
 //	dynamicPointerCast<RheologyModelLBMKernel>(kernel)->initDataSet();
-//	kernel->setBCProcessor(bcProcessor->clone(kernel));
+//	kernel->setBCSet(bcSet->clone(kernel));
 //	kernel->setWithForcing(withForcing);
 //	kernel->setForcingX1(muForcingX1);
 //	kernel->setForcingX2(muForcingX2);
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel.h
index 8b4ce82984d12ef33b1011fe020fe7d3f0c638e4..4ff3bb9f7b679c4f97b2a685b2d1bbe64912d892 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel.h
@@ -34,7 +34,7 @@
 #define RheologyModelLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel2.cpp b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel2.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel2.cpp
rename to src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel2.cpp
index 308add14b3710983ea9139b405c3074891b1b7c9..9306686160f642d0f67cb40be2c78cce45fa0484 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel2.cpp
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel2.cpp
@@ -53,7 +53,7 @@ void RheologyModelLBMKernel2::calculate(int step)
 	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
 	zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -902,7 +902,7 @@ void RheologyModelLBMKernel2::calculate(int step)
 //	kernel->setCollisionFactor(collFactor);
 //	collFactorF = collFactor;
 //	dynamicPointerCast<RheologyModelLBMKernel2>(kernel)->initDataSet();
-//	kernel->setBCProcessor(bcProcessor->clone(kernel));
+//	kernel->setBCSet(bcSet->clone(kernel));
 //	kernel->setWithForcing(withForcing);
 //	kernel->setForcingX1(muForcingX1);
 //	kernel->setForcingX2(muForcingX2);
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel2.h b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel2.h
similarity index 98%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel2.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel2.h
index ca058f1e4e67cd8cf51e971999f9a2a359aa197d..ca97551c849d2b3315ff1813ecb0b3936a451a5b 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyModelLBMKernel2.h
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyModelLBMKernel2.h
@@ -2,7 +2,7 @@
 #define RheologyModelLBMKernel2_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyPowellEyringModelLBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/RheologyPowellEyringModelLBMKernel.h
similarity index 98%
rename from src/cpu/VirtualFluidsCore/LBM/RheologyPowellEyringModelLBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/RheologyPowellEyringModelLBMKernel.h
index acd02101fed8793175a6aae62394ce14e2847832..5cf0533f96b1c1df10ea8843196e15064044cbb9 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyPowellEyringModelLBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/RheologyPowellEyringModelLBMKernel.h
@@ -49,7 +49,7 @@ public:
 		kernel->setNX(nx);
 		kernel->setCollisionFactor(collFactor);
 		dynamicPointerCast<RheologyPowellEyringModelLBMKernel>(kernel)->initDataSet();
-		kernel->setBCProcessor(bcProcessor->clone(kernel));
+		kernel->setBCSet(bcSet->clone(kernel));
 		kernel->setWithForcing(withForcing);
 		kernel->setForcingX1(muForcingX1);
 		kernel->setForcingX2(muForcingX2);
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp b/src/cpu/NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp
rename to src/cpu/NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.cpp
index 6d11842f6f2d92b4daff1f7c1bb348af0c8021ca..00f5e89b3b1e8fc8a05facaa165655f81d0a8532 100644
--- a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp
+++ b/src/cpu/NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.cpp
@@ -45,7 +45,7 @@ SPtr<LBMKernel> ThixotropyExpLBMKernel::clone()
 	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setCollisionFactorH(this->collFactorH);
 	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setAlpha(this->alpha);
 	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setTheta(this->theta);
-	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setBCSet(bcSet->clone(kernel));
 	kernel->setWithForcing(withForcing);
 	kernel->setForcingX1(muForcingX1);
 	kernel->setForcingX2(muForcingX2);
@@ -98,7 +98,7 @@ void ThixotropyExpLBMKernel::calculate(int step)
 	nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
 	zeroDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.h
similarity index 98%
rename from src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.h
index 1316493c81c56a849cdcc39a9adfb064aa684205..754dd0ae09129455331c5a55b3b4d640350f33db 100644
--- a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.h
@@ -2,7 +2,7 @@
 #define ThixotropyExpLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp b/src/cpu/NonNewtonianFluids/LBM/ThixotropyLBMKernel.cpp
similarity index 99%
rename from src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp
rename to src/cpu/NonNewtonianFluids/LBM/ThixotropyLBMKernel.cpp
index 6fb32f31a3d40e369fb36b48e8d4f63c7a17322d..1524104ce69a9bceec685f6912a76b12e5480c76 100644
--- a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp
+++ b/src/cpu/NonNewtonianFluids/LBM/ThixotropyLBMKernel.cpp
@@ -45,7 +45,7 @@ SPtr<LBMKernel> ThixotropyLBMKernel::clone()
 	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setCollisionFactorH(this->collFactorH);
 	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setAlpha(this->alpha);
 	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setTheta(this->theta);
-	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setBCSet(bcSet->clone(kernel));
 	kernel->setWithForcing(withForcing);
 	kernel->setForcingX1(muForcingX1);
 	kernel->setForcingX2(muForcingX2);
@@ -98,7 +98,7 @@ void ThixotropyLBMKernel::calculate(int step)
 	nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
 	zeroDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
 
-	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+	SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
 	const int bcArrayMaxX1 = (int)bcArray->getNX1();
 	const int bcArrayMaxX2 = (int)bcArray->getNX2();
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h b/src/cpu/NonNewtonianFluids/LBM/ThixotropyLBMKernel.h
similarity index 98%
rename from src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h
rename to src/cpu/NonNewtonianFluids/LBM/ThixotropyLBMKernel.h
index c638105425c20dfa64a221a02004ee1ece8879fd..00b374ed133f58878ed8e1cf541c3fad79ea7c5e 100644
--- a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h
+++ b/src/cpu/NonNewtonianFluids/LBM/ThixotropyLBMKernel.h
@@ -2,7 +2,7 @@
 #define ThixotropyLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp
similarity index 86%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
rename to src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp
index 57048674137ccbf1445d548f332b2f5403d9ca4c..ed13f506ac6555fed5c90a4e66e3ac4d3d306f02 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp
@@ -1,5 +1,5 @@
-#include "CalculateTorqueCoProcessor.h"
-#include "BCProcessor.h"
+#include "CalculateTorqueSimulationObserver.h"
+#include "BCSet.h"
 
 #include <mpi/Communicator.h>
 #include "D3Q27Interactor.h"
@@ -12,9 +12,9 @@
 #include "BCArray3D.h"
 #include "EsoTwist3D.h"
 #include "DistributionArray3D.h"
-#include "Rheology.h"
+#include "NonNewtonianFluids/LBM/Rheology.h"
 
-CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
+CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
 {
    if (comm->getProcessID() == comm->getRoot())
    {
@@ -37,20 +37,20 @@ CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<
    }
 }
 //////////////////////////////////////////////////////////////////////////
-CalculateTorqueCoProcessor::~CalculateTorqueCoProcessor()
+CalculateTorqueSimulationObserver::~CalculateTorqueSimulationObserver()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::process( real step )
+void CalculateTorqueSimulationObserver::update( real step )
 {
    if(scheduler->isDue(step) )
       collectData(step);
 
-   UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+   UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::collectData( real step )
+void CalculateTorqueSimulationObserver::collectData( real step )
 {
    calculateForces();
 
@@ -80,7 +80,7 @@ void CalculateTorqueCoProcessor::collectData( real step )
    }
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::calculateForces()
+void CalculateTorqueSimulationObserver::calculateForces()
 {
    torqueX1global = 0.0;
    torqueX2global = 0.0;
@@ -105,7 +105,7 @@ void CalculateTorqueCoProcessor::calculateForces()
 
          SPtr<ILBMKernel> kernel = block->getKernel();
 
-         SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();          
+         SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();          
          SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); 
 
          int ghostLayerWidth = kernel->getGhostLayerWidth();
@@ -180,7 +180,7 @@ void CalculateTorqueCoProcessor::calculateForces()
    }
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc)
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForces(int x1, int x2, int x3,  SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc)
 {
    UbTupleDouble3 force(0.0,0.0,0.0);
 
@@ -214,7 +214,7 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SP
    return force;
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromMoments(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForcesFromMoments(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
 {
    using namespace vf::lbm::constant;
    UbTupleDouble3 force(0.0, 0.0, 0.0);
@@ -249,7 +249,7 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromMoments(int x1, int x2,
    return force;
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromStressTensor(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForcesFromStressTensor(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
 {
    using namespace vf::lbm::constant;
    UbTupleDouble3 force(0.0, 0.0, 0.0);
@@ -285,7 +285,7 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromStressTensor(int x1, int
    return force;
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::addInteractor( SPtr<D3Q27Interactor> interactor )
+void CalculateTorqueSimulationObserver::addInteractor( SPtr<D3Q27Interactor> interactor )
 {
    interactors.push_back(interactor);
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
rename to src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h
index 98b6d4001c6ed7f50c5c05254175c73117590072..d0cd9c41d5afc4e127f9be74e106960c86097f96 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h
@@ -1,18 +1,18 @@
 /*
- *  D3Q27ForcesCoProcessor.h
+ *  D3Q27ForcesSimulationObserver.h
  *
  *  Created on: 29.09.2012
  *  Author: K. Kucher
  */
 
-#ifndef CalculateTorqueCoProcessor_H
-#define CalculateTorqueCoProcessor_H
+#ifndef CalculateTorqueSimulationObserver_H
+#define CalculateTorqueSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 #include "D3Q27System.h"
 
@@ -25,13 +25,13 @@ class DistributionArray3D;
 class BoundaryConditions;
 class ILBMKernel;
 
-class CalculateTorqueCoProcessor: public CoProcessor 
+class CalculateTorqueSimulationObserver: public SimulationObserver 
 {
 public:
    //! Constructor
-   CalculateTorqueCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-	virtual ~CalculateTorqueCoProcessor();             
-	void process(real step); 
+   CalculateTorqueSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+	virtual ~CalculateTorqueSimulationObserver();             
+	void update(real step); 
    void addInteractor(SPtr<D3Q27Interactor> interactor);
 protected:
 	void collectData(real step);
@@ -52,4 +52,4 @@ private:
 };
 
 
-#endif /* D3Q27ForcesCoProcessor_H */
+#endif /* D3Q27ForcesSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
rename to src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
index 9a4af594717da6739af8b8c16abccd6cf63c3b76..08b05e4475301137394fdbf5c2536c641c2e742e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "WriteThixotropyQuantitiesCoProcessor.h"
+#include "WriteThixotropyQuantitiesSimulationObserver.h"
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "UbScheduler.h"
 #include "DataSet3D.h"
 #include "D3Q27System.h"
@@ -42,17 +42,17 @@
 #include <algorithm> 
 #include <numeric>
 #include "basics/writer/WbWriterVtkXmlASCII.h"
-#include "ThixotropyExpLBMKernel.h"
-#include "Rheology.h"
+//#include "ThixotropyExpLBMKernel.h"
+#include "NonNewtonianFluids/LBM/Rheology.h"
 
 using namespace std;
 
-WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor()
+WriteThixotropyQuantitiesSimulationObserver::WriteThixotropyQuantitiesSimulationObserver()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path), writer(writer),	conv(conv),	comm(comm)
+WriteThixotropyQuantitiesSimulationObserver::WriteThixotropyQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path), writer(writer),	conv(conv),	comm(comm)
 {
 	gridRank = comm->getProcessID();
 	minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -66,20 +66,20 @@ WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor(SPtr<
 	}
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::init()
+void WriteThixotropyQuantitiesSimulationObserver::init()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::process(real step)
+void WriteThixotropyQuantitiesSimulationObserver::update(real step)
 {
 	if (scheduler->isDue(step))
 		collectData(step);
 
-	UBLOG(logDEBUG3, "WriteThixotropyQuantitiesCoProcessor::update:" << step);
+	UBLOG(logDEBUG3, "WriteThixotropyQuantitiesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::collectData(real step)
+void WriteThixotropyQuantitiesSimulationObserver::collectData(real step)
 {
 	int istep = static_cast<int>(step);
 	//ConcentrationSum = 0;
@@ -118,7 +118,7 @@ void WriteThixotropyQuantitiesCoProcessor::collectData(real step)
 
 		vector<string> filenames;
 		filenames.push_back(piece);
-		if (step == CoProcessor::scheduler->getMinBegin())
+		if (step == SimulationObserver::scheduler->getMinBegin())
 		{
 			WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
 		}
@@ -126,13 +126,13 @@ void WriteThixotropyQuantitiesCoProcessor::collectData(real step)
 		{
 			WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
 		}
-		UBLOG(logINFO, "WriteThixotropyQuantitiesCoProcessor step: " << istep);
+		UBLOG(logINFO, "WriteThixotropyQuantitiesSimulationObserver step: " << istep);
 	}
 
 	clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::clearData()
+void WriteThixotropyQuantitiesSimulationObserver::clearData()
 {
 	nodes.clear();
 	cells.clear();
@@ -140,7 +140,7 @@ void WriteThixotropyQuantitiesCoProcessor::clearData()
 	data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteThixotropyQuantitiesSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
 	UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);;
 	UbTupleDouble3 nodeOffset = grid->getNodeOffset(block);
@@ -178,7 +178,7 @@ void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
 	data.resize(datanames.size());
 
    SPtr<ILBMKernel> kernel = block->getKernel();
-   SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();          
+   SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();          
    SPtr<DistributionArray3D> distributionsF = kernel->getDataSet()->getFdistributions(); 
 	//SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
 	//LBMReal collFactorF = staticPointerCast<ThixotropyExpLBMKernel>(kernel)->getCollisionFactorF();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
similarity index 80%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
rename to src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
index fbb2b6740c53b1d8a2ed9e37881fff98e4707a69..3ac9664e595adef9b45edaee662849a3ab63616f 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
@@ -26,29 +26,29 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteThixotropyQuantitiesCoProcessor_H
-#define WriteThixotropyQuantitiesCoProcessor_H
+#ifndef WriteThixotropyQuantitiesSimulationObserver_H
+#define WriteThixotropyQuantitiesSimulationObserver_H
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "Grid3D.h"
 #include "Block3D.h"
 #include "LBMUnitConverter.h"
 #include <mpi/Communicator.h>
 #include "WbWriter.h"
 
-class WriteThixotropyQuantitiesCoProcessor : public  CoProcessor
+class WriteThixotropyQuantitiesSimulationObserver : public  SimulationObserver
 {
 public:
-	WriteThixotropyQuantitiesCoProcessor();
-	WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-	~WriteThixotropyQuantitiesCoProcessor() = default;
+	WriteThixotropyQuantitiesSimulationObserver();
+	WriteThixotropyQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+	~WriteThixotropyQuantitiesSimulationObserver() = default;
 
-   void process(real step) override;
+   void update(real step) override;
 
 protected:
    void collectData(real step);
diff --git a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp b/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..69c65b6ecb26953e45671023af3c3a3407c40640
--- /dev/null
+++ b/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp
@@ -0,0 +1,140 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file BoundaryConditionsBlockVisitor.cpp
+//! \ingroup Visitors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "BoundaryConditionsBlockVisitor.h"
+#include "BC.h"
+#include "BCArray3D.h"
+#include "BCSet.h"
+#include "Block3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "DataSet3D.h"
+#include "Grid3D.h"
+#include "D3Q27System.h"
+#include "BC.h"
+#include "Block3D.h"
+#include "BCArray3D.h"
+#include "ILBMKernel.h"
+
+#include "NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h"
+#include "NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h"
+#include "NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h"
+#include "NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h"
+#include "NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h"
+
+
+BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
+{
+}
+//////////////////////////////////////////////////////////////////////////
+BoundaryConditionsBlockVisitor::~BoundaryConditionsBlockVisitor() = default;
+//////////////////////////////////////////////////////////////////////////
+void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
+{
+    if (block->getRank() == grid->getRank()) {
+        SPtr<ILBMKernel> kernel = block->getKernel();
+
+        if (!kernel) {
+            throw UbException(UB_EXARGS, "LBMKernel in " + block->toString() + "is not exist!");
+        }
+
+        SPtr<BCSet> bcSet = kernel->getBCSet();
+
+        if (!bcSet) {
+            throw UbException(UB_EXARGS, "Boundary Conditions Processor is not exist!");
+        }
+
+        SPtr<BCArray3D> bcArray = bcSet->getBCArray();
+
+        bool compressible = kernel->getCompressible();
+        real collFactor = kernel->getCollisionFactor();
+
+        int minX1 = 0;
+        int minX2 = 0;
+        int minX3 = 0;
+        int maxX1 = (int)bcArray->getNX1();
+        int maxX2 = (int)bcArray->getNX2();
+        int maxX3 = (int)bcArray->getNX3();
+        SPtr<BoundaryConditions> bcPtr;
+
+        bcSet->clearBC();
+
+        SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
+
+        for (int x3 = minX3; x3 < maxX3; x3++) {
+            for (int x2 = minX2; x2 < maxX2; x2++) {
+                for (int x1 = minX1; x1 < maxX1; x1++) {
+                    if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+                        if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL) {
+                            char alg              = bcPtr->getBCStrategyType();
+                            SPtr<BCStrategy> bca = bcMap[alg];
+
+                            if (bca) {
+                                bca = bca->clone();
+                                bca->setBlock(block);
+                                bca->setNodeIndex(x1, x2, x3);
+                                bca->setBcPointer(bcPtr);
+                                bca->addDistributions(distributions);
+
+                                if (alg == BCStrategy::ThixotropyVelocityBCStrategy)
+                                    std::static_pointer_cast<ThixotropyVelocityBCStrategy>(bca)->addDistributionsH(
+                                        kernel->getDataSet()->getHdistributions());
+                                if (alg == BCStrategy::ThixotropyDensityBCStrategy)
+                                    std::static_pointer_cast<ThixotropyDensityBCStrategy>(bca)->addDistributionsH(
+                                        kernel->getDataSet()->getHdistributions());
+                                if (alg == BCStrategy::ThixotropyNoSlipBCStrategy)
+                                    std::static_pointer_cast<ThixotropyNoSlipBCStrategy>(bca)->addDistributionsH(
+                                        kernel->getDataSet()->getHdistributions());
+                                if (alg == BCStrategy::ThixotropyNonReflectingOutflowBCStrategy)
+                                    std::static_pointer_cast<ThixotropyNonReflectingOutflowBCStrategy>(bca)
+                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                                if (alg == BCStrategy::ThixotropyVelocityWithDensityBCStrategy)
+                                    std::static_pointer_cast<ThixotropyVelocityWithDensityBCStrategy>(bca)
+                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
+
+                                bca->setCollFactor(collFactor);
+                                bca->setCompressible(compressible);
+                                bca->setBcArray(bcArray);
+                                bcSet->addBC(bca);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+void BoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
+{
+    bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getAlgorithm()));
+}
diff --git a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h b/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..8954bf73a6a459a795e916f24192f5db698b1426
--- /dev/null
+++ b/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h
@@ -0,0 +1,61 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file BoundaryConditionsBlockVisitor.h
+//! \ingroup Visitors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef BoundaryConditionBlockVisitor_h__
+#define BoundaryConditionBlockVisitor_h__
+
+#include <PointerDefinitions.h>
+#include <map>
+
+#include "Block3DVisitor.h"
+
+class Grid3D;
+class Block3D;
+class BCStrategy;
+class BC;
+
+//! \brief set boundary conditions
+class BoundaryConditionsBlockVisitor : public Block3DVisitor
+{
+public:
+    BoundaryConditionsBlockVisitor();
+    ~BoundaryConditionsBlockVisitor() override;
+
+    void visit(SPtr<Grid3D> grid, SPtr<Block3D> block) override;
+    void addBC(SPtr<BC> bc);
+
+protected:
+private:
+    std::map<char, SPtr<BCStrategy>> bcMap;
+};
+#endif // BoundaryConditionBlockVisitor_h__
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index 1ee4c7e78aded0e11ea723769d4515f0f1ec846d..df9bfb364e6a8c7478b1dff097e0f030627540eb 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -108,45 +108,47 @@
 #include <muParserToken.h>
 #include <muParserTokenReader.h>
 
-#include <BoundaryConditions/BCAdapter.h>
-#include <BoundaryConditions/BCAlgorithm.h>
+#include <BoundaryConditions/BC.h>
+#include <BoundaryConditions/BCStrategy.h>
 #include <BoundaryConditions/BCArray3D.h>
 #include <BoundaryConditions/BCFunction.h>
-#include <BoundaryConditions/BCProcessor.h>
+#include <BoundaryConditions/BCSet.h>
 #include <BoundaryConditions/BoundaryConditions.h>
-#include <BoundaryConditions/DensityBCAdapter.h>
-#include <BoundaryConditions/EqDensityBCAlgorithm.h>
-#include <BoundaryConditions/HighViscosityNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/NoSlipBCAdapter.h>
-#include <BoundaryConditions/NoSlipBCAlgorithm.h>
-#include <BoundaryConditions/NonEqDensityBCAlgorithm.h>
-#include <BoundaryConditions/NonReflectingOutflowBCAlgorithm.h>
-#include <BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.h>
-#include <BoundaryConditions/NonReflectingInflowBCAlgorithm.h>
-#include <BoundaryConditions/SlipBCAdapter.h>
-#include <BoundaryConditions/SlipBCAlgorithm.h>
-#include <BoundaryConditions/ThinWallBCProcessor.h>
-#include <BoundaryConditions/ThinWallNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/VelocityBCAdapter.h>
-#include <BoundaryConditions/VelocityBCAlgorithm.h>
-#include <BoundaryConditions/VelocityWithDensityBCAlgorithm.h>
-#include <BoundaryConditions/ThixotropyDensityBCAlgorithm.h>
-#include <BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/ThixotropyVelocityBCAlgorithm.h>
-#include <BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.h>
-#include <BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.h>
-#include <BoundaryConditions/SimpleVelocityBCAlgorithm.h>
-#include <BoundaryConditions/RheologyNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/RheologyBinghamModelNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/SimpleSlipBCAlgorithm.h>
-#include <BoundaryConditions/RheologyPowellEyringModelNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/RheologyBinghamModelVelocityBCAlgorithm.h>
-#include <BoundaryConditions/MultiphaseNoSlipBCAlgorithm.h>
-#include <BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h>
-#include <BoundaryConditions/MultiphaseVelocityBCAdapter.h>
-#include <BoundaryConditions/MultiphaseVelocityBCAlgorithm.h>
-#include <BoundaryConditions/MultiphaseSlipBCAlgorithm.h> 
+#include <BoundaryConditions/DensityBC.h>
+#include <BoundaryConditions/EqDensityBCStrategy.h>
+#include <BoundaryConditions/HighViscosityNoSlipBCStrategy.h>
+#include <BoundaryConditions/NoSlipBC.h>
+#include <BoundaryConditions/NoSlipBCStrategy.h>
+#include <BoundaryConditions/NonEqDensityBCStrategy.h>
+#include <BoundaryConditions/NonReflectingOutflowBCStrategy.h>
+#include <BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.h>
+#include <BoundaryConditions/NonReflectingInflowBCStrategy.h>
+#include <BoundaryConditions/SlipBC.h>
+#include <BoundaryConditions/SlipBCStrategy.h>
+#include <BoundaryConditions/ThinWallBCSet.h>
+#include <BoundaryConditions/ThinWallNoSlipBCStrategy.h>
+#include <BoundaryConditions/VelocityBC.h>
+#include <BoundaryConditions/VelocityBCStrategy.h>
+#include <BoundaryConditions/VelocityWithDensityBCStrategy.h>
+#include <BoundaryConditions/SimpleVelocityBCStrategy.h>
+#include <BoundaryConditions/SimpleSlipBCStrategy.h>
+
+#include <NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h>
+#include <NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h>
+
+#include <MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h>
+#include <MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h>
+#include <MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.h>
+#include <MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h>
+#include <MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h> 
 
 #include <Connectors/Block3DConnector.h>
 //#include <Connectors/Block3DConnectorFactory.h>
@@ -173,51 +175,50 @@
 #include <Data/EsoTwistD3Q27System.h>
 #include <Data/VoidData3D.h>
 
-#include <Grid/BasicCalculator.h>
-#include <Grid/Block3D.h>
-#include <Grid/Calculator.h>
-#include <Grid/Grid3D.h>
+#include <Simulation/Block3D.h>
+#include <Simulation/Simulation.h>
+#include <Simulation/Grid3D.h>
 
 #include <Interactors/D3Q27Interactor.h>
 #include <Interactors/D3Q27TriFaceMeshInteractor.h>
 #include <Interactors/Interactor3D.h>
 #include <Interactors/InteractorsHelper.h>
 
-#include <CoProcessors/AdjustForcingCoProcessor.h>
-#include <CoProcessors/CalculateForcesCoProcessor.h>
-#include <CoProcessors/CalculateTorqueCoProcessor.h>
-#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
-#include <CoProcessors/WriteMQFromSelectionCoProcessor.h>
-#include <CoProcessors/WriteBoundaryConditionsCoProcessor.h>
-#include <CoProcessors/WriteMQFromSelectionCoProcessor.h>
-#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
-#include <WriteBlocksCoProcessor.h>
-//#include <CoProcessors/PathLineCoProcessor.h>
-//#include <CoProcessors/PathLineCoProcessorMcpart.h>
-#include <CoProcessors/EmergencyExitCoProcessor.h>
-#include <CoProcessors/NUPSCounterCoProcessor.h>
-#include <CoProcessors/PressureDifferenceCoProcessor.h>
-//#include <CoProcessors/Particles.h>
-#include <CoProcessors/AverageValuesCoProcessor.h>
-#include <CoProcessors/CoProcessor.h>
-#include <CoProcessors/DecreaseViscosityCoProcessor.h>
-#include <CoProcessors/InSituVTKCoProcessor.h>
-#include <CoProcessors/QCriterionCoProcessor.h>
-#include <CoProcessors/ShearStressCoProcessor.h>
-#include <CoProcessors/TimeseriesCoProcessor.h>
-#include <CoProcessors/TurbulenceIntensityCoProcessor.h>
-#include <CoProcessors/TimeAveragedValuesCoProcessor.h>
+#include <SimulationObservers/AdjustForcingSimulationObserver.h>
+#include <SimulationObservers/CalculateForcesSimulationObserver.h>
+#include <NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h>
+#include <SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h>
+#include <SimulationObservers/WriteMQFromSelectionSimulationObserver.h>
+#include <SimulationObservers/WriteBoundaryConditionsSimulationObserver.h>
+#include <SimulationObservers/WriteMQFromSelectionSimulationObserver.h>
+#include <SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h>
+#include <WriteBlocksSimulationObserver.h>
+//#include <SimulationObservers/PathLineSimulationObserver.h>
+//#include <SimulationObservers/PathLineSimulationObserverMcpart.h>
+#include <SimulationObservers/EmergencyExitSimulationObserver.h>
+#include <SimulationObservers/NUPSCounterSimulationObserver.h>
+#include <SimulationObservers/PressureDifferenceSimulationObserver.h>
+//#include <SimulationObservers/Particles.h>
+#include <SimulationObservers/AverageValuesSimulationObserver.h>
+#include <SimulationObservers/SimulationObserver.h>
+#include <SimulationObservers/DecreaseViscositySimulationObserver.h>
+#include <SimulationObservers/InSituVTKSimulationObserver.h>
+#include <SimulationObservers/QCriterionSimulationObserver.h>
+#include <SimulationObservers/ShearStressSimulationObserver.h>
+#include <SimulationObservers/TimeseriesSimulationObserver.h>
+#include <SimulationObservers/TurbulenceIntensitySimulationObserver.h>
+#include <SimulationObservers/TimeAveragedValuesSimulationObserver.h>
 
-//#include <CoProcessors/MeanValuesCoProcessor.h>
-#include <CoProcessors/InSituCatalystCoProcessor.h>
-#include <CoProcessors/LineTimeSeriesCoProcessor.h>
-#include <CoProcessors/MPIIOMigrationBECoProcessor.h>
-#include <CoProcessors/MPIIOMigrationCoProcessor.h>
-#include <CoProcessors/MPIIORestartCoProcessor.h>
-#include <CoProcessors/MicrophoneArrayCoProcessor.h>
-#include <WriteThixotropyQuantitiesCoProcessor.h>
-#include <WriteMultiphaseQuantitiesCoProcessor.h>
-#include <TimeDependentBCCoProcessor.h>
+//#include <SimulationObservers/MeanValuesSimulationObserver.h>
+#include <SimulationObservers/InSituCatalystSimulationObserver.h>
+#include <SimulationObservers/LineTimeSeriesSimulationObserver.h>
+#include <SimulationObservers/MPIIOMigrationBESimulationObserver.h>
+#include <SimulationObservers/MPIIOMigrationSimulationObserver.h>
+#include <SimulationObservers/MPIIORestartSimulationObserver.h>
+#include <SimulationObservers/MicrophoneArraySimulationObserver.h>
+#include <NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h>
+#include <MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h>
+#include <TimeDependentBCSimulationObserver.h>
 
 #include <IntegrateValuesHelper.h>
 //#include <LBM/D3Q27CompactInterpolationProcessor.h>
@@ -241,26 +242,26 @@
 #include <LBM/LBMSystem.h>
 #include <LBM/LBMUnitConverter.h>
 #include <LBM/BGKLBMKernel.h>
-#include <LBM/ThixotropyLBMKernel.h>
-#include <LBM/ThixotropyExpLBMKernel.h>
+#include <NonNewtonianFluids/LBM/ThixotropyLBMKernel.h>
+#include <NonNewtonianFluids/LBM/ThixotropyExpLBMKernel.h>
 #include <LBM/CumulantLBMKernel.h>
 #include <LBM/CumulantK17LBMKernel.h>
 //#include <LBM/RheologyModelLBMKernel.h>
 //#include <LBM/RheologyModelLBMKernel2.h>
-#include <LBM/RheologyBinghamModelLBMKernel.h>
-#include <LBM/RheologyHerschelBulkleyModelLBMKernel.h>
-#include <LBM/RheologyInterpolationProcessor.h>
-#include <LBM/Rheology.h>
-#include <LBM/RheologyK17LBMKernel.h>
-#include <LBM/RheologyPowellEyringModelLBMKernel.h>
-#include <LBM/MultiphaseCumulantLBMKernel.h>
-#include <LBM/MultiphaseScratchCumulantLBMKernel.h>
-#include <LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h>
-#include <LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h>
-#include <LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h>
-#include <LBM/MultiphasePressureFilterLBMKernel.h>
-#include <LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h>
-#include <MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h>
+#include <NonNewtonianFluids/LBM/RheologyBinghamModelLBMKernel.h>
+#include <NonNewtonianFluids/LBM/RheologyHerschelBulkleyModelLBMKernel.h>
+#include <NonNewtonianFluids/LBM/RheologyInterpolationProcessor.h>
+#include <NonNewtonianFluids/LBM/Rheology.h>
+#include <NonNewtonianFluids/LBM/RheologyK17LBMKernel.h>
+#include <NonNewtonianFluids/LBM/RheologyPowellEyringModelLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphaseScratchCumulantLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h>
+#include <MultiphaseFlow/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h>
 
 
 
@@ -349,10 +350,10 @@
 #include <CheckRatioBlockVisitor.h>
 #include <SpongeLayerBlockVisitor.h>
 #include <ZoltanPartitioningGridVisitor.h>
-#include <Visitors/MultiphaseSetKernelBlockVisitor.h>
-#include <Visitors/MultiphaseBoundaryConditionsBlockVisitor.h>
-#include <Visitors/MultiphaseInitDistributionsBlockVisitor.h>
-#include <Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h>
+#include <MultiphaseFlow/Visitors/MultiphaseSetKernelBlockVisitor.h>
+#include <MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h>
+#include <MultiphaseFlow/Visitors/MultiphaseInitDistributionsBlockVisitor.h>
+#include <MultiphaseFlow/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h>
 #include <Visitors/SetInterpolationConnectorsBlockVisitor.h>
 
 #include <RefineAroundGbObjectHelper.h>
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAdapter.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCAdapter.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
index 625fb92149df067639b05435d9b8597b6f96e775..7dc4e4d4146231db144717bdc16b70b01bf59a8b 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAdapter.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
@@ -26,30 +26,30 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BCAdapter.h
+//! \file BC.h
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
-#ifndef BCAdapter_H
-#define BCAdapter_H
+#ifndef BC_H
+#define BC_H
 
 #include <PointerDefinitions.h>
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include "BoundaryConditions.h"
 
 class D3Q27Interactor;
 
 //! \brief Abstract class of baundary conditions adapter
-//! \details  BCAdapter supports the definition of boundary conditions in grid generation
-class BCAdapter
+//! \details  BC supports the definition of boundary conditions in grid generation
+class BC
 {
 public:
-    BCAdapter() = default;
+    BC() = default;
 
     //! \param secondaryBcOption additional option of boundary conditions
-    BCAdapter(const short &secondaryBcOption) : secondaryBcOption(secondaryBcOption) {}
-    virtual ~BCAdapter() = default;
+    BC(const short &secondaryBcOption) : secondaryBcOption(secondaryBcOption) {}
+    virtual ~BC() = default;
 
     // methods
     bool isTimeDependent() { return ((this->type & TIMEDEPENDENT) == TIMEDEPENDENT); }
@@ -66,20 +66,20 @@ public:
                                      const real &worldX1, const real &worldX2, const real &worldX3,
                                      const real &q, const int &fdirection, const real &time = 0) = 0;
 
-    void setBcAlgorithm(SPtr<BCAlgorithm> alg)
+    void setBCStrategy(SPtr<BCStrategy> alg)
     {
         algorithmType = alg->getType();
         algorithm     = alg;
     }
-    SPtr<BCAlgorithm> getAlgorithm() { return algorithm; }
-    char getBcAlgorithmType() { return algorithmType; }
+    SPtr<BCStrategy> getAlgorithm() { return algorithm; }
+    char getBCStrategyType() { return algorithmType; }
 
 protected:
     short secondaryBcOption{ 0 };
 
     char type{ 0 };
 
-    SPtr<BCAlgorithm> algorithm;
+    SPtr<BCStrategy> algorithm;
     char algorithmType{ -1 };
 
     static const char TIMEDEPENDENT = 1 << 0; //'1';
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h
index b9d08f7117d9dc41c008c9d92a5780aceedad21c..13d8fbad837d32982e466b8daa05afba9293b69d 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h
@@ -130,9 +130,9 @@ private:
     //////////////////////////////////////////////////////////////////////////
     void deleteBC(std::size_t x1, std::size_t x2, std::size_t x3);
 
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
-    friend class MPIIOMigrationBECoProcessor;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
+    friend class MPIIOMigrationBESimulationObserver;
 
 protected:
     //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCFunction.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCFunction.cpp
index 286c9a9f7b9ecd131f90a8c6853ed8e250e1f262..639365df09de069ca1a6fb4b0ba476ff6d74220f 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCFunction.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCFunction.cpp
@@ -32,6 +32,7 @@
 //=======================================================================================
 
 #include "BCFunction.h"
+#include "lbm/constants/NumericConstants.h"
 
-const real BCFunction::INFTIMEDEPENDENT = -1.0;
-const real BCFunction::INFCONST         = -10.0;
+const real BCFunction::INFTIMEDEPENDENT = -vf::lbm::constant::c1o1;
+const real BCFunction::INFCONST         = -vf::lbm::constant::c10o1;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCProcessor.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCSet.cpp
similarity index 82%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCProcessor.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BCSet.cpp
index de647a842d1ffcdb08d39988befe1ed19ebc5842..ca8bcadd14040219ced9e519e04a947bd3b8efdc 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCSet.cpp
@@ -26,21 +26,21 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BCProcessor.h
+//! \file BCSet.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "BCProcessor.h"
-#include "BCAlgorithm.h"
+#include "BCSet.h"
+#include "BCStrategy.h"
 #include "BCArray3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "ILBMKernel.h"
 
-BCProcessor::BCProcessor() = default;
+BCSet::BCSet() = default;
 //////////////////////////////////////////////////////////////////////////
-BCProcessor::BCProcessor(SPtr<ILBMKernel> kernel)
+BCSet::BCSet(SPtr<ILBMKernel> kernel)
 {
     SPtr<DistributionArray3D> distributions =
         std::dynamic_pointer_cast<EsoTwist3D>(kernel->getDataSet()->getFdistributions());
@@ -48,19 +48,19 @@ BCProcessor::BCProcessor(SPtr<ILBMKernel> kernel)
                                           BCArray3D::FLUID);
 }
 //////////////////////////////////////////////////////////////////////////
-BCProcessor::~BCProcessor() = default;
+BCSet::~BCSet() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCProcessor> BCProcessor::clone(SPtr<ILBMKernel> kernel)
+SPtr<BCSet> BCSet::clone(SPtr<ILBMKernel> kernel)
 {
-    SPtr<BCProcessor> bcProcessor(new BCProcessor(kernel));
-    return bcProcessor;
+    SPtr<BCSet> bcSet(new BCSet(kernel));
+    return bcSet;
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCArray3D> BCProcessor::getBCArray() { return bcArray; }
+SPtr<BCArray3D> BCSet::getBCArray() { return bcArray; }
 //////////////////////////////////////////////////////////////////////////
-void BCProcessor::setBCArray(SPtr<BCArray3D> bcarray) { bcArray = bcarray; }
+void BCSet::setBCArray(SPtr<BCArray3D> bcarray) { bcArray = bcarray; }
 //////////////////////////////////////////////////////////////////////////
-void BCProcessor::addBC(SPtr<BCAlgorithm> bc)
+void BCSet::addBC(SPtr<BCStrategy> bc)
 {
     if (bc->isPreCollision()) {
         preBC.push_back(bc);
@@ -69,19 +69,19 @@ void BCProcessor::addBC(SPtr<BCAlgorithm> bc)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BCProcessor::applyPreCollisionBC()
+void BCSet::applyPreCollisionBC()
 {
-    for (SPtr<BCAlgorithm> bc : preBC)
+    for (SPtr<BCStrategy> bc : preBC)
         bc->applyBC();
 }
 //////////////////////////////////////////////////////////////////////////
-void BCProcessor::applyPostCollisionBC()
+void BCSet::applyPostCollisionBC()
 {
-    for (SPtr<BCAlgorithm> bc : postBC)
+    for (SPtr<BCStrategy> bc : postBC)
         bc->applyBC();
 }
 //////////////////////////////////////////////////////////////////////////
-void BCProcessor::clearBC()
+void BCSet::clearBC()
 {
     preBC.clear();
     postBC.clear();
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCProcessor.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCSet.h
similarity index 86%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCProcessor.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BCSet.h
index 266307305db6febd885d6e90a8385714947221ff..f3f464093eab5e6ba7945e07dc4f7c929fb1bb34 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCProcessor.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCSet.h
@@ -26,40 +26,40 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BCProcessor.h
+//! \file BCSet.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef BC_PROCESSSOR_H
-#define BC_PROCESSSOR_H
+#ifndef BCSet_H
+#define BCSet_H
 
 #include <PointerDefinitions.h>
 #include <vector>
 
 class BCArray3D;
-class BCAlgorithm;
+class BCStrategy;
 class ILBMKernel;
 
 //! A class provides an interface for boundary conditions in the calculation loop.
-class BCProcessor
+class BCSet
 {
 public:
-    BCProcessor();
-    BCProcessor(SPtr<ILBMKernel> kernel);
-    virtual ~BCProcessor();
+    BCSet();
+    BCSet(SPtr<ILBMKernel> kernel);
+    virtual ~BCSet();
     virtual SPtr<BCArray3D> getBCArray();
     virtual void setBCArray(SPtr<BCArray3D> bcarray);
-    virtual SPtr<BCProcessor> clone(SPtr<ILBMKernel> kernel);
+    virtual SPtr<BCSet> clone(SPtr<ILBMKernel> kernel);
 
-    void addBC(SPtr<BCAlgorithm> bc);
+    void addBC(SPtr<BCStrategy> bc);
     void applyPreCollisionBC();
     void applyPostCollisionBC();
     void clearBC();
 
 protected:
-    std::vector<SPtr<BCAlgorithm>> preBC;
-    std::vector<SPtr<BCAlgorithm>> postBC;
+    std::vector<SPtr<BCStrategy>> preBC;
+    std::vector<SPtr<BCStrategy>> postBC;
     SPtr<BCArray3D> bcArray;
 
 private:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
similarity index 81%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
index 179007cb6f3f881517c55196420c2cf7135a62f1..3331f24538f421db95d12da0eb6f287ba858765a 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
@@ -26,33 +26,33 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BCAlgorithm.cpp
+//! \file BCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 
 #include "BCArray3D.h"
 #include "BoundaryConditions.h"
 #include "EsoTwist3D.h"
 #include "Block3D.h"
 
-void BCAlgorithm::setBlock(SPtr<Block3D> block) 
+void BCStrategy::setBlock(SPtr<Block3D> block) 
 { 
     this->block = block; 
 }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setNodeIndex(int x1, int x2, int x3)
+void BCStrategy::setNodeIndex(int x1, int x2, int x3)
 {
     this->x1 = x1;
     this->x2 = x2;
     this->x3 = x3;
 }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setBcPointer(SPtr<BoundaryConditions> bcPtr) { this->bcPtr = bcPtr; }
+void BCStrategy::setBcPointer(SPtr<BoundaryConditions> bcPtr) { this->bcPtr = bcPtr; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setCompressible(bool c)
+void BCStrategy::setCompressible(bool c)
 {
     compressible = c;
 
@@ -69,26 +69,26 @@ void BCAlgorithm::setCompressible(bool c)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setCollFactor(real cf) { collFactor = cf; }
+void BCStrategy::setCollFactor(real cf) { collFactor = cf; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setCollFactorL(real cf) { collFactorL = cf; }
+void BCStrategy::setCollFactorL(real cf) { collFactorL = cf; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setCollFactorG(real cf) { collFactorG = cf; }
+void BCStrategy::setCollFactorG(real cf) { collFactorG = cf; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setCollFactorPh(real cf) { collFactorPh = cf; }
+void BCStrategy::setCollFactorPh(real cf) { collFactorPh = cf; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setDensityRatio(real dr) { densityRatio = dr; }
+void BCStrategy::setDensityRatio(real dr) { densityRatio = dr; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setPhiBound(real phiL, real phiH)
+void BCStrategy::setPhiBound(real phiL, real phiH)
 {
     this->phiL = phiL;
     this->phiH = phiH;
 }
 //////////////////////////////////////////////////////////////////////////
-char BCAlgorithm::getType() { return type; }
+char BCStrategy::getType() { return type; }
 //////////////////////////////////////////////////////////////////////////
-bool BCAlgorithm::isPreCollision() { return preCollision; }
+bool BCStrategy::isPreCollision() { return preCollision; }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCArray3D> BCAlgorithm::getBcArray() { return bcArray; }
+SPtr<BCArray3D> BCStrategy::getBcArray() { return bcArray; }
 //////////////////////////////////////////////////////////////////////////
-void BCAlgorithm::setBcArray(SPtr<BCArray3D> bcarray) { bcArray = bcarray; }
+void BCStrategy::setBcArray(SPtr<BCArray3D> bcarray) { bcArray = bcarray; }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
similarity index 69%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
index f182546b0740cbff6b66b3849e2c67e42de1a98d..9b2b7cb803948cb0dbd4ebac103c4c935de38f06 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
@@ -26,7 +26,7 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BCAlgorithm.h
+//! \file BCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
@@ -44,38 +44,38 @@ class BoundaryConditions;
 class Block3D;
 
 //! \brief Abstract class of baundary conditions algorithm
-//! \details  BCAlgorithm provides interface for implementation of diferent boundary conditions
-class BCAlgorithm
+//! \details  BCStrategy provides interface for implementation of diferent boundary conditions
+class BCStrategy
 {
 public:
-    static const char VelocityBCAlgorithm                          = 0;
-    static const char EqDensityBCAlgorithm                         = 1;
-    static const char NonEqDensityBCAlgorithm                      = 2;
-    static const char NoSlipBCAlgorithm                            = 3;
-    static const char SlipBCAlgorithm                              = 4;
-    static const char HighViscosityNoSlipBCAlgorithm               = 5;
-    static const char ThinWallNoSlipBCAlgorithm                    = 6;
-    static const char VelocityWithDensityBCAlgorithm               = 7;
-    static const char NonReflectingOutflowBCAlgorithm              = 8;
-    static const char ThixotropyVelocityBCAlgorithm             = 9;
-    static const char ThixotropyDensityBCAlgorithm              = 10;
-    static const char ThixotropyNoSlipBCAlgorithm               = 11;
-    static const char ThixotropyNonReflectingOutflowBCAlgorithm = 12;
-    static const char ThixotropyVelocityWithDensityBCAlgorithm  = 13;
-    static const char RheologyBinghamModelNoSlipBCAlgorithm                = 14;
-    static const char RheologyHerschelBulkleyModelNoSlipBCAlgorithm        = 15;
-    static const char SimpleVelocityBCAlgorithm                    = 16;
-    static const char SimpleSlipBCAlgorithm                        = 17;
-    static const char RheologyPowellEyringModelNoSlipBCAlgorithm           = 18;
-    static const char RheologyBinghamModelVelocityBCAlgorithm              = 19;
-    static const char MultiphaseNoSlipBCAlgorithm                  = 20;
-    static const char MultiphaseVelocityBCAlgorithm                      = 21;
-    static const char NonReflectingInflowBCAlgorithm = 22;
-    static const char NonReflectingOutflowBCAlgorithmWithRelaxation = 23;
+    static const char VelocityBCStrategy                           = 0;
+    static const char EqDensityBCStrategy                          = 1;
+    static const char NonEqDensityBCStrategy                       = 2;
+    static const char NoSlipBCStrategy                             = 3;
+    static const char SlipBCStrategy                               = 4;
+    static const char HighViscosityNoSlipBCStrategy                = 5;
+    static const char ThinWallNoSlipBCStrategy                     = 6;
+    static const char VelocityWithDensityBCStrategy                = 7;
+    static const char NonReflectingOutflowBCStrategy               = 8;
+    static const char ThixotropyVelocityBCStrategy                 = 9;
+    static const char ThixotropyDensityBCStrategy                  = 10;
+    static const char ThixotropyNoSlipBCStrategy                   = 11;
+    static const char ThixotropyNonReflectingOutflowBCStrategy     = 12;
+    static const char ThixotropyVelocityWithDensityBCStrategy      = 13;
+    static const char RheologyBinghamModelNoSlipBCStrategy         = 14;
+    static const char RheologyHerschelBulkleyModelNoSlipBCStrategy = 15;
+    static const char SimpleVelocityBCStrategy                     = 16;
+    static const char SimpleSlipBCStrategy                         = 17;
+    static const char RheologyPowellEyringModelNoSlipBCStrategy    = 18;
+    static const char RheologyBinghamModelVelocityBCStrategy       = 19;
+    static const char MultiphaseNoSlipBCStrategy                   = 20;
+    static const char MultiphaseVelocityBCStrategy                 = 21;
+    static const char NonReflectingInflowBCStrategy                = 22;
+    static const char NonReflectingOutflowWithRelaxationBCStrategy = 23;
 
 public:
-    BCAlgorithm() = default;
-    virtual ~BCAlgorithm() = default;
+    BCStrategy() = default;
+    virtual ~BCStrategy() = default;
 
     virtual void addDistributions(SPtr<DistributionArray3D> distributions)   = 0;
     virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
@@ -94,7 +94,7 @@ public:
 
     char getType();
     bool isPreCollision();
-    virtual SPtr<BCAlgorithm> clone() = 0;
+    virtual SPtr<BCStrategy> clone() = 0;
     SPtr<BCArray3D> getBcArray();
     void setBcArray(SPtr<BCArray3D> bcarray);
     virtual void applyBC() = 0;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
index b5318092d225fe4ffc0e52aceb57b446acc9d014..963c2df627cb3780a03b91cb62d1ad21472a6952 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
@@ -42,6 +42,7 @@
 #include "UbTuple.h"
 #include "Vector3D.h"
 #include <PointerDefinitions.h>
+#include "lbm/constants/NumericConstants.h"
 
 //! Difenition of baundary conditions in grid generation
 class BoundaryConditions
@@ -310,8 +311,8 @@ public:
         return (((flag >> (optionDigits * direction)) & maxOptionVal) != 0);
     }
 
-    void setBcAlgorithmType(char alg) { algorithmType = alg; }
-    char getBcAlgorithmType() { return algorithmType; }
+    void setBCStrategyType(char alg) { algorithmType = alg; }
+    char getBCStrategyType() { return algorithmType; }
 
 public:
     static const int optionDigits = 2;   //--> 2 bits for secondary Option --> maxOptionVal = 7
@@ -326,20 +327,20 @@ protected:
     long long densityBoundaryFlags{ 0 };
     long long wallModelBoundaryFlags{ 0 };
 
-    float bcVelocityX1{ 0.0f };
-    float bcVelocityX2{ 0.0f };
-    float bcVelocityX3{ 0.0f };
-    float bcDensity{ 0.0f };
-    float bcPhaseField{ 0.0f };
+    float bcVelocityX1{ vf::lbm::constant::c0o1 };
+    float bcVelocityX2{ vf::lbm::constant::c0o1 };
+    float bcVelocityX3{ vf::lbm::constant::c0o1 };
+    float bcDensity{ vf::lbm::constant::c0o1 };
+    float bcPhaseField{ vf::lbm::constant::c0o1 };
 
-    float nx1{ 0.0f }, nx2{ 0.0f }, nx3{ 0.0f };
+    float nx1{ vf::lbm::constant::c0o1 }, nx2{ vf::lbm::constant::c0o1 }, nx3{ vf::lbm::constant::c0o1 };
 
     char algorithmType { -1 };
 
 private:
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
-    friend class MPIIOMigrationBECoProcessor;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
+    friend class MPIIOMigrationBESimulationObserver;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBCAdapter.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
similarity index 85%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBCAdapter.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
index 86ac7726170c2322e2749f1d4cfaa92033cf7ff9..8d4fabcbb6792f329ec980362dde8a5ec17f58cf 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBCAdapter.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
@@ -26,47 +26,48 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file DensityBCAdapter.cpp
+//! \file DensityBC.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "DensityBCAdapter.h"
+#include "DensityBC.h"
 #include "basics/utilities/UbInfinity.h"
 #include "basics/utilities/UbLogger.h"
+#include "lbm/constants/NumericConstants.h"
 
 using namespace std;
 /*==========================================================*/
-DensityBCAdapter::DensityBCAdapter(const real &dens, const real &startTime, const real &endTime)
+DensityBC::DensityBC(const real &dens, const real &startTime, const real &endTime)
 {
     this->densBCs.emplace_back(dens, startTime, endTime);
     this->init();
 }
 /*==========================================================*/
-DensityBCAdapter::DensityBCAdapter(const BCFunction &densBC)
+DensityBC::DensityBC(const BCFunction &densBC)
 {
     this->densBCs.push_back(densBC);
     this->init();
 }
 /*==========================================================*/
-DensityBCAdapter::DensityBCAdapter(const std::vector<BCFunction> &densBCs)
+DensityBC::DensityBC(const std::vector<BCFunction> &densBCs)
 {
     this->densBCs = densBCs;
     this->init();
 }
 /*==========================================================*/
-DensityBCAdapter::DensityBCAdapter(const mu::Parser &function, const real &startTime, const real &endTime)
+DensityBC::DensityBC(const mu::Parser &function, const real &startTime, const real &endTime)
 {
     this->densBCs.emplace_back(function, startTime, endTime);
     this->init();
 }
 /*==========================================================*/
-void DensityBCAdapter::init()
+void DensityBC::init()
 {
-    this->timeStep = 0.0;
+    this->timeStep = vf::lbm::constant::c0o1;
 
-    this->x1 = 0.0;
-    this->x2 = 0.0;
-    this->x3 = 0.0;
+    this->x1 = vf::lbm::constant::c0o1;
+    this->x2 = vf::lbm::constant::c0o1;
+    this->x3 = vf::lbm::constant::c0o1;
 
     this->tmpDensityFunction = NULL;
 
@@ -96,7 +97,7 @@ void DensityBCAdapter::init()
     }
 }
 /*==========================================================*/
-void DensityBCAdapter::init(const D3Q27Interactor *const & /*interactor*/, const real &time)
+void DensityBC::init(const D3Q27Interactor *const & /*interactor*/, const real &time)
 {
     this->timeStep           = time;
     this->tmpDensityFunction = NULL;
@@ -124,18 +125,18 @@ void DensityBCAdapter::init(const D3Q27Interactor *const & /*interactor*/, const
     if (UbMath::greaterEqual(time, maxEndtime))
         this->unsetTimeDependent();
 
-    UBLOG(logDEBUG4, "D3Q27DensityBCAdapter::init(time="
+    UBLOG(logDEBUG4, "D3Q27DensityBC::init(time="
                          << time << ") "
                          << ", rho= \"" << (tmpDensityFunction ? tmpDensityFunction->GetExpr() : "-")
                          << "\", timedependant=" << (this->isTimeDependent() ? "true" : "false"));
 }
 /*==========================================================*/
-void DensityBCAdapter::update(const D3Q27Interactor *const &interactor, const real &time)
+void DensityBC::update(const D3Q27Interactor *const &interactor, const real &time)
 {
     this->init(interactor, time);
 }
 /*==========================================================*/
-void DensityBCAdapter::adaptBCForDirection(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
+void DensityBC::adaptBCForDirection(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
                                            const real & /*worldX1*/, const real & /*worldX2*/,
                                            const real & /*worldX3*/, const real &q, const int &fdirection,
                                            const real & /*time*/)
@@ -144,14 +145,14 @@ void DensityBCAdapter::adaptBCForDirection(const D3Q27Interactor & /*interactor*
     bc->setQ((real)q, fdirection);
 }
 /*==========================================================*/
-void DensityBCAdapter::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real &worldX1,
+void DensityBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real &worldX1,
                                const real &worldX2, const real &worldX3, const real &time)
 {
     this->setNodeDensity(interactor, bc, worldX1, worldX2, worldX3, time);
-    bc->setBcAlgorithmType(algorithmType);
+    bc->setBCStrategyType(algorithmType);
 }
 /*==========================================================*/
-void DensityBCAdapter::setNodeDensity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
+void DensityBC::setNodeDensity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
                                       const real &worldX1, const real &worldX2, const real &worldX3,
                                       const real &timestep)
 {
@@ -176,7 +177,7 @@ void DensityBCAdapter::setNodeDensity(const D3Q27Interactor & /*interactor*/, SP
     }
 }
 /*==========================================================*/
-real DensityBCAdapter::getDensity(const real &x1, const real &x2, const real &x3, const real &timeStep)
+real DensityBC::getDensity(const real &x1, const real &x2, const real &x3, const real &timeStep)
 {
     this->x1       = x1;
     this->x2       = x2;
@@ -184,15 +185,15 @@ real DensityBCAdapter::getDensity(const real &x1, const real &x2, const real &x3
     this->timeStep = timeStep;
 
     if (!tmpDensityFunction)
-        return 0.0;
+        return vf::lbm::constant::c0o1;
 
     return tmpDensityFunction->Eval();
 }
 /*==========================================================*/
-string DensityBCAdapter::toString()
+string DensityBC::toString()
 {
     stringstream info;
-    info << "D3Q27DensityBCAdapter:\n";
+    info << "D3Q27DensityBC:\n";
     info << " #dens-functions = " << (int)densBCs.size() << endl;
     info << " protected variables: x1, x2, x3, t" << endl;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBCAdapter.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.h
similarity index 88%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBCAdapter.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.h
index 74bfea4dd533ca8bbe81a5941ab302e3ffb06a95..b51fb984a7b5ea1e463e06a43ff4d2691d444341 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBCAdapter.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.h
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file DensityBCAdapter.h
+//! \file DensityBC.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef DensityBCAdapter_H
-#define DensityBCAdapter_H
+#ifndef DensityBC_H
+#define DensityBC_H
 
 #include <iostream>
 #include <sstream>
@@ -42,10 +42,10 @@
 //#include "basics/utilities/UbMath.h"
 #include "basics/utilities/UbTuple.h"
 
-#include "BCAdapter.h"
+#include "BC.h"
 #include "BCFunction.h"
 
-//*  DensityBCAdapter                                                            */
+//*  DensityBC                                                            */
 //*                                                                         */
 //**
 //<BR><BR>
@@ -57,15 +57,15 @@
 // usage: ...
 //*/
 
-class DensityBCAdapter : public BCAdapter
+class DensityBC : public BC
 {
 public:
     // constructors
-    DensityBCAdapter() { this->init(); }
-    DensityBCAdapter(const real &dens, const real &startTime = 0.0, const real &endTime = BCFunction::INFCONST);
-    DensityBCAdapter(const BCFunction &densBC);
-    DensityBCAdapter(const std::vector<BCFunction> &densBCs);
-    DensityBCAdapter(const mu::Parser &function, const real &startTime = 0.0,
+    DensityBC() { this->init(); }
+    DensityBC(const real &dens, const real &startTime = 0.0, const real &endTime = BCFunction::INFCONST);
+    DensityBC(const BCFunction &densBC);
+    DensityBC(const std::vector<BCFunction> &densBCs);
+    DensityBC(const mu::Parser &function, const real &startTime = 0.0,
                      const real &endTime = BCFunction::INFCONST);
 
     //------------- implements D3Q27BoundaryConditionAdapter ----- start
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
index fa5dc1bdeff9112a7a0c1a26b9c52ee5f27012a5..77a4601ea352efe1b25c9c509077f533e44f63dd 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
@@ -26,34 +26,34 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file EqDensityBCAlgorithm.cpp
+//! \file EqDensityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "EqDensityBCAlgorithm.h"
+#include "EqDensityBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 
-EqDensityBCAlgorithm::EqDensityBCAlgorithm()
+EqDensityBCStrategy::EqDensityBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::EqDensityBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::EqDensityBCStrategy;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-EqDensityBCAlgorithm::~EqDensityBCAlgorithm() = default;
+EqDensityBCStrategy::~EqDensityBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> EqDensityBCAlgorithm::clone()
+SPtr<BCStrategy> EqDensityBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new EqDensityBCAlgorithm());
+    SPtr<BCStrategy> bc(new EqDensityBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void EqDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void EqDensityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void EqDensityBCAlgorithm::applyBC()
+void EqDensityBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.h
similarity index 88%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.h
index 173b6b12f46fa46d021c17345b203a97862c7949..2de16acdd11665f1535611d3820f8f4909f5fc97 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file EqDensityBCAlgorithm.h
+//! \file EqDensityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef EqDensityBCAlgorithm_h__
-#define EqDensityBCAlgorithm_h__
+#ifndef EqDensityBCStrategy_h__
+#define EqDensityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class EqDensityBCAlgorithm : public BCAlgorithm
+class EqDensityBCStrategy : public BCStrategy
 {
 public:
-    EqDensityBCAlgorithm();
-    ~EqDensityBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
+    EqDensityBCStrategy();
+    ~EqDensityBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
-#endif // EqDensityBCAlgorithm_h__
+#endif // EqDensityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCAlgorithm.h
deleted file mode 100644
index bb033d409cd84a2b419aa46599a61ca1e8d29aad..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCAlgorithm.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file HighViscosityNoSlipBCAlgorithm.h
-//! \ingroup BoundarConditions
-//! \author Konstantin Kutscher
-//=======================================================================================
-#ifndef HighViscosityNoSlipBCAlgorithm_h__
-#define HighViscosityNoSlipBCAlgorithm_h__
-
-#include "BCAlgorithm.h"
-#include <PointerDefinitions.h>
-
-class DistributionArray3D;
-
-class HighViscosityNoSlipBCAlgorithm : public BCAlgorithm
-{
-public:
-    HighViscosityNoSlipBCAlgorithm();
-    ~HighViscosityNoSlipBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
-    void addDistributions(SPtr<DistributionArray3D> distributions) override;
-    void applyBC() override;
-};
-#endif // HighViscosityNoSlipBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
similarity index 84%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
index 3ed53ee85f2047cedc5cdc6eb71f607ca8792b6f..227b5ca3513d96c79db46cf0e1653d9ea8c47ee1 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
@@ -26,34 +26,34 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file HighViscosityNoSlipBCAlgorithm.cpp
+//! \file HighViscosityNoSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "HighViscosityNoSlipBCAlgorithm.h"
+#include "HighViscosityNoSlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 
-HighViscosityNoSlipBCAlgorithm::HighViscosityNoSlipBCAlgorithm()
+HighViscosityNoSlipBCStrategy::HighViscosityNoSlipBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::HighViscosityNoSlipBCAlgorithm;
-    BCAlgorithm::preCollision = true;
+    BCStrategy::type         = BCStrategy::HighViscosityNoSlipBCStrategy;
+    BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
-HighViscosityNoSlipBCAlgorithm::~HighViscosityNoSlipBCAlgorithm() = default;
+HighViscosityNoSlipBCStrategy::~HighViscosityNoSlipBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> HighViscosityNoSlipBCAlgorithm::clone()
+SPtr<BCStrategy> HighViscosityNoSlipBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new HighViscosityNoSlipBCAlgorithm());
+    SPtr<BCStrategy> bc(new HighViscosityNoSlipBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void HighViscosityNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void HighViscosityNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void HighViscosityNoSlipBCAlgorithm::applyBC()
+void HighViscosityNoSlipBCStrategy::applyBC()
 {
     real f[D3Q27System::ENDF + 1];
     real feq[D3Q27System::ENDF + 1];
@@ -69,7 +69,7 @@ void HighViscosityNoSlipBCAlgorithm::applyBC()
             real q        = bcPtr->getQ(invDir);
             real fReturn =
                 (f[invDir] + q * f[fDir] + q * collFactor * (feq[invDir] - f[invDir] + feq[fDir] - f[fDir])) /
-                (1.0 + q);
+                (vf::lbm::constant::c1o1 + q);
             distributions->setDistributionInvForDirection(fReturn, x1 + D3Q27System::DX1[invDir],
                                                           x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir],
                                                           invDir);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.h
new file mode 100644
index 0000000000000000000000000000000000000000..e153a67e644530f52977f1644c30426acce44843
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.h
@@ -0,0 +1,50 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file HighViscosityNoSlipBCStrategy.h
+//! \ingroup BoundarConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+#ifndef HighViscosityNoSlipBCStrategy_h__
+#define HighViscosityNoSlipBCStrategy_h__
+
+#include "BCStrategy.h"
+#include <PointerDefinitions.h>
+
+class DistributionArray3D;
+
+class HighViscosityNoSlipBCStrategy : public BCStrategy
+{
+public:
+    HighViscosityNoSlipBCStrategy();
+    ~HighViscosityNoSlipBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
+    void addDistributions(SPtr<DistributionArray3D> distributions) override;
+    void applyBC() override;
+};
+#endif // HighViscosityNoSlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new
deleted file mode 100644
index 7c21b30c8931e6f321abc3c9822eadb678f842f3..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new
+++ /dev/null
@@ -1,151 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file MultiphaseVelocityBCAlgorithm.cpp
-//! \ingroup BoundarConditions
-//! \author Hesameddin Safari
-//=======================================================================================
-
-#include "MultiphaseVelocityBCAlgorithm.h"
-#include "DistributionArray3D.h"
-#include "BoundaryConditions.h"
-
-MultiphaseVelocityBCAlgorithm::MultiphaseVelocityBCAlgorithm()
-{
-    BCAlgorithm::type = BCAlgorithm::MultiphaseVelocityBCAlgorithm;
-   BCAlgorithm::preCollision = false;
-}
-//////////////////////////////////////////////////////////////////////////
-MultiphaseVelocityBCAlgorithm::~MultiphaseVelocityBCAlgorithm()
-{
-}
-//////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> MultiphaseVelocityBCAlgorithm::clone()
-{
-   SPtr<BCAlgorithm> bc(new MultiphaseVelocityBCAlgorithm());
-   return bc;
-}
-//////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
-{
-   this->distributions = distributions;
-}
-//////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
-{
-	this->distributionsH = distributionsH;
-}
-//////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH)
-{
-    this->distributionsH2 = distributionsH;
-}
-//////////////////////////////////////////////////////////////////////////
-void MultiphaseVelocityBCAlgorithm::applyBC()
-{
-   LBMReal f[D3Q27System::ENDF+1];
-   LBMReal h[D3Q27System::ENDF+1];
-   LBMReal h2[D3Q27System::ENDF + 1];
-   LBMReal feq[D3Q27System::ENDF+1];
-   LBMReal heq[D3Q27System::ENDF+1];
-   LBMReal htemp[D3Q27System::ENDF+1];
-   
-   distributions->getDistributionInv(f, x1, x2, x3);
-   distributionsH->getDistributionInv(h, x1, x2, x3);
-   if (distributionsH2)
-       distributionsH2->getDistributionInv(h2, x1, x2, x3);
-   LBMReal phi, vx1, vx2, vx3, p1, phiBC;
-   
-   D3Q27System::calcDensity(h, phi);
-
-   calcMacrosFct(f, p1, vx1, vx2, vx3);
-   vx1=bcPtr->getBoundaryVelocityX1();
-   vx2 = bcPtr->getBoundaryVelocityX2();
-   vx3 = bcPtr->getBoundaryVelocityX3();
-   p1 = 0.0;
-   D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
-   D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3);
-
-   ///// added for phase field //////
-
-   int nx1 = x1;
-   int nx2 = x2;
-   int nx3 = x3;
-
-   //flag points in direction of fluid
-   if      (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; }
-   //else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
-   
-   phiBC = bcPtr->getBoundaryPhaseField();
-   
-   D3Q27System::calcMultiphaseHeq(htemp, phiBC, vx1, vx2, vx3);
-   //D3Q27System::calcMultiphaseHeq(htemp, phiBC, bcPtr->getBoundaryVelocityX1(), bcPtr->getBoundaryVelocityX2(), bcPtr->getBoundaryVelocityX2());//30.03.2021 EQ phase field BC!
-   //for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++)
-   //{
-	  // if (bcPtr->hasVelocityBoundaryFlag(fdir))
-	  // {
-		 //  LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir];
-   //        //17.03.2021 Let us just set the plain eq
-   //        //LBMReal hReturn = htemp[fdir];
-		 //  distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir);
-   //      //  if (distributionsH2)
-   //      //      distributionsH2->setDistributionForDirection(0, nx1, nx2, nx3, fdir);
-	  // }
-   //}
-   
-   for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
-   {
-      if (bcPtr->hasVelocityBoundaryFlag(fdir))
-      {
-         const int invDir = D3Q27System::INVDIR[fdir];
-         //LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler
-         LBMReal velocity = bcPtr->getBoundaryVelocity(invDir);
-		 //16.03.2021 quick fix for velocity BC
-         LBMReal fReturn = f[invDir] - velocity;
-         //LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity)/(1.0+q));
-        // distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);//no delay BB
-         distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB  
-
-         LBMReal hReturn = htemp[invDir]+h[invDir] - heq[invDir];
-         distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB  
-         if (distributionsH2) {
-             fReturn = h2[invDir] ;
-            // distributionsH2->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
-             distributionsH2->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB 
-         }
-
-      }
-   }
-
-}
-
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAdapter.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.cpp
similarity index 97%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAdapter.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.cpp
index 4b272878a4bd30d1031c2894ac9994db6a966a6f..d49cffe64085e9a5d5e865cde0c899bdab543791 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAdapter.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.cpp
@@ -26,8 +26,8 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NoSlipBCAdapter.cpp
+//! \file NoSlipBC.cpp
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
-#include "NoSlipBCAdapter.h"
+#include "NoSlipBC.h"
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAdapter.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
similarity index 89%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAdapter.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
index 52eda33082e8031454b00f578a6f520b738c0d42..fe7eecebb9960107793f7bf034de5dd436d58613 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAdapter.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
@@ -26,22 +26,22 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NoSlipBCAdapter.cpp
+//! \file NoSlipBC.cpp
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
 
-#ifndef NoSlipBCAdapter_H
-#define NoSlipBCAdapter_H
+#ifndef NoSlipBC_H
+#define NoSlipBC_H
 
-#include "BCAdapter.h"
+#include "BC.h"
 
 //! A class provides an interface for no-slip boundary condition in grid generator
-class NoSlipBCAdapter : public BCAdapter
+class NoSlipBC : public BC
 {
 public:
-    NoSlipBCAdapter() : BCAdapter() {}
-    NoSlipBCAdapter(const short &secondaryBcOption) : BCAdapter(secondaryBcOption) {}
+    NoSlipBC() : BC() {}
+    NoSlipBC(const short &secondaryBcOption) : BC(secondaryBcOption) {}
 
     void init(const D3Q27Interactor *const &interactor, const real &time = 0) override {}
     void update(const D3Q27Interactor *const &interactor, const real &time = 0) override {}
@@ -56,9 +56,9 @@ public:
     void adaptBC(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc, const real & /*worldX1*/,
                  const real & /*worldX2*/, const real & /*worldX3*/, const real & /*time*/ = 0) override
     {
-        bc->setBcAlgorithmType(algorithmType);
+        bc->setBCStrategyType(algorithmType);
     }
 
 private:
 };
-#endif // NoSlipBCAdapter_H
+#endif // NoSlipBC_H
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
similarity index 82%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
index f89c74513289ab2787cbef0dbe504d913510afc5..ea1fd5f38d0a0492c4756e7ad7fb9438868c41a0 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
@@ -26,33 +26,33 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NoSlipBCAlgorithm.cpp
+//! \file NoSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "NoSlipBCAlgorithm.h"
+#include "NoSlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 
-NoSlipBCAlgorithm::NoSlipBCAlgorithm()
+NoSlipBCStrategy::NoSlipBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::NoSlipBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::NoSlipBCStrategy;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> NoSlipBCAlgorithm::clone()
+SPtr<BCStrategy> NoSlipBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new NoSlipBCAlgorithm());
+    SPtr<BCStrategy> bc(new NoSlipBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void NoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void NoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void NoSlipBCAlgorithm::applyBC()
+void NoSlipBCStrategy::applyBC()
 {
     real f[D3Q27System::ENDF + 1];
     real feq[D3Q27System::ENDF + 1];
@@ -66,8 +66,8 @@ void NoSlipBCAlgorithm::applyBC()
             // quadratic bounce back
             const int invDir = D3Q27System::INVDIR[fdir];
             real q        = bcPtr->getQ(invDir);
-            real fReturn = ((1.0 - q) / (1.0 + q)) * ((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) +
-                              ((q / (1.0 + q)) * (f[invDir] + f[fdir]));
+            real fReturn = ((vf::lbm::constant::c1o1 - q) / (vf::lbm::constant::c1o1 + q)) * ((f[invDir] - feq[invDir]) / (vf::lbm::constant::c1o1 - collFactor) + feq[invDir]) +
+                              ((q / (vf::lbm::constant::c1o1 + q)) * (f[invDir] + f[fdir]));
             distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir],
                                                        x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir],
                                                        fdir);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.h
similarity index 91%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.h
index dcf678b4f05bd2c50403bfd758cd27767f45d33a..d45526f373816f38a85ede287ffe975150bd96af 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NoSlipBCAlgorithm.h
+//! \file NoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef NoSlipBCAlgorithm_h__
-#define NoSlipBCAlgorithm_h__
+#ifndef NoSlipBCStrategy_h__
+#define NoSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
 //! A class implements no-slip boundary condition
-class NoSlipBCAlgorithm : public BCAlgorithm
+class NoSlipBCStrategy : public BCStrategy
 {
 public:
-    NoSlipBCAlgorithm();
-    SPtr<BCAlgorithm> clone() override;
+    NoSlipBCStrategy();
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
index 2787d685cbd3b71b879c3fabc1c114e0e61eef8d..d3f44c6ff7ce9d8acf913a8cebd3e42800b7a571 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
@@ -26,35 +26,35 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonEqDensityBCAlgorithm.cpp
+//! \file NonEqDensityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "NonEqDensityBCAlgorithm.h"
+#include "NonEqDensityBCStrategy.h"
 
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 
-NonEqDensityBCAlgorithm::NonEqDensityBCAlgorithm()
+NonEqDensityBCStrategy::NonEqDensityBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::NonEqDensityBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::NonEqDensityBCStrategy;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-NonEqDensityBCAlgorithm::~NonEqDensityBCAlgorithm() = default;
+NonEqDensityBCStrategy::~NonEqDensityBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> NonEqDensityBCAlgorithm::clone()
+SPtr<BCStrategy> NonEqDensityBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new NonEqDensityBCAlgorithm());
+    SPtr<BCStrategy> bc(new NonEqDensityBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonEqDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void NonEqDensityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonEqDensityBCAlgorithm::applyBC()
+void NonEqDensityBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.h
index ca7d5b0432b74cf371659fee2c6da49f1ee8a9eb..d919a673e9cb344b51e826addf9b1fafe56b41f4 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonEqDensityBCAlgorithm.h
+//! \file NonEqDensityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef NonEqDensityBCAlgorithm_h__
-#define NonEqDensityBCAlgorithm_h__
+#ifndef NonEqDensityBCStrategy_h__
+#define NonEqDensityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class NonEqDensityBCAlgorithm : public BCAlgorithm
+class NonEqDensityBCStrategy : public BCStrategy
 {
 public:
-    NonEqDensityBCAlgorithm();
-    ~NonEqDensityBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
+    NonEqDensityBCStrategy();
+    ~NonEqDensityBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
-#endif // NonEqDensityBCAlgorithm_h__
+#endif // NonEqDensityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
similarity index 97%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
index 078e8bfb4c574b9a6fe90a5bd569d2969237eb66..d67de5342a716dc0da076518109908540945aa78 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
@@ -26,36 +26,36 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonReflectingInflowBCAlgorithm.cpp
+//! \file NonReflectingInflowBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Hussein Alihussein
 //=======================================================================================
-#include "NonReflectingInflowBCAlgorithm.h"
+#include "NonReflectingInflowBCStrategy.h"
 
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
 
-NonReflectingInflowBCAlgorithm::NonReflectingInflowBCAlgorithm()
+NonReflectingInflowBCStrategy::NonReflectingInflowBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::NonReflectingInflowBCAlgorithm;
-    BCAlgorithm::preCollision = true;
+    BCStrategy::type         = BCStrategy::NonReflectingInflowBCStrategy;
+    BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
-NonReflectingInflowBCAlgorithm::~NonReflectingInflowBCAlgorithm() = default;
+NonReflectingInflowBCStrategy::~NonReflectingInflowBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> NonReflectingInflowBCAlgorithm::clone()
+SPtr<BCStrategy> NonReflectingInflowBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new NonReflectingInflowBCAlgorithm());
+    SPtr<BCStrategy> bc(new NonReflectingInflowBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonReflectingInflowBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void NonReflectingInflowBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonReflectingInflowBCAlgorithm::applyBC()
+void NonReflectingInflowBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
     using namespace D3Q27System;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.h
index 1f3e87ce3fff371fbec30dbbe90721bd5ff975cc..b3c9b6ba833d32d7fe551f561e366f581f518eee 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonReflectingInflowBCAlgorithm.h
+//! \file NonReflectingInflowBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Hussein Alihussein
 //=======================================================================================
-#ifndef NonReflectingInflowBCAlgorithm_h__
-#define NonReflectingInflowBCAlgorithm_h__
+#ifndef NonReflectingInflowBCStrategy_h__
+#define NonReflectingInflowBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class NonReflectingInflowBCAlgorithm : public BCAlgorithm
+class NonReflectingInflowBCStrategy : public BCStrategy
 {
 public:
-    NonReflectingInflowBCAlgorithm();
-    ~NonReflectingInflowBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
+    NonReflectingInflowBCStrategy();
+    ~NonReflectingInflowBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
-#endif // NonReflectingDensityBCAlgorithm_h__
+#endif // NonReflectingDensityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.h
deleted file mode 100644
index d664b67fbf5f2d99258f0567f90b0dbd1e728fb5..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file NonReflectingOutflowBCAlgorithm.h
-//! \ingroup BoundarConditions
-//! \author Konstantin Kutscher
-//=======================================================================================
-#ifndef NonReflectingOutflowBCAlgorithm_h__
-#define NonReflectingOutflowBCAlgorithm_h__
-
-#include "BCAlgorithm.h"
-#include <PointerDefinitions.h>
-
-class DistributionArray3D;
-
-class NonReflectingOutflowBCAlgorithm : public BCAlgorithm
-{
-public:
-    NonReflectingOutflowBCAlgorithm();
-    ~NonReflectingOutflowBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
-    void addDistributions(SPtr<DistributionArray3D> distributions) override;
-    void applyBC() override;
-};
-#endif // NonReflectingDensityBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
similarity index 57%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
index efa587d128dbea3ed4403098b4c50328186fddf0..1a74c103328fd411402c34c57ca9749c16ebb3d9 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
@@ -26,36 +26,36 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonReflectingOutflowBCAlgorithm.cpp
+//! \file NonReflectingOutflowBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "NonReflectingOutflowBCAlgorithm.h"
+#include "NonReflectingOutflowBCStrategy.h"
 
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
 
-NonReflectingOutflowBCAlgorithm::NonReflectingOutflowBCAlgorithm()
+NonReflectingOutflowBCStrategy::NonReflectingOutflowBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::NonReflectingOutflowBCAlgorithm;
-    BCAlgorithm::preCollision = true;
+    BCStrategy::type         = BCStrategy::NonReflectingOutflowBCStrategy;
+    BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
-NonReflectingOutflowBCAlgorithm::~NonReflectingOutflowBCAlgorithm() = default;
+NonReflectingOutflowBCStrategy::~NonReflectingOutflowBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> NonReflectingOutflowBCAlgorithm::clone()
+SPtr<BCStrategy> NonReflectingOutflowBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new NonReflectingOutflowBCAlgorithm());
+    SPtr<BCStrategy> bc(new NonReflectingOutflowBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonReflectingOutflowBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void NonReflectingOutflowBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonReflectingOutflowBCAlgorithm::applyBC()
+void NonReflectingOutflowBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
@@ -101,15 +101,15 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
 
     switch (direction) {
         case DIR_P00:
-            f[DIR_P00]   = ftemp[DIR_P00] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_P00];
-            f[DIR_PP0]  = ftemp[DIR_PP0] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PP0];
-            f[DIR_PM0]  = ftemp[DIR_PM0] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PM0];
-            f[DIR_P0P]  = ftemp[DIR_P0P] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_P0P];
-            f[DIR_P0M]  = ftemp[DIR_P0M] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_P0M];
-            f[DIR_PPP] = ftemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PPP];
-            f[DIR_PMP] = ftemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PMP];
-            f[DIR_PPM] = ftemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PPM];
-            f[DIR_PMM] = ftemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 + vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx1) * f[DIR_PMM];
+            f[DIR_P00]   = ftemp[DIR_P00] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P00];
+            f[DIR_PP0]  = ftemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PP0];
+            f[DIR_PM0]  = ftemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PM0];
+            f[DIR_P0P]  = ftemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P0P];
+            f[DIR_P0M]  = ftemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_P0M];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PPP];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PMP];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PPM];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (c1o1 - one_over_sqrt3 - vx1) * f[DIR_PMM];
 
             distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
             distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -122,15 +122,15 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
             break;
         case DIR_M00:
-            f[DIR_M00]   = ftemp[DIR_M00] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_M00];
-            f[DIR_MP0]  = ftemp[DIR_MP0] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MP0];
-            f[DIR_MM0]  = ftemp[DIR_MM0] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MM0];
-            f[DIR_M0P]  = ftemp[DIR_M0P] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_M0P];
-            f[DIR_M0M]  = ftemp[DIR_M0M] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_M0M];
-            f[DIR_MPP] = ftemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MPP];
-            f[DIR_MMP] = ftemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MMP];
-            f[DIR_MPM] = ftemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MPM];
-            f[DIR_MMM] = ftemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx1) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx1) * f[DIR_MMM];
+            f[DIR_M00]   = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M00];
+            f[DIR_MP0]  = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MP0];
+            f[DIR_MM0]  = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MM0];
+            f[DIR_M0P]  = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M0P];
+            f[DIR_M0M]  = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_M0M];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MPP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MMP];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MPM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (c1o1 - one_over_sqrt3 + vx1) * f[DIR_MMM];
 
             distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
             distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
@@ -143,15 +143,15 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
             break;
         case DIR_0P0:
-            f[DIR_0P0]   = ftemp[DIR_0P0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_0P0];
-            f[DIR_PP0]  = ftemp[DIR_PP0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_PP0];
-            f[DIR_MP0]  = ftemp[DIR_MP0] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_MP0];
-            f[DIR_0PP]  = ftemp[DIR_0PP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_0PP];
-            f[DIR_0PM]  = ftemp[DIR_0PM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_0PM];
-            f[DIR_PPP] = ftemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_PPP];
-            f[DIR_MPP] = ftemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_MPP];
-            f[DIR_PPM] = ftemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_PPM];
-            f[DIR_MPM] = ftemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 + vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx2) * f[DIR_MPM];
+            f[DIR_0P0]   = ftemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0P0];
+            f[DIR_PP0]  = ftemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PP0];
+            f[DIR_MP0]  = ftemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MP0];
+            f[DIR_0PP]  = ftemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0PP];
+            f[DIR_0PM]  = ftemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_0PM];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PPP];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MPP];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_PPM];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (c1o1 - one_over_sqrt3 - vx2) * f[DIR_MPM];
 
             distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
             distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
@@ -164,15 +164,15 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
             break;
         case DIR_0M0:
-            f[DIR_0M0]   = ftemp[DIR_0M0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_0M0];
-            f[DIR_PM0]  = ftemp[DIR_PM0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_PM0];
-            f[DIR_MM0]  = ftemp[DIR_MM0] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_MM0];
-            f[DIR_0MP]  = ftemp[DIR_0MP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_0MP];
-            f[DIR_0MM]  = ftemp[DIR_0MM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_0MM];
-            f[DIR_PMP] = ftemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_PMP];
-            f[DIR_MMP] = ftemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_MMP];
-            f[DIR_PMM] = ftemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_PMM];
-            f[DIR_MMM] = ftemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx2) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx2) * f[DIR_MMM];
+            f[DIR_0M0]   = ftemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0M0];
+            f[DIR_PM0]  = ftemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PM0];
+            f[DIR_MM0]  = ftemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MM0];
+            f[DIR_0MP]  = ftemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0MP];
+            f[DIR_0MM]  = ftemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_0MM];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PMP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MMP];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_PMM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (c1o1 - one_over_sqrt3 + vx2) * f[DIR_MMM];
 
             distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
             distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
@@ -185,15 +185,15 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
             break;
         case DIR_00P:
-            f[DIR_00P]   = ftemp[DIR_00P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_00P];
-            f[DIR_P0P]  = ftemp[DIR_P0P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_P0P];
-            f[DIR_M0P]  = ftemp[DIR_M0P] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_M0P];
-            f[DIR_0PP]  = ftemp[DIR_0PP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_0PP];
-            f[DIR_0MP]  = ftemp[DIR_0MP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_0MP];
-            f[DIR_PPP] = ftemp[DIR_PPP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_PPP];
-            f[DIR_MPP] = ftemp[DIR_MPP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_MPP];
-            f[DIR_PMP] = ftemp[DIR_PMP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_PMP];
-            f[DIR_MMP] = ftemp[DIR_MMP] * (vf::lbm::constant::one_over_sqrt3 + vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 - vx3) * f[DIR_MMP];
+            f[DIR_00P]   = ftemp[DIR_00P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_00P];
+            f[DIR_P0P]  = ftemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_P0P];
+            f[DIR_M0P]  = ftemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_M0P];
+            f[DIR_0PP]  = ftemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_0PP];
+            f[DIR_0MP]  = ftemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_0MP];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_PPP];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_MPP];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_PMP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (c1o1 - one_over_sqrt3 - vx3) * f[DIR_MMP];
 
             distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
             distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
@@ -206,15 +206,15 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
             distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
             break;
         case DIR_00M:
-            f[DIR_00M]   = ftemp[DIR_00M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_00M];
-            f[DIR_P0M]  = ftemp[DIR_P0M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_P0M];
-            f[DIR_M0M]  = ftemp[DIR_M0M] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_M0M];
-            f[DIR_0PM]  = ftemp[DIR_0PM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_0PM];
-            f[DIR_0MM]  = ftemp[DIR_0MM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_0MM];
-            f[DIR_PPM] = ftemp[DIR_PPM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_PPM];
-            f[DIR_MPM] = ftemp[DIR_MPM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_MPM];
-            f[DIR_PMM] = ftemp[DIR_PMM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_PMM];
-            f[DIR_MMM] = ftemp[DIR_MMM] * (vf::lbm::constant::one_over_sqrt3 - vx3) + (1.0 - vf::lbm::constant::one_over_sqrt3 + vx3) * f[DIR_MMM];
+            f[DIR_00M]   = ftemp[DIR_00M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_00M];
+            f[DIR_P0M]  = ftemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_P0M];
+            f[DIR_M0M]  = ftemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_M0M];
+            f[DIR_0PM]  = ftemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_0PM];
+            f[DIR_0MM]  = ftemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_0MM];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_PPM];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_MPM];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_PMM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (c1o1 - one_over_sqrt3 + vx3) * f[DIR_MMM];
 
             distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
             distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.h
new file mode 100644
index 0000000000000000000000000000000000000000..7fca99885755f78ca4088dd031511d774bfc4115
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.h
@@ -0,0 +1,50 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file NonReflectingOutflowBCStrategy.h
+//! \ingroup BoundarConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+#ifndef NonReflectingOutflowBCStrategy_h__
+#define NonReflectingOutflowBCStrategy_h__
+
+#include "BCStrategy.h"
+#include <PointerDefinitions.h>
+
+class DistributionArray3D;
+
+class NonReflectingOutflowBCStrategy : public BCStrategy
+{
+public:
+    NonReflectingOutflowBCStrategy();
+    ~NonReflectingOutflowBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
+    void addDistributions(SPtr<DistributionArray3D> distributions) override;
+    void applyBC() override;
+};
+#endif // NonReflectingDensityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
similarity index 96%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
index ce2c5a6268fd8d1a69d4c56a6ddbebe2df587b6c..3c52e1a4b0eac33d7eaf2ece785f6f917993d633 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
@@ -26,36 +26,36 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonReflectingOutflowBCAlgorithmWithRelaxation.cpp
+//! \file NonReflectingOutflowWithRelaxationBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher, Hussein Alihussein
 //=======================================================================================
-#include "NonReflectingOutflowBCAlgorithmWithRelaxation.h"
+#include "NonReflectingOutflowWithRelaxationBCStrategy.h"
 
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
 
-NonReflectingOutflowBCAlgorithmWithRelaxation::NonReflectingOutflowBCAlgorithmWithRelaxation()
+NonReflectingOutflowWithRelaxationBCStrategy::NonReflectingOutflowWithRelaxationBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::NonReflectingOutflowBCAlgorithmWithRelaxation;
-    BCAlgorithm::preCollision = true;
+    BCStrategy::type         = BCStrategy::NonReflectingOutflowWithRelaxationBCStrategy;
+    BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
-NonReflectingOutflowBCAlgorithmWithRelaxation::~NonReflectingOutflowBCAlgorithmWithRelaxation() = default;
+NonReflectingOutflowWithRelaxationBCStrategy::~NonReflectingOutflowWithRelaxationBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> NonReflectingOutflowBCAlgorithmWithRelaxation::clone()
+SPtr<BCStrategy> NonReflectingOutflowWithRelaxationBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new NonReflectingOutflowBCAlgorithmWithRelaxation());
+    SPtr<BCStrategy> bc(new NonReflectingOutflowWithRelaxationBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonReflectingOutflowBCAlgorithmWithRelaxation::addDistributions(SPtr<DistributionArray3D> distributions)
+void NonReflectingOutflowWithRelaxationBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void NonReflectingOutflowBCAlgorithmWithRelaxation::applyBC()
+void NonReflectingOutflowWithRelaxationBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.h
index 97badb60dbe84e0b7a4a3fa82b950649e0a12d93..e8179c706f204494ac383b519fa22ef78de5d5ac 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithmWithRelaxation.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NonReflectingOutflowBCAlgorithmWithRelaxation.h
+//! \file NonReflectingOutflowWithRelaxationBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher, Hussein Alihussein
 //=======================================================================================
-#ifndef NonReflectingOutflowBCAlgorithmWithRelaxation_h__
-#define NonReflectingOutflowBCAlgorithmWithRelaxation_h__
+#ifndef NonReflectingOutflowWithRelaxationBCStrategy_h__
+#define NonReflectingOutflowWithRelaxationBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class NonReflectingOutflowBCAlgorithmWithRelaxation : public BCAlgorithm
+class NonReflectingOutflowWithRelaxationBCStrategy : public BCStrategy
 {
 public:
-    NonReflectingOutflowBCAlgorithmWithRelaxation();
-    ~NonReflectingOutflowBCAlgorithmWithRelaxation() override;
-    SPtr<BCAlgorithm> clone() override;
+    NonReflectingOutflowWithRelaxationBCStrategy();
+    ~NonReflectingOutflowWithRelaxationBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
-#endif // NonReflectingDensityBCAlgorithm_h__
+#endif // NonReflectingDensityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
similarity index 91%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
index 5dbe30e7b172e149dcfe812f5ba9297d6caaa3df..fee0f71a25ad90b44a61f946925a842bb10531f3 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
@@ -26,37 +26,37 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file SimpleSlipBCAlgorithm.cpp
+//! \file SimpleSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "SimpleSlipBCAlgorithm.h"
+#include "SimpleSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-SimpleSlipBCAlgorithm::SimpleSlipBCAlgorithm()
+SimpleSlipBCStrategy::SimpleSlipBCStrategy()
 {
-   BCAlgorithm::type = BCAlgorithm::SimpleSlipBCAlgorithm;
-   BCAlgorithm::preCollision = false;
+   BCStrategy::type = BCStrategy::SimpleSlipBCStrategy;
+   BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-SimpleSlipBCAlgorithm::~SimpleSlipBCAlgorithm()
+SimpleSlipBCStrategy::~SimpleSlipBCStrategy()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> SimpleSlipBCAlgorithm::clone()
+SPtr<BCStrategy> SimpleSlipBCStrategy::clone()
 {
-   SPtr<BCAlgorithm> bc(new SimpleSlipBCAlgorithm());
+   SPtr<BCStrategy> bc(new SimpleSlipBCStrategy());
    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void SimpleSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void SimpleSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void SimpleSlipBCAlgorithm::applyBC()
+void SimpleSlipBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
@@ -67,7 +67,7 @@ void SimpleSlipBCAlgorithm::applyBC()
    calcMacrosFct(f, drho, vx1, vx2, vx3);
    calcFeqFct(feq, drho, vx1, vx2, vx3);
 
-   rho = 1.0 + drho * compressibleFactor;
+   rho = vf::lbm::constant::c1o1 + drho * compressibleFactor;
 
    UbTupleFloat3 normale = bcPtr->getNormalVector();
    real amp = vx1*val<1>(normale)+vx2*val<2>(normale)+vx3*val<3>(normale);
@@ -82,7 +82,7 @@ void SimpleSlipBCAlgorithm::applyBC()
       {
          //quadratic bounce back
          const int invDir = D3Q27System::INVDIR[fdir];
-         real velocity = 0.0;
+         real velocity = vf::lbm::constant::c0o1;
          switch (invDir)
          {
          case DIR_P00: velocity = (vf::lbm::constant::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.h
similarity index 88%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.h
index bfe4a766bc4fe1f05cf55cb679cfb3900f574c39..294c7fdf648603359f14aa1a0bf4f769d6672f05 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.h
@@ -26,26 +26,26 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file SimpleVelocityBCAlgorithm.h
+//! \file SimpleVelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef SimpleSlipBCAlgorithm_h__
-#define SimpleSlipBCAlgorithm_h__
+#ifndef SimpleSlipBCStrategy_h__
+#define SimpleSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
 //! \brief A class implements slip boundary condition by using simple bounce back
-class SimpleSlipBCAlgorithm : public BCAlgorithm
+class SimpleSlipBCStrategy : public BCStrategy
 {
 public:
-   SimpleSlipBCAlgorithm();
-   virtual ~SimpleSlipBCAlgorithm();
-   SPtr<BCAlgorithm> clone() override;
+   SimpleSlipBCStrategy();
+   virtual ~SimpleSlipBCStrategy();
+   SPtr<BCStrategy> clone() override;
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void applyBC() override;
 };
-#endif // SimpleSlipBCAlgorithm_h__
+#endif // SimpleSlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
similarity index 86%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
index 83badd723e2c9bda222abaccdb09fbc352bc46af..2206e71541d6d264fd91146be5641ba75ed5b4d3 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
@@ -26,37 +26,37 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file SimpleVelocityBCAlgorithm.cpp
+//! \file SimpleVelocityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "SimpleVelocityBCAlgorithm.h"
+#include "SimpleVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
 
-SimpleVelocityBCAlgorithm::SimpleVelocityBCAlgorithm()
+SimpleVelocityBCStrategy::SimpleVelocityBCStrategy()
 {
-   BCAlgorithm::type = BCAlgorithm::SimpleVelocityBCAlgorithm;
-   BCAlgorithm::preCollision = false;
+   BCStrategy::type = BCStrategy::SimpleVelocityBCStrategy;
+   BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-SimpleVelocityBCAlgorithm::~SimpleVelocityBCAlgorithm()
+SimpleVelocityBCStrategy::~SimpleVelocityBCStrategy()
 {
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> SimpleVelocityBCAlgorithm::clone()
+SPtr<BCStrategy> SimpleVelocityBCStrategy::clone()
 {
-   SPtr<BCAlgorithm> bc(new SimpleVelocityBCAlgorithm());
+   SPtr<BCStrategy> bc(new SimpleVelocityBCStrategy());
    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void SimpleVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void SimpleVelocityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void SimpleVelocityBCAlgorithm::applyBC()
+void SimpleVelocityBCStrategy::applyBC()
 {
    real f[D3Q27System::ENDF+1];
    real feq[D3Q27System::ENDF+1];
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.h
similarity index 89%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.h
index b751d220c0cd15b597969fd9980184c16c5de36c..597e69a386ad03c0eb29ea62a77563b84c72435c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.h
@@ -26,26 +26,26 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file SimpleVelocityBCAlgorithm.h
+//! \file SimpleVelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef SimpleVelocityBCAlgorithm_H
-#define SimpleVelocityBCAlgorithm_H
+#ifndef SimpleVelocityBCStrategy_H
+#define SimpleVelocityBCStrategy_H
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
 //! \brief A class implements velocyty boundary condition
-class SimpleVelocityBCAlgorithm : public BCAlgorithm
+class SimpleVelocityBCStrategy : public BCStrategy
 {
 public:
-   SimpleVelocityBCAlgorithm();
-   ~SimpleVelocityBCAlgorithm();
-   SPtr<BCAlgorithm> clone() override;
+   SimpleVelocityBCStrategy();
+   ~SimpleVelocityBCStrategy();
+   SPtr<BCStrategy> clone() override;
    void addDistributions(SPtr<DistributionArray3D> distributions) override;
    void applyBC() override;
 };
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
similarity index 76%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
index 8f8299850d2299f75903a42a2b59512e093d6172..d47bff6d22f8c44db69597c7b546e18a03c6518d 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
@@ -26,27 +26,27 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file SlipBCAdapter.cpp
+//! \file SlipBC.cpp
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
-#include "SlipBCAdapter.h"
+#include "SlipBC.h"
 #include "D3Q27Interactor.h"
 #include "D3Q27System.h"
 #include "geometry3d/GbCuboid3D.h"
 
 //*==========================================================*/
-// ObObject* D3Q27SlipBCAdapterCreator::createObObject()
+// ObObject* D3Q27SlipBCCreator::createObObject()
 //{
-//   return new D3Q27SlipBCAdapter;
+//   return new D3Q27SlipBC;
 //}
 //*==========================================================*/
-// ObObjectCreator* D3Q27SlipBCAdapter::getCreator()
+// ObObjectCreator* D3Q27SlipBC::getCreator()
 //{
-//   return D3Q27SlipBCAdapterCreator::getInstance();
+//   return D3Q27SlipBCCreator::getInstance();
 //}
 //*==========================================================*/
-void SlipBCAdapter::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real & /*worldX1*/,
+void SlipBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real & /*worldX1*/,
                             const real & /*worldX2*/, const real & /*worldX3*/, const real & /*time*/)
 {
     using namespace vf::lbm::dir;
@@ -59,17 +59,17 @@ void SlipBCAdapter::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryCond
         throw UbException(UB_EXARGS, "derzeit nur fuer Cubes valide");
 
     if (bc->hasSlipBoundaryFlag(DIR_P00))
-        bc->setNormalVector(1.0, 0.0, 0.0);
+        bc->setNormalVector(vf::lbm::constant::c1o1, vf::lbm::constant::c0o1, vf::lbm::constant::c0o1);
     else if (bc->hasSlipBoundaryFlag(DIR_M00))
-        bc->setNormalVector(-1.0, 0.0, 0.0);
+        bc->setNormalVector(-vf::lbm::constant::c1o1, vf::lbm::constant::c0o1, vf::lbm::constant::c0o1);
     else if (bc->hasSlipBoundaryFlag(DIR_0P0))
-        bc->setNormalVector(0.0, 1.0, 0.0);
+        bc->setNormalVector(vf::lbm::constant::c0o1, vf::lbm::constant::c1o1, vf::lbm::constant::c0o1);
     else if (bc->hasSlipBoundaryFlag(DIR_0M0))
-        bc->setNormalVector(0.0, -1.0, 0.0);
+        bc->setNormalVector(vf::lbm::constant::c0o1, -vf::lbm::constant::c1o1, vf::lbm::constant::c0o1);
     else if (bc->hasSlipBoundaryFlag(DIR_00P))
-        bc->setNormalVector(0.0, 0.0, 1.0);
+        bc->setNormalVector(vf::lbm::constant::c0o1, vf::lbm::constant::c0o1, vf::lbm::constant::c1o1);
     else if (bc->hasSlipBoundaryFlag(DIR_00M))
-        bc->setNormalVector(0.0, 0.0, -1.0);
+        bc->setNormalVector(vf::lbm::constant::c0o1, vf::lbm::constant::c0o1, -vf::lbm::constant::c1o1);
 
-    bc->setBcAlgorithmType(algorithmType);
+    bc->setBCStrategyType(algorithmType);
 }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.h
similarity index 79%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.h
index 5c2225e0a1212931805207da7bacf1a1a797e290..98205ba32b2d3ccec85346bd89a199e8e9a9049c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.h
@@ -26,43 +26,43 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file SlipBCAdapter.h
+//! \file SlipBC.h
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
-#ifndef SlipBCAdapter_H
-#define SlipBCAdapter_H
+#ifndef SlipBC_H
+#define SlipBC_H
 
-#include "BCAdapter.h"
+#include "BC.h"
 
 /*=======================================================*/
-// D3Q27SlipBCAdapterCreator
-// class D3Q27SlipBCAdapterCreator : public ObObjectCreator
+// D3Q27SlipBCCreator
+// class D3Q27SlipBCCreator : public ObObjectCreator
 //{
 // public:
-//   static D3Q27SlipBCAdapterCreator* getInstance()
+//   static D3Q27SlipBCCreator* getInstance()
 //   {
-//      static D3Q27SlipBCAdapterCreator instance;
+//      static D3Q27SlipBCCreator instance;
 //      return &instance;
 //   }
 //
 //   ObObject* createObObject();
 //
-//   std::string getTypeID() { return "D3Q27SlipBCAdapter";}
-//   std::string toString()  { return "D3Q27SlipBCAdapterCreator"; }
+//   std::string getTypeID() { return "D3Q27SlipBC";}
+//   std::string toString()  { return "D3Q27SlipBCCreator"; }
 //
 // private:
-//   D3Q27SlipBCAdapterCreator( const D3Q27SlipBCAdapterCreator& );                  //no copy allowed
-//   const D3Q27SlipBCAdapterCreator& operator=( const D3Q27SlipBCAdapterCreator& ); //no copy allowed
-//   D3Q27SlipBCAdapterCreator() : ObObjectCreator() {}
+//   D3Q27SlipBCCreator( const D3Q27SlipBCCreator& );                  //no copy allowed
+//   const D3Q27SlipBCCreator& operator=( const D3Q27SlipBCCreator& ); //no copy allowed
+//   D3Q27SlipBCCreator() : ObObjectCreator() {}
 //};
 //
 
-class SlipBCAdapter : public BCAdapter
+class SlipBC : public BC
 {
 public:
-    SlipBCAdapter() : BCAdapter() {}
-    SlipBCAdapter(const short &secondaryBcOption) : BCAdapter(secondaryBcOption) {}
+    SlipBC() : BC() {}
+    SlipBC(const short &secondaryBcOption) : BC(secondaryBcOption) {}
 
     //------------- implements D3Q27BoundaryConditionAdapter ----- start
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.h
deleted file mode 100644
index b7a75969f6895f680bf17c08462f4b788fc31c65..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef SlipBCAlgorithm_h__
-#define SlipBCAlgorithm_h__
-
-#include "BCAlgorithm.h"
-#include <PointerDefinitions.h>
-
-class DistributionArray3D;
-
-class SlipBCAlgorithm : public BCAlgorithm
-{
-public:
-    SlipBCAlgorithm();
-    ~SlipBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
-    void addDistributions(SPtr<DistributionArray3D> distributions) override;
-    void applyBC() override;
-};
-#endif // SlipBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
similarity index 83%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
index ec90ef01246a7ac2001e21ce3646981e61f68f96..cac20a5e73bdf52cecd2b612a5330006fc62f775 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
@@ -1,24 +1,24 @@
-#include "SlipBCAlgorithm.h"
+#include "SlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 
-SlipBCAlgorithm::SlipBCAlgorithm()
+SlipBCStrategy::SlipBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::SlipBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::SlipBCStrategy;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-SlipBCAlgorithm::~SlipBCAlgorithm() = default;
+SlipBCStrategy::~SlipBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> SlipBCAlgorithm::clone()
+SPtr<BCStrategy> SlipBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new SlipBCAlgorithm());
+    SPtr<BCStrategy> bc(new SlipBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void SlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) { this->distributions = distributions; }
+void SlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions) { this->distributions = distributions; }
 //////////////////////////////////////////////////////////////////////////
-void SlipBCAlgorithm::applyBC()
+void SlipBCStrategy::applyBC()
 {
     using namespace vf::lbm::dir;
 
@@ -36,7 +36,7 @@ void SlipBCAlgorithm::applyBC()
     vx2 = vx2 - amp * val<2>(normale); // normale zeigt von struktur weg!
     vx3 = vx3 - amp * val<3>(normale); // normale zeigt von struktur weg!
 
-    rho = 1.0 + drho * compressibleFactor;
+    rho = vf::lbm::constant::c1o1 + drho * compressibleFactor;
 
    for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
    {
@@ -46,7 +46,7 @@ void SlipBCAlgorithm::applyBC()
          const int invDir = D3Q27System::INVDIR[fdir];
          real q = bcPtr->getQ(invDir);// m+m q=0 stabiler
          //vx3=0;
-         real velocity = 0.0;
+         real velocity = vf::lbm::constant::c0o1;
          switch (invDir)
          {
          case DIR_P00: velocity = (vf::lbm::constant::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
@@ -77,7 +77,7 @@ void SlipBCAlgorithm::applyBC()
          case DIR_MPP: velocity = (vf::lbm::constant::c1o36*(-vx1+vx2+vx3)); break;
          default: throw UbException(UB_EXARGS, "unknown error");
          }
-         real fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q));
+         real fReturn = ((vf::lbm::constant::c1o1-q)/(vf::lbm::constant::c1o1+q))*((f[invDir]-feq[invDir])/(vf::lbm::constant::c1o1-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(vf::lbm::constant::c1o1+q));
          distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
       }
    }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.h
new file mode 100644
index 0000000000000000000000000000000000000000..6eeb43a9022737637c1fa8dd7b7a557af067eda8
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.h
@@ -0,0 +1,18 @@
+#ifndef SlipBCStrategy_h__
+#define SlipBCStrategy_h__
+
+#include "BCStrategy.h"
+#include <PointerDefinitions.h>
+
+class DistributionArray3D;
+
+class SlipBCStrategy : public BCStrategy
+{
+public:
+    SlipBCStrategy();
+    ~SlipBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
+    void addDistributions(SPtr<DistributionArray3D> distributions) override;
+    void applyBC() override;
+};
+#endif // SlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCProcessor.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
similarity index 77%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCProcessor.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
index 7d4aa93295aabe45f4dea9d13a9c5b22dfac3b2a..aefbd97f1fc7cae230af6632432b1efce41829cd 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
@@ -26,34 +26,34 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThinWallBCProcessor.cpp
+//! \file ThinWallBCSet.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "ThinWallBCProcessor.h"
+#include "ThinWallBCSet.h"
 
-#include "ThinWallNoSlipBCAlgorithm.h"
+#include "ThinWallNoSlipBCStrategy.h"
 
 #include "LBMKernel.h"
 
 //////////////////////////////////////////////////////////////////////////
-ThinWallBCProcessor::ThinWallBCProcessor(SPtr<ILBMKernel> kernel) : BCProcessor(kernel) {}
+ThinWallBCSet::ThinWallBCSet(SPtr<ILBMKernel> kernel) : BCSet(kernel) {}
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCProcessor> ThinWallBCProcessor::clone(SPtr<ILBMKernel> kernel)
+SPtr<BCSet> ThinWallBCSet::clone(SPtr<ILBMKernel> kernel)
 {
-    SPtr<BCProcessor> bcProcessor(new ThinWallBCProcessor(kernel));
-    return bcProcessor;
+    SPtr<BCSet> BCSet(new ThinWallBCSet(kernel));
+    return BCSet;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThinWallBCProcessor::applyPostCollisionBC()
+void ThinWallBCSet::applyPostCollisionBC()
 {
-    BCProcessor::applyPostCollisionBC();
+    BCSet::applyPostCollisionBC();
 
-    for (SPtr<BCAlgorithm> bc : postBC) {
-        if (bc->getType() == BCAlgorithm::ThinWallNoSlipBCAlgorithm) {
-            dynamicPointerCast<ThinWallNoSlipBCAlgorithm>(bc)->setPass(2);
+    for (SPtr<BCStrategy> bc : postBC) {
+        if (bc->getType() == BCStrategy::ThinWallNoSlipBCStrategy) {
+            dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->setPass(2);
             bc->applyBC();
-            dynamicPointerCast<ThinWallNoSlipBCAlgorithm>(bc)->setPass(1);
+            dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->setPass(1);
         }
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCProcessor.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCProcessor.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.h
index cb81e6c168748d9d4baf3cce1688f114e7d5faf8..45c76a23f3d1260f8231bce581ec72ba4587794a 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCProcessor.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThinWallBCProcessor.h
+//! \file ThinWallBCSet.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef ThinWallBCProcessor_H
-#define ThinWallBCProcessor_H
+#ifndef ThinWallBCSet_H
+#define ThinWallBCSet_H
 
 #include <PointerDefinitions.h>
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 
 class ILBMKernel;
 
-class ThinWallBCProcessor : public BCProcessor
+class ThinWallBCSet : public BCSet
 {
 public:
-    ThinWallBCProcessor() = default;
-    explicit ThinWallBCProcessor(SPtr<ILBMKernel> kernel);
-    SPtr<BCProcessor> clone(SPtr<ILBMKernel> kernel) override;
+    ThinWallBCSet() = default;
+    explicit ThinWallBCSet(SPtr<ILBMKernel> kernel);
+    SPtr<BCSet> clone(SPtr<ILBMKernel> kernel) override;
     void applyPostCollisionBC(); // FIXME: should the base method virtual??
 protected:
 private:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
similarity index 83%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
index b3c97393af0e21f5732ee2763c09f9fc60017862..18385cd20e76af04a624903390723c373d3129e3 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
@@ -26,31 +26,31 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThinWallNoSlipBCAlgorithm.cpp
+//! \file ThinWallNoSlipBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "ThinWallNoSlipBCAlgorithm.h"
+#include "ThinWallNoSlipBCStrategy.h"
 
 #include "BoundaryConditions.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 
-ThinWallNoSlipBCAlgorithm::ThinWallNoSlipBCAlgorithm()
+ThinWallNoSlipBCStrategy::ThinWallNoSlipBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::ThinWallNoSlipBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::ThinWallNoSlipBCStrategy;
+    BCStrategy::preCollision = false;
     pass                      = 1;
 }
 //////////////////////////////////////////////////////////////////////////
-ThinWallNoSlipBCAlgorithm::~ThinWallNoSlipBCAlgorithm() = default;
+ThinWallNoSlipBCStrategy::~ThinWallNoSlipBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> ThinWallNoSlipBCAlgorithm::clone()
+SPtr<BCStrategy> ThinWallNoSlipBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new ThinWallNoSlipBCAlgorithm());
+    SPtr<BCStrategy> bc(new ThinWallNoSlipBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThinWallNoSlipBCAlgorithm::applyBC()
+void ThinWallNoSlipBCStrategy::applyBC()
 {
     real f[D3Q27System::ENDF + 1];
     real feq[D3Q27System::ENDF + 1];
@@ -66,9 +66,9 @@ void ThinWallNoSlipBCAlgorithm::applyBC()
             const int invDir = D3Q27System::INVDIR[fdir];
             if (pass == 1) {
                 real q = bcPtr->getQ(invDir);
-                fReturn   = ((1.0 - q) / (1.0 + q)) * 0.5 *
+                fReturn   = ((vf::lbm::constant::c1o1 - q) / (vf::lbm::constant::c1o1 + q)) * vf::lbm::constant::c1o2 *
                           (f[invDir] - f[fdir] +
-                           (f[invDir] + f[fdir] - collFactor * (feq[fdir] + feq[invDir])) / (1.0 - collFactor));
+                           (f[invDir] + f[fdir] - collFactor * (feq[fdir] + feq[invDir])) / (vf::lbm::constant::c1o1 - collFactor));
                 // distributionsTemp->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 +
                 // D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
                 fTemp[fdir] = fReturn;
@@ -85,9 +85,9 @@ void ThinWallNoSlipBCAlgorithm::applyBC()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ThinWallNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void ThinWallNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThinWallNoSlipBCAlgorithm::setPass(int pass) { this->pass = pass; }
+void ThinWallNoSlipBCStrategy::setPass(int pass) { this->pass = pass; }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
index f9995d49fae300b44e30df4b8e3f47cd7ac95929..deba685a3b2a4d28f32406c4f5048520a2c46959 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
@@ -26,24 +26,24 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file ThinWallNoSlipBCAlgorithm.h
+//! \file ThinWallNoSlipBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#ifndef ThinWallNoSlipBCAlgorithm_h__
-#define ThinWallNoSlipBCAlgorithm_h__
+#ifndef ThinWallNoSlipBCStrategy_h__
+#define ThinWallNoSlipBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class ThinWallNoSlipBCAlgorithm : public BCAlgorithm
+class ThinWallNoSlipBCStrategy : public BCStrategy
 {
 public:
-    ThinWallNoSlipBCAlgorithm();
-    ~ThinWallNoSlipBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
+    ThinWallNoSlipBCStrategy();
+    ~ThinWallNoSlipBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void setPass(int pass);
     void applyBC() override;
@@ -55,4 +55,4 @@ private:
     int pass;
     real fTemp[D3Q27System::ENDF + 1];
 };
-#endif // ThinWallNoSlipBCAlgorithm_h__
+#endif // ThinWallNoSlipBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAdapter.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAdapter.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
index 6ed8affe2b907764b56ad9f186d7f8adba2b6867..5833038504e4b3f17cbaab7f763cb8519eff56a5 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAdapter.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VelocityBCAdapter.cpp
+//! \file VelocityBC.cpp
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
 
-#include "VelocityBCAdapter.h"
+#include "VelocityBC.h"
 #include "basics/utilities/UbLogger.h"
 #include "basics/utilities/UbMath.h"
 #include "basics/utilities/UbTuple.h"
 
 using namespace std;
 
-VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const BCFunction &velVxBC)
+VelocityBC::VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const BCFunction &velVxBC)
 {
     if (vx1)
         this->vx1BCs.push_back(velVxBC);
@@ -49,7 +49,7 @@ VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const boo
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function,
+VelocityBC::VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function,
                                      const real &startTime, const real &endTime)
 {
     if (vx1)
@@ -61,7 +61,7 @@ VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const boo
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function1,
+VelocityBC::VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function1,
                                      const mu::Parser &function2, const mu::Parser &function3, const real &startTime,
                                      const real &endTime)
 {
@@ -74,7 +74,7 @@ VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const boo
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const string &functionstring,
+VelocityBC::VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const string &functionstring,
                                      const real &startTime, const real &endTime)
 {
     if (vx1)
@@ -86,7 +86,7 @@ VelocityBCAdapter::VelocityBCAdapter(const bool &vx1, const bool &vx2, const boo
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const BCFunction &velBC, bool x1Dir, bool x2Dir, bool x3Dir)
+VelocityBC::VelocityBC(const BCFunction &velBC, bool x1Dir, bool x2Dir, bool x3Dir)
 {
     if (x1Dir)
         this->vx1BCs.push_back(velBC);
@@ -97,7 +97,7 @@ VelocityBCAdapter::VelocityBCAdapter(const BCFunction &velBC, bool x1Dir, bool x
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const BCFunction &velVx1BC, const BCFunction &velVx2BC, const BCFunction &velVx3BC)
+VelocityBC::VelocityBC(const BCFunction &velVx1BC, const BCFunction &velVx2BC, const BCFunction &velVx3BC)
 {
     if (velVx1BC.getEndTime() != -Ub::inf)
         this->vx1BCs.push_back(velVx1BC);
@@ -108,7 +108,7 @@ VelocityBCAdapter::VelocityBCAdapter(const BCFunction &velVx1BC, const BCFunctio
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const vector<BCFunction> &velVx1BCs, const vector<BCFunction> &velVx2BCs,
+VelocityBC::VelocityBC(const vector<BCFunction> &velVx1BCs, const vector<BCFunction> &velVx2BCs,
                                      const vector<BCFunction> &velVx3BCs)
 {
     this->vx1BCs = velVx1BCs;
@@ -117,7 +117,7 @@ VelocityBCAdapter::VelocityBCAdapter(const vector<BCFunction> &velVx1BCs, const
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const real &vx1, const real &vx1StartTime, const real &vx1EndTime,
+VelocityBC::VelocityBC(const real &vx1, const real &vx1StartTime, const real &vx1EndTime,
                                      const real &vx2, const real &vx2StartTime, const real &vx2EndTime,
                                      const real &vx3, const real &vx3StartTime, const real &vx3EndTime)
 {
@@ -127,7 +127,7 @@ VelocityBCAdapter::VelocityBCAdapter(const real &vx1, const real &vx1StartTime,
     this->init();
 }
 /*==========================================================*/
-VelocityBCAdapter::VelocityBCAdapter(const string &vx1Function, const real &vx1StartTime, const real &vx1EndTime,
+VelocityBC::VelocityBC(const string &vx1Function, const real &vx1StartTime, const real &vx1EndTime,
                                      const string &vx2Function, const real &vx2StartTime, const real &vx2EndTime,
                                      const string &vx3Function, const real &vx3StartTime, const real &vx3EndTime)
 {
@@ -140,7 +140,7 @@ VelocityBCAdapter::VelocityBCAdapter(const string &vx1Function, const real &vx1S
     this->init();
 }
 /*==========================================================*/
-void VelocityBCAdapter::setNewVelocities(const real &vx1, const real &vx1StartTime, const real &vx1EndTime,
+void VelocityBC::setNewVelocities(const real &vx1, const real &vx1StartTime, const real &vx1EndTime,
                                          const real &vx2, const real &vx2StartTime, const real &vx2EndTime,
                                          const real &vx3, const real &vx3StartTime, const real &vx3EndTime)
 {
@@ -151,7 +151,7 @@ void VelocityBCAdapter::setNewVelocities(const real &vx1, const real &vx1StartTi
     this->init();
 }
 /*==========================================================*/
-void VelocityBCAdapter::init()
+void VelocityBC::init()
 {
     this->unsetTimeDependent();
 
@@ -181,7 +181,7 @@ void VelocityBCAdapter::init()
     }
 }
 /*==========================================================*/
-void VelocityBCAdapter::init(std::vector<BCFunction> &vxBCs)
+void VelocityBC::init(std::vector<BCFunction> &vxBCs)
 {
     for (size_t pos = 0; pos < vxBCs.size(); ++pos) {
         if (!(UbMath::equal(BCFunction::INFCONST, vxBCs[pos].getEndTime()) &&
@@ -198,7 +198,7 @@ void VelocityBCAdapter::init(std::vector<BCFunction> &vxBCs)
     }
 }
 /*==========================================================*/
-void VelocityBCAdapter::init(const D3Q27Interactor *const &interactor, const real &time)
+void VelocityBC::init(const D3Q27Interactor *const &interactor, const real &time)
 {
     this->timeStep       = time;
     this->tmpVx1Function = this->tmpVx2Function = this->tmpVx3Function = NULL;
@@ -276,7 +276,7 @@ void VelocityBCAdapter::init(const D3Q27Interactor *const &interactor, const rea
         }
     }
 
-    UBLOG(logDEBUG4, "D3Q27VelocityBCAdapter::init(time="
+    UBLOG(logDEBUG4, "D3Q27VelocityBC::init(time="
                          << time << ") "
                          << ", vx1= \"" << (tmpVx1Function ? tmpVx1Function->GetExpr() : "-") << "\""
                          << ", vx2= \"" << (tmpVx2Function ? tmpVx2Function->GetExpr() : "-") << "\""
@@ -284,12 +284,12 @@ void VelocityBCAdapter::init(const D3Q27Interactor *const &interactor, const rea
                          << ", timedependent=" << boolalpha << this->isTimeDependent());
 }
 /*==========================================================*/
-void VelocityBCAdapter::update(const D3Q27Interactor *const &interactor, const real &time)
+void VelocityBC::update(const D3Q27Interactor *const &interactor, const real &time)
 {
     this->init(interactor, time);
 }
 /*==========================================================*/
-void VelocityBCAdapter::adaptBCForDirection(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
+void VelocityBC::adaptBCForDirection(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
                                             const real & /*worldX1*/, const real & /*worldX2*/,
                                             const real & /*worldX3*/, const real &q, const int &fdirection,
                                             const real & /*time*/)
@@ -298,14 +298,14 @@ void VelocityBCAdapter::adaptBCForDirection(const D3Q27Interactor & /*interactor
     bc->setQ((real)q, fdirection);
 }
 /*==========================================================*/
-void VelocityBCAdapter::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real &worldX1,
+void VelocityBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real &worldX1,
                                 const real &worldX2, const real &worldX3, const real &time)
 {
     this->setNodeVelocity(interactor, bc, worldX1, worldX2, worldX3, time);
-    bc->setBcAlgorithmType(algorithmType);
+    bc->setBCStrategyType(algorithmType);
 }
 /*==========================================================*/
-void VelocityBCAdapter::setNodeVelocity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
+void VelocityBC::setNodeVelocity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
                                         const real &worldX1, const real &worldX2, const real &worldX3,
                                         const real &timestep)
 {
@@ -334,12 +334,12 @@ void VelocityBCAdapter::setNodeVelocity(const D3Q27Interactor & /*interactor*/,
     }
 }
 /*==========================================================*/
-UbTupleDouble3 VelocityBCAdapter::getVelocity(const real &x1, const real &x2, const real &x3,
+UbTupleDouble3 VelocityBC::getVelocity(const real &x1, const real &x2, const real &x3,
                                               const real &timeStep) const
 {
-    real vx1     = 0.0;
-    real vx2     = 0.0;
-    real vx3     = 0.0;
+    real vx1     = vf::lbm::constant::c0o1;
+    real vx2     = vf::lbm::constant::c0o1;
+    real vx3     = vf::lbm::constant::c0o1;
     this->x1       = x1;
     this->x2       = x2;
     this->x3       = x3;
@@ -355,10 +355,10 @@ UbTupleDouble3 VelocityBCAdapter::getVelocity(const real &x1, const real &x2, co
     return { vx1, vx2, vx3 };
 }
 /*==========================================================*/
-string VelocityBCAdapter::toString()
+string VelocityBC::toString()
 {
     stringstream info;
-    info << "D3Q27VelocityBCAdapter:\n";
+    info << "D3Q27VelocityBC:\n";
     info << " #vx1-functions = " << (int)vx1BCs.size() << endl;
     info << " #vx2-functions = " << (int)vx2BCs.size() << endl;
     info << " #vx3-functions = " << (int)vx3BCs.size() << endl;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAdapter.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAdapter.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.h
index c0596b8e234f581726243a8a95beb6eb71121be4..64e333ad86e1cc03c9295274c107387bf6583562 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAdapter.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.h
@@ -26,12 +26,12 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VelocityBCAdapter.h
+//! \file VelocityBC.h
 //! \ingroup BoundarConditions
 //! \author Sören Freudiger
 //=======================================================================================
-#ifndef VelocityBCAdapter_H
-#define VelocityBCAdapter_H
+#ifndef VelocityBC_H
+#define VelocityBC_H
 
 #include <iostream>
 #include <sstream>
@@ -40,7 +40,7 @@
 
 #include <basics/utilities/UbInfinity.h>
 
-#include <BCAdapter.h>
+#include <BC.h>
 #include <BCFunction.h>
 
 //! \brief A class provides an interface for velocity boundary condition in grid generator.
@@ -56,8 +56,8 @@
 //!        vx2BCs.push_back(BCFunction(0.002, 200, 300) );   //t=[200..300[ -> vx2 = 0.002
 //!        vx2BCs.push_back(BCFunction(0.043, 300, 600) );   //t=[300..600] -> vx2 = 0.043
 //!
-//!        VelocityBCAdapter bcAdapter(vx1BCs,vx2BCs,vx3BCs);
-//!        bcAdapter.setTimePeriodic(); //->  t=[0  ..100[ -> vx1 = 0.01
+//!        VelocityBC BC(vx1BCs,vx2BCs,vx3BCs);
+//!        BC.setTimePeriodic(); //->  t=[0  ..100[ -> vx1 = 0.01
 //!                                     //    t=[100..200[ -> vx1 = 0.004
 //!                                     //    t=[200..400[ -> vx1 = 0.03
 //!                                     //    t=[400..500[ -> vx1 = 0.01
@@ -76,39 +76,39 @@
 //!    fct.SetExpr("max(vmax*(1.0-4.0*((x2-x2_vmax)^2+(x3-x3_vmax)^2)/H^2),0.0)"); //paraboloid (with vmax for
 //!    (0/x2_vmax/x3_vmax) fct.DefineConst("x2Vmax", 0.0            ); //x2-Pos für vmax fct.DefineConst("x3Vmax", 0.0
 //!    ); //x3-Pos für vmax fct.DefineConst("H"     , diameterOfPipe); fct.DefineConst("vmax"  , vmax           );
-//!    VelocityBCAdapter velBC(true, false ,false ,fct, 0, BCFunction::INFCONST);
+//!    VelocityBC velBC(true, false ,false ,fct, 0, BCFunction::INFCONST);
 //! \endcode
 
-class VelocityBCAdapter : public BCAdapter
+class VelocityBC : public BC
 {
 public:
     // constructors
-    VelocityBCAdapter() { this->init(); }
+    VelocityBC() { this->init(); }
 
-    VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const BCFunction &velVxBC);
+    VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const BCFunction &velVxBC);
 
-    VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function,
+    VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function,
                       const real &startTime, const real &endTime);
 
-    VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function1,
+    VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const mu::Parser &function1,
                       const mu::Parser &function2, const mu::Parser &function3, const real &startTime,
                       const real &endTime);
 
-    VelocityBCAdapter(const bool &vx1, const bool &vx2, const bool &vx3, const std::string &functionstring,
+    VelocityBC(const bool &vx1, const bool &vx2, const bool &vx3, const std::string &functionstring,
                       const real &startTime, const real &endTime);
 
-    VelocityBCAdapter(const BCFunction &velBC, bool x1Dir, bool x2Dir, bool x3Dir);
+    VelocityBC(const BCFunction &velBC, bool x1Dir, bool x2Dir, bool x3Dir);
 
-    VelocityBCAdapter(const BCFunction &velVx1BC, const BCFunction &velVx2BC, const BCFunction &velVx3BC);
+    VelocityBC(const BCFunction &velVx1BC, const BCFunction &velVx2BC, const BCFunction &velVx3BC);
 
-    VelocityBCAdapter(const std::vector<BCFunction> &velVx1BCs, const std::vector<BCFunction> &velVx2BCs,
+    VelocityBC(const std::vector<BCFunction> &velVx1BCs, const std::vector<BCFunction> &velVx2BCs,
                       const std::vector<BCFunction> &velVx3BCs);
 
-    VelocityBCAdapter(const real &vx1, const real &vx1StartTime, const real &vx1EndTime, const real &vx2,
+    VelocityBC(const real &vx1, const real &vx1StartTime, const real &vx1EndTime, const real &vx2,
                       const real &vx2StartTime, const real &vx2EndTime, const real &vx3,
                       const real &vx3StartTime, const real &vx3EndTime);
 
-    VelocityBCAdapter(const std::string &vx1Function, const real &vx1StartTime, const real &vx1EndTime,
+    VelocityBC(const std::string &vx1Function, const real &vx1StartTime, const real &vx1EndTime,
                       const std::string &vx2Function, const real &vx2StartTime, const real &vx2EndTime,
                       const std::string &vx3Function, const real &vx3StartTime, const real &vx3EndTime);
 
@@ -122,7 +122,7 @@ public:
                           const real &vx2StartTime, const real &vx2EndTime, const real &vx3,
                           const real &vx3StartTime, const real &vx3EndTime);
 
-    //------------- implements BCAdapter ----- start
+    //------------- implements BC ----- start
     std::string toString();
 
     void init(const D3Q27Interactor *const &interactor, const real &time = 0) override;
@@ -134,7 +134,7 @@ public:
     void adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions> bc, const real &worldX1,
                  const real &worldX2, const real &worldX3, const real &time = 0) override;
 
-    //------------- implements BCAdapter ----- end
+    //------------- implements BC ----- end
 
     UbTupleDouble3 getVelocity(const real &x1, const real &x2, const real &x3, const real &timeStep) const;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
similarity index 83%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
index 9f1bf39d8d6d11747a71b04d9cfc7e3b70870802..44f7180b654ae57eb3d5bd14fa22c88785ded9b8 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
@@ -26,34 +26,34 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VelocityBCAlgorithm.cpp
+//! \file VelocityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "VelocityBCAlgorithm.h"
+#include "VelocityBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 #include "Block3D.h"
 
-VelocityBCAlgorithm::VelocityBCAlgorithm()
+VelocityBCStrategy::VelocityBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::VelocityBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::VelocityBCStrategy;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> VelocityBCAlgorithm::clone()
+SPtr<BCStrategy> VelocityBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new VelocityBCAlgorithm());
+    SPtr<BCStrategy> bc(new VelocityBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void VelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void VelocityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void VelocityBCAlgorithm::applyBC()
+void VelocityBCStrategy::applyBC()
 {
     real f[D3Q27System::ENDF + 1];
     real feq[D3Q27System::ENDF + 1];
@@ -65,15 +65,15 @@ void VelocityBCAlgorithm::applyBC()
     //DEBUG
     //int blockID = block->getGlobalID();
 
-    rho = 1.0 + drho * compressibleFactor;
+    rho = vf::lbm::constant::c1o1 + drho * compressibleFactor;
 
     for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) {
         if (bcPtr->hasVelocityBoundaryFlag(fdir)) {
             const int invDir = D3Q27System::INVDIR[fdir];
             real q        = bcPtr->getQ(invDir);
             real velocity = bcPtr->getBoundaryVelocity(invDir);
-            real fReturn = ((1.0 - q) / (1.0 + q)) * ((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) +
-                              ((q * (f[invDir] + f[fdir]) - velocity * rho) / (1.0 + q));
+            real fReturn = ((vf::lbm::constant::c1o1 - q) / (vf::lbm::constant::c1o1 + q)) * ((f[invDir] - feq[invDir]) / (vf::lbm::constant::c1o1 - collFactor) + feq[invDir]) +
+                              ((q * (f[invDir] + f[fdir]) - velocity * rho) / (vf::lbm::constant::c1o1 + q));
             distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir],
                                                        x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir],
                                                        fdir);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.h
similarity index 91%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.h
index 44bbd2cee69c12a613e638f4173b371d1260964f..bc12cf937471726454c0de7b22d531a227d75696 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.h
@@ -26,25 +26,25 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VelocityBCAlgorithm.h
+//! \file VelocityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef VelocityBCAlgorithm_H
-#define VelocityBCAlgorithm_H
+#ifndef VelocityBCStrategy_H
+#define VelocityBCStrategy_H
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
 //! \brief A class implements velocyty boundary condition
-class VelocityBCAlgorithm : public BCAlgorithm
+class VelocityBCStrategy : public BCStrategy
 {
 public:
-    VelocityBCAlgorithm();
-    SPtr<BCAlgorithm> clone() override;
+    VelocityBCStrategy();
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
similarity index 86%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
index 09a52798e62013fdc5878678a4c47aec003b68a2..a7cf16a9f6f63166465bcd7fcdab94358b906c09 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
@@ -26,34 +26,34 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VelocityWithDensityBCAlgorithm.cpp
+//! \file VelocityWithDensityBCStrategy.cpp
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "VelocityWithDensityBCAlgorithm.h"
+#include "VelocityWithDensityBCStrategy.h"
 #include "BCArray3D.h"
 #include "DistributionArray3D.h"
 
-VelocityWithDensityBCAlgorithm::VelocityWithDensityBCAlgorithm()
+VelocityWithDensityBCStrategy::VelocityWithDensityBCStrategy()
 {
-    BCAlgorithm::type         = BCAlgorithm::VelocityWithDensityBCAlgorithm;
-    BCAlgorithm::preCollision = false;
+    BCStrategy::type         = BCStrategy::VelocityWithDensityBCStrategy;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
-VelocityWithDensityBCAlgorithm::~VelocityWithDensityBCAlgorithm() = default;
+VelocityWithDensityBCStrategy::~VelocityWithDensityBCStrategy() = default;
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCAlgorithm> VelocityWithDensityBCAlgorithm::clone()
+SPtr<BCStrategy> VelocityWithDensityBCStrategy::clone()
 {
-    SPtr<BCAlgorithm> bc(new VelocityWithDensityBCAlgorithm());
+    SPtr<BCStrategy> bc(new VelocityWithDensityBCStrategy());
     return bc;
 }
 //////////////////////////////////////////////////////////////////////////
-void VelocityWithDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+void VelocityWithDensityBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void VelocityWithDensityBCAlgorithm::applyBC()
+void VelocityWithDensityBCStrategy::applyBC()
 {
    //velocity bc for non reflecting pressure bc
    real f[D3Q27System::ENDF+1];
@@ -92,7 +92,7 @@ void VelocityWithDensityBCAlgorithm::applyBC()
                 // if q=1
                 // LBMReal fReturn = ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 +
                 // q))-drho*D3Q27System::WEIGTH[invDir];
-                real fReturn = (f[fdir] + f[invDir] - velocity * rho) / 2.0 - drho * D3Q27System::WEIGTH[invDir];
+                real fReturn = (f[fdir] + f[invDir] - velocity * rho) / vf::lbm::constant::c2o1 - drho * D3Q27System::WEIGTH[invDir];
 
                 distributions->setDistributionForDirection(fReturn, nX1, nX2, nX3, invDir);
             }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.h
similarity index 86%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.h
index 7ab57d2b892af9db0e0e42327b970b381710edf3..6d91f2ced18e647449c7ba732aa09c4f5fe25f8d 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.h
@@ -26,15 +26,15 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VelocityWithDensityBCAlgorithm.h
+//! \file VelocityWithDensityBCStrategy.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef VelocityWithDensityBCAlgorithm_h__
-#define VelocityWithDensityBCAlgorithm_h__
+#ifndef VelocityWithDensityBCStrategy_h__
+#define VelocityWithDensityBCStrategy_h__
 
-#include "BCAlgorithm.h"
+#include "BCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
@@ -42,13 +42,13 @@ class DistributionArray3D;
 //!  \brief Class implements Dirichlet boundary condition for velocity. Set density in system. It is used together with
 //!  non reflecting outflow.
 
-class VelocityWithDensityBCAlgorithm : public BCAlgorithm
+class VelocityWithDensityBCStrategy : public BCStrategy
 {
 public:
-    VelocityWithDensityBCAlgorithm();
-    ~VelocityWithDensityBCAlgorithm() override;
-    SPtr<BCAlgorithm> clone() override;
+    VelocityWithDensityBCStrategy();
+    ~VelocityWithDensityBCStrategy() override;
+    SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
-#endif // VelocityWithDensityBCAlgorithm_h__
+#endif // VelocityWithDensityBCStrategy_h__
diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt
index 0485e00ec407dcfe0e2ac1c2a58da044fb33f42d..aea13626538b5cfb804dd20e2d3ffde7d3b5fa88 100644
--- a/src/cpu/VirtualFluidsCore/CMakeLists.txt
+++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt
@@ -1,22 +1,22 @@
 
 set(VF_LIBRARIES)
 
-IF(${USE_METIS} AND METIS_RELEASE_LIBRARY AND METIS_DEBUG_LIBRARY)
+IF(${VFCPU_USE_METIS} AND METIS_RELEASE_LIBRARY AND METIS_DEBUG_LIBRARY)
    list(APPEND VF_LIBRARIES optimized ${METIS_RELEASE_LIBRARY} debug ${METIS_DEBUG_LIBRARY})
 ELSE()
    list(APPEND VF_LIBRARIES metis)
 ENDIF()
 
-IF(${USE_VTK})
+IF(${VFCPU_USE_VTK})
    list(APPEND VF_LIBRARIES optimized ${VTK_LIBRARIES} debug ${VTK_LIBRARIES})
 ENDIF()
 
-IF(${USE_CATALYST})
+IF(${VFCPU_USE_CATALYST})
    list(APPEND VF_LIBRARIES optimized vtkPVPythonCatalyst debug vtkPVPythonCatalyst)
    list(APPEND VF_LIBRARIES optimized vtkParallelMPI debug vtkParallelMPI )
 ENDIF()
 
-IF(${USE_DEM_COUPLING})
+IF(${VFCPU_USE_DEM_COUPLING})
    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/../DemCoupling/DemCoupling.cmake)
 ENDIF()
 
@@ -24,7 +24,7 @@ if(BUILD_USE_OPENMP)
     list(APPEND VF_LIBRARIES OpenMP::OpenMP_CXX)
 endif()
 
-IF(${USE_LIGGGHTS})
+IF(${VFCPU_USE_LIGGGHTS})
    list(APPEND VF_LIBRARIES optimized ${LIGGGHTS_RELEASE_LIBRARY} debug ${LIGGGHTS_DEBUG_LIBRARY})
 ENDIF()
 
@@ -40,23 +40,22 @@ target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Da
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Interactors)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/LBM)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Parallel)
-target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Grid)
+target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Simulation)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Visitors)
-target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/CoProcessors)
+target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/SimulationObservers)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Utilities)
 
 
-IF(${USE_METIS} AND METIS_INCLUDEDIR)
+IF(${VFCPU_USE_METIS} AND METIS_INCLUDEDIR)
    target_include_directories(${library_name} PUBLIC ${METIS_INCLUDEDIR})
 ENDIF()
 
 target_include_directories(${library_name} PRIVATE ${ZOLTAN_INCLUDEDIR})
 
-IF(${USE_VTK})
+IF(${VFCPU_USE_VTK})
    target_include_directories(${library_name} PRIVATE ${VTK_INCLUDE_DIRS})
 ENDIF()
 
-IF(${USE_LIGGGHTS})
-   target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LiggghtsCoupling)
+IF(${VFCPU_ENABLE_LiggghtsCoupling})
    target_include_directories(${library_name} PUBLIC ${LIGGGHTS_SOURCE_DIR})
-ENDIF()
\ No newline at end of file
+ENDIF()
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h
deleted file mode 100644
index 13eaa7832cf5815005d30910332a7d382f047186..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  EmergencyExitCoProcessor.h
- *
- *  Created on: 05.10.2012
- *  Author: K. Kucher
- */
-
-#ifndef EmergencyExitCoProcessor_H
-#define EmergencyExitCoProcessor_H
-
-#include <PointerDefinitions.h>
-#include <string>
-
-#include "CoProcessor.h"
-
-class MPIIORestartCoProcessor;
-namespace vf::mpi {class Communicator;}
-class Grid3D;
-class UbScheduler;
-
-class EmergencyExitCoProcessor : public CoProcessor
-{
-public:
-    EmergencyExitCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                             SPtr<MPIIORestartCoProcessor> rp, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~EmergencyExitCoProcessor() override;
-
-    void process(real step) override;
-
-protected:
-    void collectData(real step);
-    void writeMetafile(int status);
-    bool readMetafile();
-    void checkMetafile();
-
-private:
-    std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
-    SPtr<MPIIORestartCoProcessor> rp;
-    std::string metafile;
-};
-
-#endif /* EmergencyExitCoProcessor_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp
deleted file mode 100644
index 22158269d3d622fd4dd0f6c943b7e28b871b5172..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "TimeDependentBCCoProcessor.h"
-
-#include "Grid3D.h"
-#include "Interactor3D.h"
-#include "UbScheduler.h"
-
-TimeDependentBCCoProcessor::TimeDependentBCCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : CoProcessor(grid, s) {}
-//////////////////////////////////////////////////////////////////////////
-TimeDependentBCCoProcessor::~TimeDependentBCCoProcessor() = default;
-//////////////////////////////////////////////////////////////////////////
-void TimeDependentBCCoProcessor::process(real step)
-{
-    if (scheduler->isDue(step)) {
-        for (SPtr<Interactor3D> inter : interactors)
-            inter->updateInteractor(step);
-        UBLOG(logDEBUG3, "TimeDependentBCCoProcessor::update:" << step);
-    }
-}
-//////////////////////////////////////////////////////////////////////////
-void TimeDependentBCCoProcessor::addInteractor(SPtr<Interactor3D> interactor) { interactors.push_back(interactor); }
-
-//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h
deleted file mode 100644
index cb41ca9622759f99d701d1d97865d9754d9bf5e6..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef TimeDependentBCCoProcessor_H
-#define TimeDependentBCCoProcessor_H
-
-#include <PointerDefinitions.h>
-#include <vector>
-
-#include "CoProcessor.h"
-
-class Interactor3D;
-class Grid3D;
-
-//! \brief The class update interactors depend of time step.
-//! \details TimeDependentBCCoProcessor update every time step information in BCAdapters throw Interactors
-//! \author Sonja Uphoff, Kostyantyn Kucher
-class TimeDependentBCCoProcessor : public CoProcessor
-{
-public:
-    TimeDependentBCCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
-    ~TimeDependentBCCoProcessor() override;
-
-    void process(real step) override;
-
-    //! add interactors to CoProcessor
-    void addInteractor(SPtr<Interactor3D> interactor);
-
-private:
-    std::vector<SPtr<Interactor3D>> interactors;
-};
-
-#endif /* TimeDependentBCCoProcessor_H */
diff --git a/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h
index c2ba596a7bdb20c24fa373064e09854c4f6d95eb..d7f9f72c4f86f5d849fa4f2c0cd703333007091a 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h
@@ -48,7 +48,7 @@
 #include "basics/transmitter/TbTransmitterLocal.h"
 #include <PointerDefinitions.h>
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "FineToCoarseVectorConnector.h"
 
 class Block3D;
@@ -833,7 +833,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectorExt(SPtr<Dist
         return;
     int ix1, ix2, ix3;
     real xoff, yoff, zoff;
-    SPtr<BCArray3D> bcArray = block.lock()->getKernel()->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = block.lock()->getKernel()->getBCSet()->getBCArray();
 
     for (ix3 = lMinX3; ix3 < lMaxX3; ix3++) {
         for (ix2 = lMinX2; ix2 < lMaxX2; ix2++) {
@@ -1979,7 +1979,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::findCFnodes(SPtr<Distributi
         return;
     int ix1, ix2, ix3;
     real xoff, yoff, zoff;
-    SPtr<BCArray3D> bcArray = block.lock()->getKernel()->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = block.lock()->getKernel()->getBCSet()->getBCArray();
 
     for (ix3 = lMinX3; ix3 < lMaxX3; ix3++) {
         for (ix2 = lMinX2; ix2 < lMaxX2; ix2++) {
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h
index f4f4080215869cdd4ae1c75e750daa2419af9240..ffab5008241e7f8f4457c7385c83872a296ee748 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h
@@ -46,7 +46,7 @@
 #include "basics/transmitter/TbTransmitter.h"
 #include <PointerDefinitions.h>
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "DataSet3D.h"
 
 class Block3D;
@@ -795,7 +795,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVector(SPtr<Distrib
 {
     int ix1, ix2, ix3;
     real xoff, yoff, zoff;
-    SPtr<BCArray3D> bcArray = block.lock()->getKernel()->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = block.lock()->getKernel()->getBCSet()->getBCArray();
 
     for (ix3 = lMinX3; ix3 < lMaxX3; ix3 += 2) {
         for (ix2 = lMinX2; ix2 < lMaxX2; ix2 += 2) {
diff --git a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h
index 060e2cb3ad367d31d6b30577f370cd1b692daecd..21f1610641706dac82e1314b1a01be5959c8b0b2 100644
--- a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h
+++ b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h
@@ -103,8 +103,8 @@ protected:
     CbArray3D<real, IndexerX3X2X1>::CbArray3DPtr zeroDistributions;
     size_t NX1, NX2, NX3;
 
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.h b/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.h
deleted file mode 100644
index 3ef1f4c712e552ea5d5b5e82306e2bd94d74d7ab..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.h
+++ /dev/null
@@ -1,69 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file BasicCalculator.h
-//! \ingroup Grid
-//! \author Konstantin Kutscher
-//=======================================================================================
-
-#ifndef BasicCalculator_h__
-#define BasicCalculator_h__
-
-#include "Calculator.h"
-
-class Block3DConnector;
-
-//! \class BasicCalculator
-//! \brief Class implements basic functionality with MPI + OpenMP parallelization for main calculation loop
-//! \author  Konstantin Kutscher
-
-class BasicCalculator : public Calculator
-{
-public:
-    BasicCalculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps);
-    ~BasicCalculator() override = default;
-    void calculate() override;
-
-protected:
-    void calculateBlocks(int startLevel, int maxInitLevel, int calcStep);
-    void swapDistributions(int startLevel, int maxInitLevel);
-    void exchangeBlockData(int startLevel, int maxInitLevel);
-    void connectorsPrepareLocal(std::vector<SPtr<Block3DConnector>> &connectors);
-    void connectorsSendLocal(std::vector<SPtr<Block3DConnector>> &connectors);
-    void connectorsReceiveLocal(std::vector<SPtr<Block3DConnector>> &connectors);
-    void connectorsPrepareRemote(std::vector<SPtr<Block3DConnector>> &connectors);
-    void connectorsSendRemote(std::vector<SPtr<Block3DConnector>> &connectors);
-    void connectorsReceiveRemote(std::vector<SPtr<Block3DConnector>> &connectors);
-    void interpolation(int startLevel, int maxInitLevel);
-    void applyPreCollisionBC(int startLevel, int maxInitLevel);
-    void applyPostCollisionBC(int startLevel, int maxInitLevel);
-
-private:
-};
-
-#endif // BasicCalculator_h__
diff --git a/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp b/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp
deleted file mode 100644
index 85235867a3352c8277e6e279b7dbb6058d03020a..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file Calculator.cpp
-//! \ingroup Grid
-//! \author Konstantin Kutscher
-//=======================================================================================
-
-#include "Calculator.h"
-
-#include "Block3D.h"
-#include "Block3DConnector.h"
-#include "CoProcessor.h"
-#include "Grid3D.h"
-#include "UbScheduler.h"
-
-#include <basics/utilities/UbException.h>
-
-Calculator::Calculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps)
-    : grid(grid), additionalGhostLayerUpdateScheduler(additionalGhostLayerUpdateScheduler),
-      numberOfTimeSteps(numberOfTimeSteps)
-{
-    this->grid    = grid;
-    startTimeStep = int(grid->getTimeStep()) + 1;
-    minLevel      = grid->getCoarsestInitializedLevel();
-    maxLevel      = grid->getFinestInitializedLevel();
-    if (maxLevel > 0)
-        refinement = true;
-    else
-        refinement = false;
-    blocks.resize(maxLevel + 1);
-    localConns.resize(maxLevel + 1);
-    remoteConns.resize(maxLevel + 1);
-    localInterConns.resize(maxLevel);
-    remoteInterConns.resize(maxLevel);
-
-    int gridRank = grid->getRank();
-
-    for (int level = minLevel; level <= maxLevel; level++) {
-        std::vector<SPtr<Block3D>> blockVector;
-        grid->getBlocks(level, gridRank, true, blockVector);
-        for (const auto &block : blockVector)
-            if (block)
-                blocks[block->getLevel()].push_back(block);
-    }
-
-    initLocalConnectors();
-    initRemoteConnectors();
-}
-//////////////////////////////////////////////////////////////////////////
-Calculator::~Calculator() = default;
-//////////////////////////////////////////////////////////////////////////
-void Calculator::addCoProcessor(SPtr<CoProcessor> coProcessor) { coProcessors.push_back(coProcessor); }
-//////////////////////////////////////////////////////////////////////////
-void Calculator::coProcess(real step)
-{
-    for (SPtr<CoProcessor> cp : coProcessors) {
-        cp->process(step);
-    }
-}
-//////////////////////////////////////////////////////////////////////////
-void Calculator::initLocalConnectors()
-{
-    UBLOG(logDEBUG1, "Calculator::initLocalConnectors() - start");
-
-    for (int l = minLevel; l <= maxLevel; l++) {
-        for (SPtr<Block3D> block : blocks[l]) {
-            block->pushBackLocalSameLevelConnectors(localConns[l]);
-
-            if (l != maxLevel)
-                block->pushBackLocalInterpolationConnectorsCF(localInterConns[l]);
-        }
-        if (l != maxLevel) {
-            for (SPtr<Block3D> block : blocks[l + 1]) {
-                block->pushBackLocalInterpolationConnectorsFC(localInterConns[l]);
-            }
-        }
-        UBLOG(logDEBUG5, "Calculator::initConnectors()-initConnectors(localConns[" << l << "])");
-        initConnectors(localConns[l]);
-
-        if (l != maxLevel) {
-            UBLOG(logDEBUG5, "Calculator::initConnectors()-initConnectors(localInterConns[" << l << "])");
-            initConnectors(localInterConns[l]);
-        }
-    }
-
-    UBLOG(logDEBUG1, "Calculator::initLocalConnectors() - end");
-}
-//////////////////////////////////////////////////////////////////////////
-void Calculator::initRemoteConnectors()
-{
-    std::vector<std::vector<SPtr<Block3DConnector>>> remoteInterConnsCF;
-    std::vector<std::vector<SPtr<Block3DConnector>>> remoteInterConnsFC;
-    remoteInterConnsCF.resize(maxLevel + 1);
-    remoteInterConnsFC.resize(maxLevel + 1);
-
-    for (int l = minLevel; l <= maxLevel; l++) {
-        std::vector<SPtr<Block3D>> blockVector;
-        // grid->getBlocks(level, gridRank, true, blockVector);
-        grid->getBlocks(l, blockVector);
-        for (SPtr<Block3D> block : blockVector) {
-            int block_level = block->getLevel();
-            block->pushBackRemoteSameLevelConnectors(remoteConns[block_level]);
-
-            block->pushBackRemoteInterpolationConnectorsCF(remoteInterConnsCF[block_level]);
-            block->pushBackRemoteInterpolationConnectorsFC(remoteInterConnsFC[block_level]);
-        }
-    }
-
-    for (int l = minLevel; l <= maxLevel; l++) {
-        UBLOG(logDEBUG5, "Calculator::initRemoteConnectors()-initConnectors(remoteConns[" << l << "])");
-        initConnectors(remoteConns[l]);
-        if (l != maxLevel) {
-            for (size_t i = 0; i < remoteInterConnsCF[l].size(); i++)
-                remoteInterConns[l].push_back(remoteInterConnsCF[l][i]);
-            for (size_t i = 0; i < remoteInterConnsFC[l + 1].size(); i++)
-                remoteInterConns[l].push_back(remoteInterConnsFC[l + 1][i]);
-        }
-    }
-    //////////////////////////////////////////////////////////////////////////
-    // UBLOG(logDEBUG5, "Calculator::initConnectors() - connectoren initialisieren - start");
-    for (int l = minLevel; l <= maxLevel; l++) {
-        if (l != maxLevel) {
-            UBLOG(logDEBUG5, "Calculator::initRemoteConnectors()-initConnectors(remoteInterConns[" << l << "])");
-            for (SPtr<Block3DConnector> c : remoteInterConns[l])
-                c->init();
-        }
-    }
-    // UBLOG(logDEBUG5, "Calculator::initConnectors() - connectoren initialisieren - end");
-    //////////////////////////////////////////////////////////////////////////
-    // sendTransmitterDataSize
-    // UBLOG(logDEBUG5, "Calculator::initConnectors() - sendTransmitterDataSize - start");
-    for (int l = minLevel; l <= maxLevel; l++) {
-        if (l != maxLevel) {
-            UBLOG(logDEBUG5,
-                  "Calculator::initRemoteConnectors()-sendTransmitterDataSize(remoteInterConns[" << l << "])");
-            for (SPtr<Block3DConnector> c : remoteInterConns[l])
-                c->sendTransmitterDataSize();
-        }
-    }
-    // UBLOG(logDEBUG5, "Calculator::initConnectors() - sendTransmitterDataSize - end");
-    //////////////////////////////////////////////////////////////////////////
-    // receiveTransmitterDataSize
-    // wenn er hier bei verteilten berechnungen stopped, dann ist vermutlich auf einer seite ein nicht aktiver block!!!
-    // UBLOG(logDEBUG5, "Calculator::initConnectors() - receiveTransmitterDataSize - start");
-    for (int l = minLevel; l <= maxLevel; l++) {
-        if (l != maxLevel) {
-            UBLOG(logDEBUG5,
-                  "Calculator::initRemoteConnectors()-receiveTransmitterDataSize(remoteInterConns[" << l << "])");
-            for (SPtr<Block3DConnector> c : remoteInterConns[l])
-                c->receiveTransmitterDataSize();
-        }
-    }
-    // UBLOG(logDEBUG5, "Calculator::initConnectors() - receiveTransmitterDataSize - end");
-    //////////////////////////////////////////////////////////////////////////
-}
-//////////////////////////////////////////////////////////////////////////
-void Calculator::initConnectors(std::vector<SPtr<Block3DConnector>> &connectors)
-{
-    UBLOG(logDEBUG1, "Calculator::initConnectors() - start");
-
-    // initialization
-    //////////////////////////////////////////////////////////////////////////
-    // initialize connectors
-    UBLOG(logDEBUG5, "Calculator::initConnectors() - connectoren initialisieren - start");
-    for (SPtr<Block3DConnector> c : connectors)
-        c->init();
-    UBLOG(logDEBUG5, "Calculator::initConnectors() - connectoren initialisieren - end");
-    //////////////////////////////////////////////////////////////////////////
-    // sendTransmitterDataSize
-    UBLOG(logDEBUG5, "Calculator::initConnectors() - sendTransmitterDataSize - start");
-    for (SPtr<Block3DConnector> c : connectors)
-        c->sendTransmitterDataSize();
-    UBLOG(logDEBUG5, "Calculator::initConnectors() - sendTransmitterDataSize - end");
-    //////////////////////////////////////////////////////////////////////////
-    // receiveTransmitterDataSize
-    // wenn er hier bei verteilten berechnungen stopped, dann ist vermutlich auf einer seite ein nicht aktiver block!!!
-    UBLOG(logDEBUG5, "Calculator::initConnectors() - receiveTransmitterDataSize - start");
-    for (SPtr<Block3DConnector> c : connectors)
-        c->receiveTransmitterDataSize();
-    UBLOG(logDEBUG5, "Calculator::initConnectors() - receiveTransmitterDataSize - end");
-
-    UBLOG(logDEBUG1, "Calculator::initConnectors() - end");
-}
-//////////////////////////////////////////////////////////////////////////
-void Calculator::deleteBlocks()
-{
-    for (std::vector<SPtr<Block3D>> &bs : blocks)
-        bs.resize(0);
-}
-//////////////////////////////////////////////////////////////////////////
-void Calculator::deleteConnectors()
-{
-    deleteConnectors(localConns);
-    deleteConnectors(remoteConns);
-
-    deleteConnectors(localInterConns);
-    deleteConnectors(remoteInterConns);
-}
-//////////////////////////////////////////////////////////////////////////
-void Calculator::deleteConnectors(std::vector<std::vector<SPtr<Block3DConnector>>> &conns)
-{
-    for (std::vector<SPtr<Block3DConnector>> &c : conns)
-        c.resize(0);
-}
-//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
index 06d0daffd5814f7956125c58c40e7122bf4878f0..d90d8ec696140a9325be1c2662f03e604a420fa2 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
@@ -39,9 +39,9 @@
 
 #include <basics/writer/WbWriterVtkXmlBinary.h>
 
-#include "BCAdapter.h"
+#include "BC.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include "Grid3D.h"
@@ -66,20 +66,20 @@ D3Q27Interactor::D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid
     this->initRayVectors();
 }
 //////////////////////////////////////////////////////////////////////////
-D3Q27Interactor::D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BCAdapter> bcAdapter, int type)
+D3Q27Interactor::D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BC> BC, int type)
     : Interactor3D(geoObject3D, grid, type), relevantForForces(false)
 {
     this->reinitWithStoredQsFlag = false;
-    this->addBCAdapter(bcAdapter);
+    this->addBC(BC);
     this->initRayVectors();
 }
 //////////////////////////////////////////////////////////////////////////
-D3Q27Interactor::D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BCAdapter> bcAdapter, int type,
+D3Q27Interactor::D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BC> BC, int type,
                                  Interactor3D::Accuracy a)
     : Interactor3D(geoObject3D, grid, type, a), relevantForForces(false)
 {
     this->reinitWithStoredQsFlag = false;
-    this->addBCAdapter(bcAdapter);
+    this->addBC(BC);
     this->initRayVectors();
 }
 //////////////////////////////////////////////////////////////////////////
@@ -206,14 +206,14 @@ void D3Q27Interactor::initInteractor(const real &timeStep)
 
     //////////////////////////////////////////////////////////////////////////
     // init bcs
-    int nofAdapter = (int)bcAdapters.size();
+    int nofAdapter = (int)BCs.size();
     if (nofAdapter == 0) {
         UBLOG(logWARNING, "WARNING - D3Q27Interactor::initInteractor Warning - no nodeAdapter available");
     }
     bool needTimeDependence = false;
     for (int pos = 0; pos < nofAdapter; ++pos) {
-        bcAdapters[pos]->init(this, timeStep);
-        if (bcAdapters[pos]->isTimeDependent())
+        BCs[pos]->init(this, timeStep);
+        if (BCs[pos]->isTimeDependent())
             needTimeDependence = true;
     }
     if (needTimeDependence)
@@ -230,7 +230,7 @@ void D3Q27Interactor::updateInteractor(const real &timestep)
 
     //////////////////////////////////////////////////////////////////////////
     // update bcs
-    int nofAdapter = (int)bcAdapters.size();
+    int nofAdapter = (int)BCs.size();
     if (nofAdapter == 0) {
         UBLOG(logERROR, "WARNING - D3Q27Interactor::updateInteractor Warning - no nodeAdapter available for ");
     }
@@ -238,8 +238,8 @@ void D3Q27Interactor::updateInteractor(const real &timestep)
     bool needTimeDependence = false;
 
     for (int pos = 0; pos < nofAdapter; ++pos) {
-        bcAdapters[pos]->update(this, timestep);
-        if (bcAdapters[pos]->isTimeDependent())
+        BCs[pos]->update(this, timestep);
+        if (BCs[pos]->isTimeDependent())
             needTimeDependence = true;
     }
     if (needTimeDependence)
@@ -255,7 +255,7 @@ void D3Q27Interactor::updateInteractor(const real &timestep)
             continue;
 
         SPtr<ILBMKernel> kernel = block->getKernel();
-        SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
         set<std::vector<int>>::iterator setPos;
 
@@ -271,8 +271,8 @@ void D3Q27Interactor::updateInteractor(const real &timestep)
             SPtr<BoundaryConditions> bc = bcArray->getBC(x1, x2, x3);
             if (bc) // may be that the BC has been deleted by the solid setting of another interactor
             {
-                for (size_t i = 0; i < bcAdapters.size(); i++)
-                    bcAdapters[i]->adaptBC(*this, bc, worldX1, worldX2, worldX3, timestep);
+                for (size_t i = 0; i < BCs.size(); i++)
+                    BCs[i]->adaptBC(*this, bc, worldX1, worldX2, worldX3, timestep);
             }
         }
     }
@@ -303,7 +303,7 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block)
     SPtr<BoundaryConditions> bc;
 
     SPtr<ILBMKernel> kernel = block->getKernel();
-    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
     real internX1, internX2, internX3;
 
@@ -415,8 +415,8 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block)
                                         bc->setBoundaryVelocityX3(0.0);
                                     }
 
-                                    for (int index = (int)bcAdapters.size() - 1; index >= 0; --index)
-                                        bcAdapters[index]->adaptBCForDirection(*this, bc, internX1, internX2, internX3,
+                                    for (int index = (int)BCs.size() - 1; index >= 0; --index)
+                                        BCs[index]->adaptBCForDirection(*this, bc, internX1, internX2, internX3,
                                                                                q, fdir, timestep);
                                 }
 
@@ -434,8 +434,8 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block)
                                 p[2] = ix3;
                                 transNodeIndices.insert(p);
 
-                                for (int index = (int)bcAdapters.size() - 1; index >= 0; --index)
-                                    bcAdapters[index]->adaptBC(*this, bc, internX1, internX2, internX3, timestep);
+                                for (int index = (int)BCs.size() - 1; index >= 0; --index)
+                                    BCs[index]->adaptBC(*this, bc, internX1, internX2, internX3, timestep);
                             }
                         }
                     } else if (this->isInverseSolid()) {
@@ -534,8 +534,8 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block)
                                             bc = std::make_shared<BoundaryConditions>();
                                             bcArray->setBC(ix1, ix2, ix3, bc);
                                         }
-                                        for (int index = (int)bcAdapters.size() - 1; index >= 0; --index)
-                                            bcAdapters[index]->adaptBCForDirection(*this, bc, internX1, internX2,
+                                        for (int index = (int)BCs.size() - 1; index >= 0; --index)
+                                            BCs[index]->adaptBCForDirection(*this, bc, internX1, internX2,
                                                                                    internX3, q, fdir, timestep);
                                     }
 
@@ -558,8 +558,8 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block)
                                 p[2] = ix3;
                                 transNodeIndices.insert(p);
 
-                                for (int index = (int)bcAdapters.size() - 1; index >= 0; --index)
-                                    bcAdapters[index]->adaptBC(*this, bc, internX1, internX2, internX3, timestep);
+                                for (int index = (int)BCs.size() - 1; index >= 0; --index)
+                                    BCs[index]->adaptBC(*this, bc, internX1, internX2, internX3, timestep);
                             }
                         }
                     }
@@ -583,7 +583,7 @@ void D3Q27Interactor::addQsLineSet(std::vector<UbTupleFloat3> &nodes, std::vecto
         UbTupleDouble3 orgDelta = grid.lock()->getNodeOffset(block);
 
         SPtr<ILBMKernel> kernel = block->getKernel();
-        SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
         map<SPtr<Block3D>, set<std::vector<int>>>::iterator pos = bcNodeIndicesMap.find(block);
         if (pos == bcNodeIndicesMap.end()) {
@@ -779,7 +779,7 @@ vector<pair<GbPoint3D, GbPoint3D>> D3Q27Interactor::getQsLineSet()
 
     for (SPtr<Block3D> block : bcBlocks) {
         SPtr<ILBMKernel> kernel   = block->getKernel();
-        SPtr<BCArray3D> bcMatrix  = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcMatrix  = kernel->getBCSet()->getBCArray();
         UbTupleDouble3 nodeOffset = grid.lock()->getNodeOffset(block);
 
         // Check whether top row is real in the system or not
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.h b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.h
index 80a58efccb36588111ddf5301f3fb68068e20958..e0094d646a4dd621e7d5815fc7fc6ce6e4450dbe 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.h
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.h
@@ -48,7 +48,7 @@
 #include "UbException.h"
 #include "UbTuple.h"
 
-class BCAdapter;
+class BC;
 class Block3D;
 class Grid3D;
 class GbObject3D;
@@ -63,8 +63,8 @@ class D3Q27Interactor : public Interactor3D
 public:
     D3Q27Interactor();
     D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, int type);
-    D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BCAdapter> bcAdapter, int type);
-    D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BCAdapter> bcAdapter, int type,
+    D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BC> BC, int type);
+    D3Q27Interactor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, SPtr<BC> BC, int type,
                     Interactor3D::Accuracy a);
 
     ~D3Q27Interactor() override;
@@ -72,8 +72,8 @@ public:
     void setRelevantForForces(const bool &value) { this->relevantForForces = value; }
     bool isRelevantForForces() { return this->relevantForForces; }
 
-    virtual void addBCAdapter(const SPtr<BCAdapter> bcAdapter) { bcAdapters.push_back(bcAdapter); }
-    void deleteBCAdapter() { bcAdapters.clear(); }
+    virtual void addBC(const SPtr<BC> BC) { BCs.push_back(BC); }
+    void deleteBC() { BCs.clear(); }
 
     void initInteractor(const real &timeStep = 0) override;
     void updateInteractor(const real &timestep = 0) override;
@@ -106,7 +106,7 @@ protected:
     bool relevantForForces;
     bool reinitWithStoredQsFlag;
 
-    std::vector<SPtr<BCAdapter>> bcAdapters;
+    std::vector<SPtr<BC>> BCs;
 
     SolidNodeIndicesMap solidNodeIndicesMap;
     BcNodeIndicesMap bcNodeIndicesMap;
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
index d569d3c0f16b24ea7592c09b26a06b8be69e126c..237097ed5fd48f29b0b2e236cc497bd42110e681 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
@@ -8,12 +8,12 @@
 #include <basics/writer/WbWriterVtkXmlBinary.h>
 
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include "Grid3D.h"
 #include "LBMKernel.h"
-#include "VelocityBCAdapter.h"
+#include "VelocityBC.h"
 #include "basics/utilities/UbTiming.h"
 #include <geometry3d/GbCuboid3D.h>
 #include <geometry3d/GbHalfSpace3D.h>
@@ -37,15 +37,15 @@ D3Q27TriFaceMeshInteractor::D3Q27TriFaceMeshInteractor(SPtr<Grid3D> /*grid*/, st
 }
 //////////////////////////////////////////////////////////////////////////
 D3Q27TriFaceMeshInteractor::D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, SPtr<Grid3D> grid,
-                                                       SPtr<BCAdapter> bcAdapter, int type)
-    : D3Q27Interactor(triFaceMesh, grid, bcAdapter, type)
+                                                       SPtr<BC> BC, int type)
+    : D3Q27Interactor(triFaceMesh, grid, BC, type)
 {
     this->stressMode = STRESSNORMAL;
 }
 //////////////////////////////////////////////////////////////////////////
 D3Q27TriFaceMeshInteractor::D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, SPtr<Grid3D> grid,
-                                                       SPtr<BCAdapter> bcAdapter, int type, Interactor3D::Accuracy a)
-    : D3Q27Interactor(triFaceMesh, grid, bcAdapter, type, a)
+                                                       SPtr<BC> BC, int type, Interactor3D::Accuracy a)
+    : D3Q27Interactor(triFaceMesh, grid, BC, type, a)
 {
     this->stressMode = STRESSNORMAL;
 }
@@ -75,7 +75,7 @@ bool D3Q27TriFaceMeshInteractor::setDifferencesToGbObject3D(const SPtr<Block3D>
     SPtr<BoundaryConditions> bc;
 
     SPtr<ILBMKernel> kernel = block->getKernel();
-    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
     real internX1, internX2, internX3;
 
@@ -138,15 +138,15 @@ void D3Q27TriFaceMeshInteractor::setQs(const real &timeStep)
     //////////////////////////////////////////////////////////////////////////
     // init bcs
     //////////////////////////////////////////////////////////////////////////
-    int nofAdapter = (int)this->bcAdapters.size();
+    int nofAdapter = (int)this->BCs.size();
     if (nofAdapter == 0)
         std::cout
             << "WARNING - D3Q27TriFaceMeshInteractor::initInteractor Warning - no nodeAdapter available for " /*<<this->getName()*/
             << std::endl;
     bool needTimeDependence = false;
     for (int pos = 0; pos < nofAdapter; ++pos) {
-        this->bcAdapters[pos]->init(this, timeStep);
-        if (this->bcAdapters[pos]->isTimeDependent())
+        this->BCs[pos]->init(this, timeStep);
+        if (this->BCs[pos]->isTimeDependent())
             needTimeDependence = true;
     }
     if (needTimeDependence)
@@ -351,7 +351,7 @@ void D3Q27TriFaceMeshInteractor::setQs(const real &timeStep)
                 bool blockGotBCs = false;
 
                 SPtr<ILBMKernel> kernel  = block->getKernel();
-                SPtr<BCArray3D> bcMatrix = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcMatrix = kernel->getBCSet()->getBCArray();
 
                 int indexMinX1 = 0;
                 int indexMinX2 = 0;
@@ -539,8 +539,8 @@ void D3Q27TriFaceMeshInteractor::setQs(const real &timeStep)
                                     bc->setBoundaryVelocityX2(vx2);
                                     bc->setBoundaryVelocityX3(vx3);
 
-                                    for (int index = (int)this->bcAdapters.size() - 1; index >= 0; --index)
-                                        this->bcAdapters[index]->adaptBCForDirection(*this, bc, internX1, internX2,
+                                    for (int index = (int)this->BCs.size() - 1; index >= 0; --index)
+                                        this->BCs[index]->adaptBCForDirection(*this, bc, internX1, internX2,
                                                                                      internX3, q, fdir);
 
                                     // fuer beschleunigtes wiedereinlesen
@@ -565,8 +565,8 @@ void D3Q27TriFaceMeshInteractor::setQs(const real &timeStep)
                                 p[2] = ix3;
                                 bcNodeIndices.insert(p);
 
-                                for (int index = (int)this->bcAdapters.size() - 1; index >= 0; --index)
-                                    this->bcAdapters[index]->adaptBC(*this, bc, internX1, internX2, internX3);
+                                for (int index = (int)this->BCs.size() - 1; index >= 0; --index)
+                                    this->BCs[index]->adaptBC(*this, bc, internX1, internX2, internX3);
                             }
                         }
                     }
@@ -617,15 +617,15 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
     //////////////////////////////////////////////////////////////////////////
     // init bcs
     //////////////////////////////////////////////////////////////////////////
-    int nofAdapter = (int)this->bcAdapters.size();
+    int nofAdapter = (int)this->BCs.size();
     if (nofAdapter == 0)
         std::cout
             << "WARNING - D3Q27TriFaceMeshInteractor::initInteractor Warning - no nodeAdapter available for " /*<<this->getName()*/
             << std::endl;
     bool needTimeDependence = false;
     for (int pos = 0; pos < nofAdapter; ++pos) {
-        this->bcAdapters[pos]->init(this, timeStep);
-        if (this->bcAdapters[pos]->isTimeDependent())
+        this->BCs[pos]->init(this, timeStep);
+        if (this->BCs[pos]->isTimeDependent())
             needTimeDependence = true;
     }
     if (needTimeDependence)
@@ -870,7 +870,7 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
                 bool blockGotBCs = false;
 
                 SPtr<ILBMKernel> kernel  = block->getKernel();
-                SPtr<BCArray3D> bcMatrix = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcMatrix = kernel->getBCSet()->getBCArray();
 
                 int indexMinX1 = 0;
                 int indexMinX2 = 0;
@@ -1066,8 +1066,8 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
                                         bc->setBoundaryVelocityX2(vx2);
                                         bc->setBoundaryVelocityX3(vx3);
 
-                                        for (int index = (int)this->bcAdapters.size() - 1; index >= 0; --index)
-                                            this->bcAdapters[index]->adaptBCForDirection(*this, bc, internX1, internX2,
+                                        for (int index = (int)this->BCs.size() - 1; index >= 0; --index)
+                                            this->BCs[index]->adaptBCForDirection(*this, bc, internX1, internX2,
                                                                                          internX3, q, fdir);
 
                                         // SG 26.08.2010 gotQs=blockGotBCs=true;
@@ -1094,8 +1094,8 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
                                 p[2] = ix3;
                                 bcNodeIndices.insert(p);
 
-                                for (int index = (int)this->bcAdapters.size() - 1; index >= 0; --index)
-                                    this->bcAdapters[index]->adaptBC(*this, bc, internX1, internX2, internX3);
+                                for (int index = (int)this->BCs.size() - 1; index >= 0; --index)
+                                    this->BCs[index]->adaptBC(*this, bc, internX1, internX2, internX3);
                             }
                         }
                     }
@@ -1168,7 +1168,7 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
                 SPtr<ILBMKernel> kernel = block->getKernel();
                 if (!kernel)
                     throw UbException(UB_EXARGS, "na sowas kein kernel bzw. kernel=NULL (2)");
-                SPtr<BCArray3D> bcMatrix = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcMatrix = kernel->getBCSet()->getBCArray();
 
                 //            bvd->getTimer().start();
                 //            int indexMinX1 = 0;
@@ -1847,7 +1847,7 @@ void D3Q27TriFaceMeshInteractor::reinitWithStoredQs(const real & /*timeStep*/)
         SPtr<Block3D> block = it1->first;
 
         SPtr<ILBMKernel> kernel           = block->getKernel();
-        SPtr<BCArray3D> bcMatrix          = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcMatrix          = kernel->getBCSet()->getBCArray();
         std::set<UbTupleInt3> &indicesSet = it1->second;
 
         for (std::set<UbTupleInt3>::iterator setIt = indicesSet.begin(); setIt != indicesSet.end(); ++setIt) {
@@ -1860,7 +1860,7 @@ void D3Q27TriFaceMeshInteractor::reinitWithStoredQs(const real & /*timeStep*/)
     for (it = bcNodeIndicesAndQsMap.begin(); it != bcNodeIndicesAndQsMap.end(); ++it) {
         SPtr<Block3D> block      = it->first;
         SPtr<ILBMKernel> kernel  = block->getKernel();
-        SPtr<BCArray3D> bcMatrix = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcMatrix = kernel->getBCSet()->getBCArray();
 
         std::map<UbTupleInt3, std::vector<float>>::iterator it2;
         for (it2 = it->second.begin(); it2 != it->second.end(); ++it2) {
@@ -1894,14 +1894,14 @@ void D3Q27TriFaceMeshInteractor::reinitWithStoredQs(const real & /*timeStep*/)
             for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) {
                 if (UbMath::greater(qs[fdir], -1.0) && UbMath::less(qs[fdir], bc->getQ(fdir))) {
                     gotQs = true;
-                    for (size_t index = 0; index < this->bcAdapters.size(); index++)
-                        this->bcAdapters[index]->adaptBCForDirection(*this, bc, x1w, x2w, x3w, qs[fdir], fdir);
+                    for (size_t index = 0; index < this->BCs.size(); index++)
+                        this->BCs[index]->adaptBCForDirection(*this, bc, x1w, x2w, x3w, qs[fdir], fdir);
                 }
             }
 
             if (gotQs)
-                for (size_t index = 0; index < this->bcAdapters.size(); index++)
-                    this->bcAdapters[index]->adaptBC(*this, bc, x1w, x2w, x3w);
+                for (size_t index = 0; index < this->BCs.size(); index++)
+                    this->BCs[index]->adaptBC(*this, bc, x1w, x2w, x3w);
         }
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.h b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.h
index 9e42de660502b33048abf31f5e831902134d3826..ddcac4ad22a50f31f1c1f884bc234b9bd49c6080 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.h
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.h
@@ -11,7 +11,7 @@
 
 class GbObject3D;
 class Grid3D;
-class BCAdapter;
+class BC;
 class GbTriFaceMesh3D;
 class Block3D;
 
@@ -24,11 +24,11 @@ public:
     D3Q27TriFaceMeshInteractor();
     D3Q27TriFaceMeshInteractor(SPtr<Grid3D> grid, std::string name = "D3Q27TriFaceMeshInteractor");
     D3Q27TriFaceMeshInteractor(SPtr<GbObject3D> geoObject3D, SPtr<Grid3D> grid, int type);
-    D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, SPtr<Grid3D> grid, SPtr<BCAdapter> bcAdapter,
+    D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, SPtr<Grid3D> grid, SPtr<BC> BC,
                                int type);
-    D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, SPtr<Grid3D> grid, SPtr<BCAdapter> bcAdapter,
+    D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, SPtr<Grid3D> grid, SPtr<BC> BC,
                                int type, Interactor3D::Accuracy a);
-    // D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, D3Q27BoundaryConditionAdapterPtr bcAdapter, int
+    // D3Q27TriFaceMeshInteractor(SPtr<GbTriFaceMesh3D> triFaceMesh, D3Q27BoundaryConditionAdapterPtr BC, int
     // type, std::string name="D3Q27TriFaceMeshInteractor");
 
     ~D3Q27TriFaceMeshInteractor() override;
diff --git a/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp
index ffe11c011334da5fe8b3f7050ff817245f85e0a1..8b1b78b73f8ad2ec43bd63dedcde6dbfb6c1c107 100644
--- a/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp
@@ -1,6 +1,6 @@
 #include "BGKLBMKernel.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27EsoTwist3DSoA.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "D3Q27System.h"
@@ -27,7 +27,7 @@ SPtr<LBMKernel> BGKLBMKernel::clone()
     kernel->setNX(nx);
     std::dynamic_pointer_cast<BGKLBMKernel>(kernel)->initDataSet();
     kernel->setCollisionFactor(this->collFactor);
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -69,7 +69,7 @@ void BGKLBMKernel::calculate(int step)
     zeroDistributions =
         std::dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
     real f[D3Q27System::ENDF + 1];
     real feq[D3Q27System::ENDF + 1];
     real drho, vx1, vx2, vx3;
@@ -141,39 +141,39 @@ void BGKLBMKernel::calculate(int step)
                     real cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
                     feq[DIR_000] = c8o27 * (drho - cu_sq);
-                    feq[DIR_P00]    = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
-                    feq[DIR_M00]    = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
-                    feq[DIR_0P0]    = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
-                    feq[DIR_0M0]    = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
-                    feq[DIR_00P]    = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
-                    feq[DIR_00M]    = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
-                    feq[DIR_PP0]   = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
-                    feq[DIR_MM0]   = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
-                    feq[DIR_PM0]   = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
-                    feq[DIR_MP0]   = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
-                    feq[DIR_P0P]   = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
-                    feq[DIR_M0M]   = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
-                    feq[DIR_P0M]   = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
-                    feq[DIR_M0P]   = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
-                    feq[DIR_0PP]   = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
-                    feq[DIR_0MM]   = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
-                    feq[DIR_0PM]   = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
-                    feq[DIR_0MP]   = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
+                    feq[DIR_P00]    = c2o27 * (drho + c3o1 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
+                    feq[DIR_M00]    = c2o27 * (drho + c3o1 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
+                    feq[DIR_0P0]    = c2o27 * (drho + c3o1 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
+                    feq[DIR_0M0]    = c2o27 * (drho + c3o1 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
+                    feq[DIR_00P]    = c2o27 * (drho + c3o1 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
+                    feq[DIR_00M]    = c2o27 * (drho + c3o1 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
+                    feq[DIR_PP0]   = c1o54 * (drho + c3o1 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
+                    feq[DIR_MM0]   = c1o54 * (drho + c3o1 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
+                    feq[DIR_PM0]   = c1o54 * (drho + c3o1 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
+                    feq[DIR_MP0]   = c1o54 * (drho + c3o1 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
+                    feq[DIR_P0P]   = c1o54 * (drho + c3o1 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
+                    feq[DIR_M0M]   = c1o54 * (drho + c3o1 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
+                    feq[DIR_P0M]   = c1o54 * (drho + c3o1 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
+                    feq[DIR_M0P]   = c1o54 * (drho + c3o1 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
+                    feq[DIR_0PP]   = c1o54 * (drho + c3o1 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
+                    feq[DIR_0MM]   = c1o54 * (drho + c3o1 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
+                    feq[DIR_0PM]   = c1o54 * (drho + c3o1 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
+                    feq[DIR_0MP]   = c1o54 * (drho + c3o1 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
                     feq[DIR_PPP]  = c1o216 *
-                               (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
-                    feq[DIR_MMM] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) +
+                               (drho + c3o1 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
+                    feq[DIR_MMM] = c1o216 * (drho + c3o1 * (-vx1 - vx2 - vx3) +
                                          c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
                     feq[DIR_PPM] = c1o216 *
-                               (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
-                    feq[DIR_MMP] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) +
+                               (drho + c3o1 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
+                    feq[DIR_MMP] = c1o216 * (drho + c3o1 * (-vx1 - vx2 + vx3) +
                                          c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
                     feq[DIR_PMP] = c1o216 *
-                               (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
-                    feq[DIR_MPM] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) +
+                               (drho + c3o1 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
+                    feq[DIR_MPM] = c1o216 * (drho + c3o1 * (-vx1 + vx2 - vx3) +
                                          c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
                     feq[DIR_PMM] = c1o216 *
-                               (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
-                    feq[DIR_MPP] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) +
+                               (drho + c3o1 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
+                    feq[DIR_MPP] = c1o216 * (drho + c3o1 * (-vx1 + vx2 + vx3) +
                                          c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
 
                     // Relaxation
@@ -217,33 +217,33 @@ void BGKLBMKernel::calculate(int step)
                         forcingX2 = muForcingX2.Eval();
                         forcingX3 = muForcingX3.Eval();
 
-                        f[DIR_000] += 0.0;
-                        f[DIR_P00] += 3.0 * c2o27 * (forcingX1);
-                        f[DIR_M00] += 3.0 * c2o27 * (-forcingX1);
-                        f[DIR_0P0] += 3.0 * c2o27 * (forcingX2);
-                        f[DIR_0M0] += 3.0 * c2o27 * (-forcingX2);
-                        f[DIR_00P] += 3.0 * c2o27 * (forcingX3);
-                        f[DIR_00M] += 3.0 * c2o27 * (-forcingX3);
-                        f[DIR_PP0] += 3.0 * c1o54 * (forcingX1 + forcingX2);
-                        f[DIR_MM0] += 3.0 * c1o54 * (-forcingX1 - forcingX2);
-                        f[DIR_PM0] += 3.0 * c1o54 * (forcingX1 - forcingX2);
-                        f[DIR_MP0] += 3.0 * c1o54 * (-forcingX1 + forcingX2);
-                        f[DIR_P0P] += 3.0 * c1o54 * (forcingX1 + forcingX3);
-                        f[DIR_M0M] += 3.0 * c1o54 * (-forcingX1 - forcingX3);
-                        f[DIR_P0M] += 3.0 * c1o54 * (forcingX1 - forcingX3);
-                        f[DIR_M0P] += 3.0 * c1o54 * (-forcingX1 + forcingX3);
-                        f[DIR_0PP] += 3.0 * c1o54 * (forcingX2 + forcingX3);
-                        f[DIR_0MM] += 3.0 * c1o54 * (-forcingX2 - forcingX3);
-                        f[DIR_0PM] += 3.0 * c1o54 * (forcingX2 - forcingX3);
-                        f[DIR_0MP] += 3.0 * c1o54 * (-forcingX2 + forcingX3);
-                        f[DIR_PPP] += 3.0 * c1o216 * (forcingX1 + forcingX2 + forcingX3);
-                        f[DIR_MMM] += 3.0 * c1o216 * (-forcingX1 - forcingX2 - forcingX3);
-                        f[DIR_PPM] += 3.0 * c1o216 * (forcingX1 + forcingX2 - forcingX3);
-                        f[DIR_MMP] += 3.0 * c1o216 * (-forcingX1 - forcingX2 + forcingX3);
-                        f[DIR_PMP] += 3.0 * c1o216 * (forcingX1 - forcingX2 + forcingX3);
-                        f[DIR_MPM] += 3.0 * c1o216 * (-forcingX1 + forcingX2 - forcingX3);
-                        f[DIR_PMM] += 3.0 * c1o216 * (forcingX1 - forcingX2 - forcingX3);
-                        f[DIR_MPP] += 3.0 * c1o216 * (-forcingX1 + forcingX2 + forcingX3);
+                        f[DIR_000] += c0o1;
+                        f[DIR_P00] += c3o1 * c2o27 * (forcingX1);
+                        f[DIR_M00] += c3o1 * c2o27 * (-forcingX1);
+                        f[DIR_0P0] += c3o1 * c2o27 * (forcingX2);
+                        f[DIR_0M0] += c3o1 * c2o27 * (-forcingX2);
+                        f[DIR_00P] += c3o1 * c2o27 * (forcingX3);
+                        f[DIR_00M] += c3o1 * c2o27 * (-forcingX3);
+                        f[DIR_PP0] += c3o1 * c1o54 * (forcingX1 + forcingX2);
+                        f[DIR_MM0] += c3o1 * c1o54 * (-forcingX1 - forcingX2);
+                        f[DIR_PM0] += c3o1 * c1o54 * (forcingX1 - forcingX2);
+                        f[DIR_MP0] += c3o1 * c1o54 * (-forcingX1 + forcingX2);
+                        f[DIR_P0P] += c3o1 * c1o54 * (forcingX1 + forcingX3);
+                        f[DIR_M0M] += c3o1 * c1o54 * (-forcingX1 - forcingX3);
+                        f[DIR_P0M] += c3o1 * c1o54 * (forcingX1 - forcingX3);
+                        f[DIR_M0P] += c3o1 * c1o54 * (-forcingX1 + forcingX3);
+                        f[DIR_0PP] += c3o1 * c1o54 * (forcingX2 + forcingX3);
+                        f[DIR_0MM] += c3o1 * c1o54 * (-forcingX2 - forcingX3);
+                        f[DIR_0PM] += c3o1 * c1o54 * (forcingX2 - forcingX3);
+                        f[DIR_0MP] += c3o1 * c1o54 * (-forcingX2 + forcingX3);
+                        f[DIR_PPP] += c3o1 * c1o216 * (forcingX1 + forcingX2 + forcingX3);
+                        f[DIR_MMM] += c3o1 * c1o216 * (-forcingX1 - forcingX2 - forcingX3);
+                        f[DIR_PPM] += c3o1 * c1o216 * (forcingX1 + forcingX2 - forcingX3);
+                        f[DIR_MMP] += c3o1 * c1o216 * (-forcingX1 - forcingX2 + forcingX3);
+                        f[DIR_PMP] += c3o1 * c1o216 * (forcingX1 - forcingX2 + forcingX3);
+                        f[DIR_MPM] += c3o1 * c1o216 * (-forcingX1 + forcingX2 - forcingX3);
+                        f[DIR_PMM] += c3o1 * c1o216 * (forcingX1 - forcingX2 - forcingX3);
+                        f[DIR_MPP] += c3o1 * c1o216 * (-forcingX1 + forcingX2 + forcingX3);
                     }
                     //////////////////////////////////////////////////////////////////////////
 #ifdef PROOF_CORRECTNESS
@@ -302,4 +302,4 @@ void BGKLBMKernel::calculate(int step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-real BGKLBMKernel::getCalculationTime() { return 0.0; }
+real BGKLBMKernel::getCalculationTime() { return vf::lbm::constant::c0o1; }
diff --git a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp
index 12c4b6e891214a683e3e4ac23b52e14e72e093a2..97659e93ebe0970a7ffb0a01dd8c9d1b0d45721e 100644
--- a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp
@@ -1,7 +1,7 @@
 #include "BasicLBMKernel.h"
 #include "D3Q27System.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 
 BasicLBMKernel::BasicLBMKernel()
 {
@@ -28,7 +28,7 @@ void BasicLBMKernel::calculate(int step)
 
    initData();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
    const int bcArrayMaxX2 = (int)bcArray->getNX2();
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp
index 45cc9651ca25dcd0b0904b753f6f1899a7a09d00..6ff48d9d1e3f2bc36c0709a8051e8ad5905faccf 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp
@@ -16,8 +16,8 @@ using namespace vf::lbm::constant;
 CompressibleCumulant4thOrderViscosityLBMKernel::CompressibleCumulant4thOrderViscosityLBMKernel()
 {
    this->compressible = true;
-   this->bulkViscosity = 0;
-   this->OxxPyyPzz = 1.0;
+   this->bulkViscosity = vf::lbm::constant::c0o1;
+   this->OxxPyyPzz = vf::lbm::constant::c1o1;
 }
 //////////////////////////////////////////////////////////////////////////
 CompressibleCumulant4thOrderViscosityLBMKernel::~CompressibleCumulant4thOrderViscosityLBMKernel(void)
@@ -35,7 +35,7 @@ SPtr<LBMKernel> CompressibleCumulant4thOrderViscosityLBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<CompressibleCumulant4thOrderViscosityLBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -77,7 +77,7 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step)
       muForcingX2.DefineVar("dt", &muDeltaT);
       muForcingX3.DefineVar("dt", &muDeltaT);
 
-      muNu = (1.0/3.0)*(1.0/collFactor - 1.0/2.0);
+      muNu = (c1o1/c3o1)*(c1o1/collFactor - c1o1/c2o1);
 
       muForcingX1.DefineVar("nu", &muNu);
       muForcingX2.DefineVar("nu", &muNu);
@@ -93,7 +93,7 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step)
    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
    const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -110,16 +110,16 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step)
    //LBMReal OxyyPxzz  = eight*(-two+omega)*(one+two*omega)/(-eight-fourteen*omega+seven*omega*omega);//one;
    //LBMReal OxyyMxzz  = eight*(-two+omega)*(-seven+four*omega)/(fiftysix-fifty*omega+nine*omega*omega);//one;
    //LBMReal Oxyz      = twentyfour*(-two+omega)*(-two-seven*omega+three*omega*omega)/(fourtyeight+c152*omega-c130*omega*omega+twentynine*omega*omega*omega);
-   real OxyyPxzz  = 8.0*(omega-2.0)*(OxxPyyPzz*(3.0*omega-1.0)-5.0*omega)/(8.0*(5.0-2.0*omega)*omega+OxxPyyPzz*(8.0+omega*(9.0*omega-26.0)));
-   real OxyyMxzz  = 8.0*(omega-2.0)*(omega+OxxPyyPzz*(3.0*omega-7.0))/(OxxPyyPzz*(56.0-42.0*omega+9.0*omega*omega)-8.0*omega);
-   real Oxyz      = 24.0*(omega-2.0)*(4.0*omega*omega+omega*OxxPyyPzz*(18.0-13.0*omega)+OxxPyyPzz*OxxPyyPzz*(2.0+omega*(6.0*omega-11.0)))/(16.0*omega*omega*(omega-6.0)-2.0*omega*OxxPyyPzz*(216.0+5.0*omega*(9.0*omega-46.0))+OxxPyyPzz*OxxPyyPzz*(omega*(3.0*omega-10.0)*(15.0*omega-28.0)-48.0));
+   real OxyyPxzz  = c8o1*(omega-c2o1)*(OxxPyyPzz*(c3o1*omega-c1o1)-c5o1*omega)/(c8o1 *(c5o1-c2o1*omega)*omega+OxxPyyPzz*(c8o1+omega*(c9o1*omega-c26o1)));
+   real OxyyMxzz  = c8o1*(omega-c2o1)*(omega+OxxPyyPzz*(c3o1*omega-c7o1))/(OxxPyyPzz*(c56o1-c42o1*omega+c9o1*omega*omega)-c8o1*omega);
+   real Oxyz      = c24o1*(omega-c2o1)*(c4o1*omega*omega+omega*OxxPyyPzz*(c18o1-c13o1*omega)+OxxPyyPzz*OxxPyyPzz*(c2o1+omega*(c6o1*omega-c11o1)))/(c16o1*omega*omega*(omega-c6o1)-c2o1*omega*OxxPyyPzz*(c216o1+c5o1*omega*(c9o1*omega-c46o1))+OxxPyyPzz*OxxPyyPzz*(omega*(c3o1*omega-c10o1)*(c15o1*omega-c28o1)-c48o1));
 
    //LBMReal A = (four + two*omega - three*omega*omega) / (two - seven*omega + five*omega*omega);
    //LBMReal B = (four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega);
 
-   real A = (4.0*omega*omega+2.0*omega*OxxPyyPzz*(omega-6.0)+OxxPyyPzz*OxxPyyPzz*(omega*(10.0-3.0*omega)-4.0))/((omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega));
+   real A = (c4o1*omega*omega+c2o1*omega*OxxPyyPzz*(omega-c6o1)+OxxPyyPzz*OxxPyyPzz*(omega*(c10o1-c3o1*omega)-c4o1))/((omega-OxxPyyPzz)*(OxxPyyPzz*(c2o1+c3o1*omega)-c8o1*omega));
    //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
-   real B = (4.0*omega*OxxPyyPzz*(9.0*omega-16.0)-4.0*omega*omega-2.0*OxxPyyPzz*OxxPyyPzz*(2.0+9.0*omega*(omega-2.0)))/(3.0*(omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega));
+   real B = (c4o1*omega*OxxPyyPzz*(c9o1*omega-c16o1)-c4o1*omega*omega-c2o1*OxxPyyPzz*OxxPyyPzz*(c2o1+c9o1*omega*(omega-c2o1)))/(c3o1*(omega-OxxPyyPzz)*(OxxPyyPzz*(c2o1+c3o1*omega)-c8o1*omega));
 
    for (int x3 = minX3; x3 < maxX3; x3++)
    {
@@ -213,9 +213,9 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step)
                   forcingX2 = muForcingX2.Eval();
                   forcingX3 = muForcingX3.Eval();
 
-                  vvx += forcingX1*deltaT*0.5; // X
-                  vvy += forcingX2*deltaT*0.5; // Y
-                  vvz += forcingX3*deltaT*0.5; // Z
+                  vvx += forcingX1*deltaT*c1o2; // X
+                  vvy += forcingX2*deltaT*c1o2; // Y
+                  vvz += forcingX3*deltaT*c1o2; // Z
                }
                ///////////////////////////////////////////////////////////////////////////////////////////               
          ////////////////////////////////////////////////////////////////////////////////////
@@ -230,9 +230,9 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step)
                vz2 = vvz*vvz;
                ////////////////////////////////////////////////////////////////////////////////////
                real wadjust;
-               real qudricLimitP = 0.01;// * 0.0001f;
-               real qudricLimitM = 0.01;// * 0.0001f;
-               real qudricLimitD = 0.01;// * 0.001f;
+               real qudricLimitP = c1o100;// * 0.0001f;
+               real qudricLimitM = c1o100;// * 0.0001f;
+               real qudricLimitD = c1o100;// * 0.001f;
                //LBMReal s9 = minusomega;
                //test
                //s9 = 0.;
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.h
index fc3e0dffb6abf836995aaecc95f07fc4fcaf1d64..3b7ee8f849187b2c40fc8f5803bdd04ad4982344 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.h
@@ -2,7 +2,7 @@
 #define CompressibleCumulant4thOrderViscosityLBMKernel_h__
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp
index 2552de70437992a5cbf79a13f40615e46b084fb6..a68c625380e75af1d0f927cccad2bdf9b9f72f57 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp
@@ -15,9 +15,9 @@ CompressibleCumulantLBMKernel::CompressibleCumulantLBMKernel()
 {
    this->compressible = true;
    this->parameter = CompressibleCumulantLBMKernel::NORMAL;
-   this->OxyyMxzz = 1.0;
+   this->OxyyMxzz = c1o1;
    this->bulkOmegaToOmega = false;
-   this->OxxPyyPzz = 1.0;
+   this->OxxPyyPzz = c1o1;
 }
 //////////////////////////////////////////////////////////////////////////
 CompressibleCumulantLBMKernel::~CompressibleCumulantLBMKernel(void)
@@ -35,7 +35,7 @@ SPtr<LBMKernel> CompressibleCumulantLBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<CompressibleCumulantLBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -47,10 +47,10 @@ SPtr<LBMKernel> CompressibleCumulantLBMKernel::clone()
    switch (parameter)
    {
    case NORMAL:
-      dynamicPointerCast<CompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = 1.0;
+      dynamicPointerCast<CompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = c1o1;
       break;
    case MAGIC:
-      dynamicPointerCast<CompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = 2.0 +(-collFactor);
+      dynamicPointerCast<CompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = c2o1 +(-collFactor);
       break;
    }
 
@@ -85,7 +85,7 @@ void CompressibleCumulantLBMKernel::calculate(int step)
       muForcingX2.DefineVar("dt", &muDeltaT);
       muForcingX3.DefineVar("dt", &muDeltaT);
 
-      muNu = (1.0/3.0)*(1.0/collFactor - 1.0/2.0);
+      muNu = (c1o1 / c3o1)*(c1o1 /collFactor - c1o1 / c2o1);
 
       muForcingX1.DefineVar("nu", &muNu);
       muForcingX2.DefineVar("nu", &muNu);
@@ -101,7 +101,7 @@ void CompressibleCumulantLBMKernel::calculate(int step)
    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
    const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -215,9 +215,9 @@ void CompressibleCumulantLBMKernel::calculate(int step)
                      forcingX2 = muForcingX2.Eval();
                      forcingX3 = muForcingX3.Eval();
 
-                     vvx += forcingX1*deltaT*0.5; // X
-                     vvy += forcingX2*deltaT*0.5; // Y
-                     vvz += forcingX3*deltaT*0.5; // Z
+                     vvx += forcingX1*deltaT*c1o2; // X
+                     vvy += forcingX2*deltaT*c1o2; // Y
+                     vvz += forcingX3*deltaT*c1o2; // Z
                   }
                   ///////////////////////////////////////////////////////////////////////////////////////////               
             ////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.h
index 7af69201cde7bd8812173f1b6bd9d397e731686b..84910ef267efcba7f4cb90cba8a7514642461420 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.h
@@ -2,7 +2,7 @@
 #define CompressibleCumulantLBMKernel_h__
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp
index 358f8269a65b247efb7abd9c6a2a840c6e122e08..ed0ce941ed5e1d4ee967391cec080105848e8b11 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp
@@ -39,21 +39,21 @@ void CompressibleOffsetInterpolationProcessor::setOffsets(real xoff, real yoff,
 void CompressibleOffsetInterpolationProcessor::interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellC, omegaC, 0.5);
-   calcInterpolatedNodeCF(icellF.BSW, omegaF, -0.25, -0.25, -0.25, calcPressBSW(), -1, -1, -1);
-   calcInterpolatedNodeCF(icellF.BNE, omegaF,  0.25,  0.25, -0.25, calcPressBNE(),  1,  1, -1);
-   calcInterpolatedNodeCF(icellF.TNW, omegaF, -0.25,  0.25,  0.25, calcPressTNW(), -1,  1,  1);
-   calcInterpolatedNodeCF(icellF.TSE, omegaF,  0.25, -0.25,  0.25, calcPressTSE(),  1, -1,  1);
-   calcInterpolatedNodeCF(icellF.BNW, omegaF, -0.25,  0.25, -0.25, calcPressBNW(), -1,  1, -1);
-   calcInterpolatedNodeCF(icellF.BSE, omegaF,  0.25, -0.25, -0.25, calcPressBSE(),  1, -1, -1);
-   calcInterpolatedNodeCF(icellF.TSW, omegaF, -0.25, -0.25,  0.25, calcPressTSW(), -1, -1,  1);
-   calcInterpolatedNodeCF(icellF.TNE, omegaF,  0.25,  0.25,  0.25, calcPressTNE(),  1,  1,  1);
+   calcInterpolatedCoefficiets(icellC, omegaC, c1o2);
+   calcInterpolatedNodeCF(icellF.BSW, omegaF, -c1o4, -c1o4, -c1o4, calcPressBSW(), -c1o1, -c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.BNE, omegaF,  c1o4,  c1o4, -c1o4, calcPressBNE(),  c1o1,  c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.TNW, omegaF, -c1o4,  c1o4,  c1o4, calcPressTNW(), -c1o1,  c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.TSE, omegaF,  c1o4, -c1o4,  c1o4, calcPressTSE(),  c1o1, -c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.BNW, omegaF, -c1o4,  c1o4, -c1o4, calcPressBNW(), -c1o1,  c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.BSE, omegaF,  c1o4, -c1o4, -c1o4, calcPressBSE(),  c1o1, -c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.TSW, omegaF, -c1o4, -c1o4,  c1o4, calcPressTSW(), -c1o1, -c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.TNE, omegaF,  c1o4,  c1o4,  c1o4, calcPressTNE(),  c1o1,  c1o1,  c1o1);
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetInterpolationProcessor::interpolateFineToCoarse(D3Q27ICell& icellF, real* icellC, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellF, omegaF, 2.0);
+   calcInterpolatedCoefficiets(icellF, omegaF, c2o1);
    calcInterpolatedNodeFC(icellC, omegaC);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -64,16 +64,16 @@ void CompressibleOffsetInterpolationProcessor::calcMoments(const real* const f,
    using namespace vf::lbm::dir;
    using namespace vf::lbm::constant;
 
-   real drho = 0.0;
+   real drho = c0o1;
    D3Q27System::calcCompMacroscopicValues(f,drho,vx1,vx2,vx3);
    
    press = drho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(c1o1 + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(c1o1 + drho)-(vx2*vx3));
-   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(c1o1 + drho)-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(c1o1 + drho)-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(c1o1 + drho)-(vx1*vx1-vx3*vx3));
+   kxy   = -c3o1*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(c1o1 + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -c3o1*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(c1o1 + drho)-(vx2*vx3));
+   kxz   = -c3o1*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(c1o1 + drho)-(vx1*vx3));
+   kxxMyy = -c3o1/c2o1*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(c1o1 + drho)-(vx1*vx1-vx2*vx2));
+   kxxMzz = -c3o1/c2o1*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(c1o1 + drho)-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, real omega, real eps_new)
@@ -166,122 +166,122 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
 
 
 
-
+   
 
    a0 = (-kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT -
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET - 2.*kxyFromfcNEQ_NWB - 2.*kxyFromfcNEQ_NWT +
-      2.*kxyFromfcNEQ_SEB + 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB - 2.*kxzFromfcNEQ_NWT +
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB - 2.*kxzFromfcNEQ_SWT +
-      8.*vx1_NEB + 8.*vx1_NET + 8.*vx1_NWB + 8.*vx1_NWT + 8.*vx1_SEB +
-      8.*vx1_SET + 8.*vx1_SWB + 8.*vx1_SWT + 2.*vx2_NEB + 2.*vx2_NET -
-      2.*vx2_NWB - 2.*vx2_NWT - 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB +
-      2.*vx2_SWT - 2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
-   b0 = (2.*kxxMyyFromfcNEQ_NEB + 2.*kxxMyyFromfcNEQ_NET + 2.*kxxMyyFromfcNEQ_NWB + 2.*kxxMyyFromfcNEQ_NWT -
-      2.*kxxMyyFromfcNEQ_SEB - 2.*kxxMyyFromfcNEQ_SET - 2.*kxxMyyFromfcNEQ_SWB - 2.*kxxMyyFromfcNEQ_SWT -
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET - c2o1*kxyFromfcNEQ_NWB - c2o1*kxyFromfcNEQ_NWT +
+      c2o1*kxyFromfcNEQ_SEB + c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB - c2o1*kxzFromfcNEQ_NWT +
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB - c2o1*kxzFromfcNEQ_SWT +
+      c8o1*vx1_NEB + c8o1*vx1_NET + c8o1*vx1_NWB + c8o1*vx1_NWT + c8o1*vx1_SEB +
+      c8o1*vx1_SET + c8o1*vx1_SWB + c8o1*vx1_SWT + c2o1*vx2_NEB + c2o1*vx2_NET -
+      c2o1*vx2_NWB - c2o1*vx2_NWT - c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB +
+      c2o1*vx2_SWT - c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
+   b0 = (c2o1*kxxMyyFromfcNEQ_NEB + c2o1*kxxMyyFromfcNEQ_NET + c2o1*kxxMyyFromfcNEQ_NWB + c2o1*kxxMyyFromfcNEQ_NWT -
+       c2o1*kxxMyyFromfcNEQ_SEB - c2o1*kxxMyyFromfcNEQ_SET - c2o1*kxxMyyFromfcNEQ_SWB - c2o1*kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET + 2.*kxyFromfcNEQ_NWB + 2.*kxyFromfcNEQ_NWT -
-      2.*kxyFromfcNEQ_SEB - 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET + 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB - 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB - 2.*kyzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT +
-      8.*vx2_NEB + 8.*vx2_NET + 8.*vx2_NWB + 8.*vx2_NWT +
-      8.*vx2_SEB + 8.*vx2_SET + 8.*vx2_SWB + 8.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET + c2o1*kxyFromfcNEQ_NWB + c2o1*kxyFromfcNEQ_NWT -
+      c2o1*kxyFromfcNEQ_SEB - c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET + c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB - c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB - c2o1*kyzFromfcNEQ_SWT +
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT +
+      c8o1*vx2_NEB + c8o1*vx2_NET + c8o1*vx2_NWB + c8o1*vx2_NWT +
+      c8o1*vx2_SEB + c8o1*vx2_SET + c8o1*vx2_SWB + c8o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
    c0 = (kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT -
-      2.*kxxMzzFromfcNEQ_NEB + 2.*kxxMzzFromfcNEQ_NET - 2.*kxxMzzFromfcNEQ_NWB + 2.*kxxMzzFromfcNEQ_NWT -
-      2.*kxxMzzFromfcNEQ_SEB + 2.*kxxMzzFromfcNEQ_SET - 2.*kxxMzzFromfcNEQ_SWB + 2.*kxxMzzFromfcNEQ_SWT -
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB + 2.*kxzFromfcNEQ_NWT -
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB + 2.*kxzFromfcNEQ_SWT -
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET - 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB + 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB + 2.*kyzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT +
-      8.*vx3_NEB + 8.*vx3_NET + 8.*vx3_NWB + 8.*vx3_NWT +
-      8.*vx3_SEB + 8.*vx3_SET + 8.*vx3_SWB + 8.*vx3_SWT)/64.;
-   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*kxxMzzFromfcNEQ_NEB + c2o1*kxxMzzFromfcNEQ_NET - c2o1*kxxMzzFromfcNEQ_NWB + c2o1*kxxMzzFromfcNEQ_NWT -
+      c2o1*kxxMzzFromfcNEQ_SEB + c2o1*kxxMzzFromfcNEQ_SET - c2o1*kxxMzzFromfcNEQ_SWB + c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB + c2o1*kxzFromfcNEQ_NWT -
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB + c2o1*kxzFromfcNEQ_SWT -
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET - c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB + c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB + c2o1*kyzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT +
+      c8o1*vx3_NEB + c8o1*vx3_NET + c8o1*vx3_NWB + c8o1*vx3_NWT +
+      c8o1*vx3_SEB + c8o1*vx3_SET + c8o1*vx3_SWB + c8o1*vx3_SWT)/c64o1;
+   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    axx= (kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB + 2.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB + c2o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    bxx= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET - kxyFromfcNEQ_NWB - kxyFromfcNEQ_NWT +
       kxyFromfcNEQ_SEB + kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx1_NEB - 2.*vx1_NET + 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB + 2.*vx1_SET - 2.*vx1_SWB - 2.*vx1_SWT)/8.;
+      c2o1*vx1_NEB - c2o1*vx1_NET + c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB + c2o1*vx1_SET - c2o1*vx1_SWB - c2o1*vx1_SWT)/c8o1;
    cxx= (kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB - kxzFromfcNEQ_NWT +
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB - kxzFromfcNEQ_SWT +
-      2.*vx1_NEB - 2.*vx1_NET - 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB - 2.*vx1_SET - 2.*vx1_SWB + 2.*vx1_SWT)/8.;
-   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*vx1_NEB - c2o1*vx1_NET - c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB - c2o1*vx1_SET - c2o1*vx1_SWB + c2o1*vx1_SWT)/c8o1;
+   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    ayy= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET + kxyFromfcNEQ_NWB + kxyFromfcNEQ_NWT -
       kxyFromfcNEQ_SEB - kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB - 2.*vx2_SWT)/8.;
-   byy= (-2.*kxxMyyFromfcNEQ_NEB - 2.*kxxMyyFromfcNEQ_NET - 2.*kxxMyyFromfcNEQ_NWB - 2.*kxxMyyFromfcNEQ_NWT +
-      2.*kxxMyyFromfcNEQ_SEB + 2.*kxxMyyFromfcNEQ_SET + 2.*kxxMyyFromfcNEQ_SWB + 2.*kxxMyyFromfcNEQ_SWT +
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB - c2o1*vx2_SWT)/c8o1;
+   byy= (-c2o1*kxxMyyFromfcNEQ_NEB - c2o1*kxxMyyFromfcNEQ_NET - c2o1*kxxMyyFromfcNEQ_NWB - c2o1*kxxMyyFromfcNEQ_NWT +
+      c2o1*kxxMyyFromfcNEQ_SEB + c2o1*kxxMyyFromfcNEQ_SET + c2o1*kxxMyyFromfcNEQ_SWB + c2o1*kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    cyy= (kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET + kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB - kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB - kyzFromfcNEQ_SWT +
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB + 2.*vx2_SWT)/8.;
-   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/4.;
-   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/4.;
-   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/4.;
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB + c2o1*vx2_SWT)/c8o1;
+   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/c4o1;
+   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/c4o1;
+   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/c4o1;
    azz= (-kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB + kxzFromfcNEQ_NWT -
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB + kxzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    bzz= (-kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET - kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB + kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB + kyzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    czz= (-kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT -
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT +
-      2.*kxxMzzFromfcNEQ_NEB - 2.*kxxMzzFromfcNEQ_NET + 2.*kxxMzzFromfcNEQ_NWB - 2.*kxxMzzFromfcNEQ_NWT +
-      2.*kxxMzzFromfcNEQ_SEB - 2.*kxxMzzFromfcNEQ_SET + 2.*kxxMzzFromfcNEQ_SWB - 2.*kxxMzzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT)/16.;
-   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/2.;
-   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/2.;
-   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/2.;
-   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/2.;
-   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/2.;
+      c2o1*kxxMzzFromfcNEQ_NEB - c2o1*kxxMzzFromfcNEQ_NET + c2o1*kxxMzzFromfcNEQ_NWB - c2o1*kxxMzzFromfcNEQ_NWT +
+      c2o1*kxxMzzFromfcNEQ_SEB - c2o1*kxxMzzFromfcNEQ_SET + c2o1*kxxMzzFromfcNEQ_SWB - c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT)/c16o1;
+   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/c2o1;
+   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/c2o1;
+   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/c2o1;
+   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
+   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
    axyz=-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT + vx1_SEB - vx1_SET - vx1_SWB + vx1_SWT;
    bxyz=-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT + vx2_SEB - vx2_SET - vx2_SWB + vx2_SWT;
    cxyz=-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT + vx3_SEB - vx3_SET - vx3_SWB + vx3_SWT;
 
 
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-   kxyAverage       =0;//(kxyFromfcNEQ_SWB+
+   kxyAverage       = c0o1;//(kxyFromfcNEQ_SWB+
                        //kxyFromfcNEQ_SWT+
                        //kxyFromfcNEQ_SET+
                        //kxyFromfcNEQ_SEB+
@@ -289,7 +289,7 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
                        //kxyFromfcNEQ_NWT+
                        //kxyFromfcNEQ_NET+
                        //kxyFromfcNEQ_NEB)*c1o8-(ay+bx);
-   kyzAverage       =0;//(kyzFromfcNEQ_SWB+
+   kyzAverage       = c0o1;//(kyzFromfcNEQ_SWB+
                        //kyzFromfcNEQ_SWT+
                        //kyzFromfcNEQ_SET+
                        //kyzFromfcNEQ_SEB+
@@ -297,7 +297,7 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
                        //kyzFromfcNEQ_NWT+
                        //kyzFromfcNEQ_NET+
                        //kyzFromfcNEQ_NEB)*c1o8-(bz+cy);
-   kxzAverage       =0;//(kxzFromfcNEQ_SWB+
+   kxzAverage       = c0o1;//(kxzFromfcNEQ_SWB+
                        //kxzFromfcNEQ_SWT+
                        //kxzFromfcNEQ_SET+
                        //kxzFromfcNEQ_SEB+
@@ -305,7 +305,7 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
                        //kxzFromfcNEQ_NWT+
                        //kxzFromfcNEQ_NET+
                        //kxzFromfcNEQ_NEB)*c1o8-(az+cx);
-   kxxMyyAverage    =0;//(kxxMyyFromfcNEQ_SWB+
+   kxxMyyAverage    = c0o1;//(kxxMyyFromfcNEQ_SWB+
                        //kxxMyyFromfcNEQ_SWT+
                        //kxxMyyFromfcNEQ_SET+
                        //kxxMyyFromfcNEQ_SEB+
@@ -313,7 +313,7 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
                        //kxxMyyFromfcNEQ_NWT+
                        //kxxMyyFromfcNEQ_NET+
                        //kxxMyyFromfcNEQ_NEB)*c1o8-(ax-by);
-   kxxMzzAverage    =0;//(kxxMzzFromfcNEQ_SWB+
+   kxxMzzAverage    = c0o1;//(kxxMzzFromfcNEQ_SWB+
                        //kxxMzzFromfcNEQ_SWT+
                        //kxxMzzFromfcNEQ_SET+
                        //kxxMzzFromfcNEQ_SEB+
@@ -327,17 +327,17 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
    //
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    a0 = a0 + xoff * ax + yoff * ay + zoff * az + xoff_sq * axx + yoff_sq * ayy + zoff_sq * azz + xoff*yoff*axy + xoff*zoff*axz + yoff*zoff*ayz + xoff*yoff*zoff*axyz ;
-   ax = ax + 2. * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
-   ay = ay + 2. * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
-   az = az + 2. * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
+   ax = ax + c2o1 * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
+   ay = ay + c2o1 * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
+   az = az + c2o1 * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
    b0 = b0 + xoff * bx + yoff * by + zoff * bz + xoff_sq * bxx + yoff_sq * byy + zoff_sq * bzz + xoff*yoff*bxy + xoff*zoff*bxz + yoff*zoff*byz + xoff*yoff*zoff*bxyz;
-   bx = bx + 2. * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
-   by = by + 2. * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
-   bz = bz + 2. * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
+   bx = bx + c2o1 * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
+   by = by + c2o1 * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
+   bz = bz + c2o1 * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
    c0 = c0 + xoff * cx + yoff * cy + zoff * cz + xoff_sq * cxx + yoff_sq * cyy + zoff_sq * czz + xoff*yoff*cxy + xoff*zoff*cxz + yoff*zoff*cyz + xoff*yoff*zoff*cxyz;
-   cx = cx + 2. * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
-   cy = cy + 2. * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
-   cz = cz + 2. * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
+   cx = cx + c2o1 * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
+   cy = cy + c2o1 * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
+   cz = cz + c2o1 * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
    axy= axy + zoff*axyz;
    axz= axz + yoff*axyz;
    ayz= ayz + xoff*axyz;
@@ -351,110 +351,110 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const
 
    const real o = omega;
 
-   f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o));
-   f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o));
-   f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o));
-   f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o));
-   f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o));
-   f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o));
-   f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o));
-   f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o));
-   f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o));
-   f_ZERO = 0.;
-   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
-   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
-
-   x_E = 0.25*eps_new*((2*(-4*axx + bxy + cxz))/(27.*o));
-   x_N = 0.25*eps_new*((2*(2*axx - 2*bxy + cxz))/(27.*o));
-   x_T = 0.25*eps_new*((2*(2*axx + bxy - 2*cxz))/(27.*o));
-   x_NE = 0.25*eps_new*(-((2*axx + 3*axy + 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_SE = 0.25*eps_new*(-((2*axx - 3*axy - 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_TE = 0.25*eps_new*(-((2*axx + 3*axz - 2*bxy + 6*cxx + cxz))/(54.*o));
-   x_BE = 0.25*eps_new*(-((2*axx - 3*axz - 2*bxy - 6*cxx + cxz))/(54.*o));
-   x_TN = 0.25*eps_new*(-((-4*axx + bxy + 3*bxz + 3*cxy + cxz))/(54.*o));
-   x_BN = 0.25*eps_new*(-((-4*axx + bxy - 3*bxz - 3*cxy + cxz))/(54.*o));
+   f_E = eps_new*((c2o1*(-c2o1*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(c27o1*o));
+   f_N = eps_new*((c2o1*(ax - c2o1*by + cz+c2o1*kxxMyyAverage-kxxMzzAverage))/(c27o1*o));
+   f_T = eps_new*((c2o1*(ax + by - c2o1*cz-kxxMyyAverage+c2o1*kxxMzzAverage))/(c27o1*o));
+   f_NE = eps_new*(-(ax + c3o1*ay + c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage+c3o1*kxyAverage)/(c54o1*o));
+   f_SE = eps_new*(-(ax - c3o1*ay - c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage-c3o1*kxyAverage)/(c54o1*o));
+   f_TE = eps_new*(-(ax + c3o1*az - c2o1*by + c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage+c3o1*kxzAverage)/(c54o1*o));
+   f_BE = eps_new*(-(ax - c3o1*az - c2o1*by - c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage-c3o1*kxzAverage)/(c54o1*o));
+   f_TN = eps_new*(-(-c2o1*ax + by + c3o1*bz + c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage+c3o1*kyzAverage)/(c54o1*o));
+   f_BN = eps_new*(-(-c2o1*ax + by - c3o1*bz - c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage-c3o1*kyzAverage)/(c54o1*o));
+   f_ZERO = c0o1;
+   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(c72o1*o));
+   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(c72o1*o));
+
+   x_E = c1o4*eps_new*((c2o1*(-c4o1*axx + bxy + cxz))/(c27o1*o));
+   x_N = c1o4*eps_new*((c2o1*(c2o1*axx - c2o1*bxy + cxz))/(c27o1*o));
+   x_T = c1o4*eps_new*((c2o1*(c2o1*axx + bxy - c2o1*cxz))/(c27o1*o));
+   x_NE = c1o4*eps_new*(-((c2o1*axx + c3o1*axy + c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_SE = c1o4*eps_new*(-((c2o1*axx - c3o1*axy - c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_TE = c1o4*eps_new*(-((c2o1*axx + c3o1*axz - c2o1*bxy + c6o1*cxx + cxz))/(c54o1*o));
+   x_BE = c1o4*eps_new*(-((c2o1*axx - c3o1*axz - c2o1*bxy - c6o1*cxx + cxz))/(c54o1*o));
+   x_TN = c1o4*eps_new*(-((-c4o1*axx + bxy + c3o1*bxz + c3o1*cxy + cxz))/(c54o1*o));
+   x_BN = c1o4*eps_new*(-((-c4o1*axx + bxy - c3o1*bxz - c3o1*cxy + cxz))/(c54o1*o));
    x_ZERO = 0.;
-   x_TNE = 0.25*eps_new*(-((axy + axz + 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSW = 0.25*eps_new*(((-axy + axz - 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSE = 0.25*eps_new*(((axy - axz + 2*bxx + bxz - 2*cxx + cxy))/(72.*o));
-   x_TNW = 0.25*eps_new*(((axy + axz + 2*bxx - bxz + 2*cxx - cxy))/(72.*o));
-
-   y_E = 0.25*eps_new*(2*(-2*axy + 2*byy + cyz))/(27.*o);
-   y_N = 0.25*eps_new*(2*(axy - 4*byy + cyz))/(27.*o);
-   y_T = 0.25*eps_new*(2*(axy + 2*byy - 2*cyz))/(27.*o);
-   y_NE = 0.25*eps_new*(-((axy + 6*ayy + 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_SE = 0.25*eps_new*(-((axy - 6*ayy - 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_TE = 0.25*eps_new*(-((axy + 3*ayz - 4*byy + 3*cxy + cyz))/(54.*o));
-   y_BE = 0.25*eps_new*(-((axy - 3*ayz - 4*byy - 3*cxy + cyz))/(54.*o));
-   y_TN = 0.25*eps_new*(-((-2*axy + 2*byy + 3*byz + 6*cyy + cyz))/(54.*o));
-   y_BN = 0.25*eps_new*(-((-2*axy + 2*byy - 3*byz - 6*cyy + cyz))/(54.*o));
+   x_TNE = c1o4*eps_new*(-((axy + axz + c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSW = c1o4*eps_new*(((-axy + axz - c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSE = c1o4*eps_new*(((axy - axz + c2o1*bxx + bxz - c2o1*cxx + cxy))/(c72o1*o));
+   x_TNW = c1o4*eps_new*(((axy + axz + c2o1*bxx - bxz + c2o1*cxx - cxy))/(c72o1*o));
+
+   y_E = c1o4*eps_new*(c2o1*(-c2o1*axy + c2o1*byy + cyz))/(c27o1*o);
+   y_N = c1o4*eps_new*(c2o1*(axy - c4o1*byy + cyz))/(c27o1*o);
+   y_T = c1o4*eps_new*(c2o1*(axy + c2o1*byy - c2o1*cyz))/(c27o1*o);
+   y_NE = c1o4*eps_new*(-((axy + c6o1*ayy + c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_SE = c1o4*eps_new*(-((axy - c6o1*ayy - c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_TE = c1o4*eps_new*(-((axy + c3o1*ayz - c4o1*byy + c3o1*cxy + cyz))/(c54o1*o));
+   y_BE = c1o4*eps_new*(-((axy - c3o1*ayz - c4o1*byy - c3o1*cxy + cyz))/(c54o1*o));
+   y_TN = c1o4*eps_new*(-((-c2o1*axy + c2o1*byy + c3o1*byz + c6o1*cyy + cyz))/(c54o1*o));
+   y_BN = c1o4*eps_new*(-((-c2o1*axy + c2o1*byy - c3o1*byz - c6o1*cyy + cyz))/(c54o1*o));
    y_ZERO = 0.;
-   y_TNE = 0.25*eps_new*(-((2*ayy + ayz + bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSW = 0.25*eps_new*(((-2*ayy + ayz - bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSE = 0.25*eps_new*(((2*ayy - ayz + bxy + byz - cxy + 2*cyy))/(72.*o));
-   y_TNW = 0.25*eps_new*(((2*ayy + ayz + bxy - byz + cxy - 2*cyy))/(72.*o));
-
-   z_E = 0.25*eps_new*((2*(-2*axz + byz + 2*czz))/(27.*o));
-   z_N = 0.25*eps_new*((2*(axz - 2*byz + 2*czz))/(27.*o));
-   z_T = 0.25*eps_new*((2*(axz + byz - 4*czz))/(27.*o));
-   z_NE = 0.25*eps_new*(-((axz + 3*ayz + 3*bxz + byz - 4*czz))/(54.*o));
-   z_SE = 0.25*eps_new*(-((axz - 3*ayz - 3*bxz + byz - 4*czz))/(54.*o));
-   z_TE = 0.25*eps_new*(-((axz + 6*azz - 2*byz + 3*cxz + 2*czz))/(54.*o));
-   z_BE = 0.25*eps_new*(-((axz - 6*azz - 2*byz - 3*cxz + 2*czz))/(54.*o));
-   z_TN = 0.25*eps_new*(-((-2*axz + byz + 6*bzz + 3*cyz + 2*czz))/(54.*o));
-   z_BN = 0.25*eps_new*(-((-2*axz + byz - 6*bzz - 3*cyz + 2*czz))/(54.*o));
+   y_TNE = c1o4*eps_new*(-((c2o1*ayy + ayz + bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSW = c1o4*eps_new*(((-c2o1*ayy + ayz - bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSE = c1o4*eps_new*(((c2o1*ayy - ayz + bxy + byz - cxy + c2o1*cyy))/(c72o1*o));
+   y_TNW = c1o4*eps_new*(((c2o1*ayy + ayz + bxy - byz + cxy - c2o1*cyy))/(c72o1*o));
+
+   z_E = c1o4*eps_new*((c2o1*(-c2o1*axz + byz + c2o1*czz))/(c27o1*o));
+   z_N = c1o4*eps_new*((c2o1*(axz - c2o1*byz + c2o1*czz))/(c27o1*o));
+   z_T = c1o4*eps_new*((c2o1*(axz + byz - c4o1*czz))/(c27o1*o));
+   z_NE = c1o4*eps_new*(-((axz + c3o1*ayz + c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_SE = c1o4*eps_new*(-((axz - c3o1*ayz - c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_TE = c1o4*eps_new*(-((axz + c6o1*azz - c2o1*byz + c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_BE = c1o4*eps_new*(-((axz - c6o1*azz - c2o1*byz - c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_TN = c1o4*eps_new*(-((-c2o1*axz + byz + c6o1*bzz + c3o1*cyz + c2o1*czz))/(c54o1*o));
+   z_BN = c1o4*eps_new*(-((-c2o1*axz + byz - c6o1*bzz - c3o1*cyz + c2o1*czz))/(c54o1*o));
    z_ZERO = 0.;
-   z_TNE = 0.25*eps_new*(-((ayz + 2*azz + bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSW = 0.25*eps_new*(((-ayz + 2*azz - bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSE = 0.25*eps_new*(((ayz - 2*azz + bxz + 2*bzz - cxz + cyz))/(72.*o));
-   z_TNW = 0.25*eps_new*(((ayz + 2*azz + bxz - 2*bzz + cxz - cyz))/(72.*o));
-
-   xy_E   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_N   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_T   = -(0.0625*eps_new *((                       4.*cxyz)/(27.*o)));
-   xy_NE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_SE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_TE  = -(0.0625*eps_new *(( 3.*axyz            +     cxyz)/(54.*o)));
-   xy_BE  = -(0.0625*eps_new *((-3.*axyz            +     cxyz)/(54.*o)));
-   xy_TN  = -(0.0625*eps_new *((            3.*bxyz +     cxyz)/(54.*o)));
-   xy_BN  = -(0.0625*eps_new *((          - 3.*bxyz +     cxyz)/(54.*o)));
-   //xy_ZERO=   0.0625*eps_new;
-   xy_TNE = -(0.0625*eps_new *((     axyz +     bxyz           )/(72.*o)));
-   xy_TSW =   0.0625*eps_new *((     axyz +     bxyz           )/(72.*o));
-   xy_TSE =   0.0625*eps_new *((-    axyz +     bxyz           )/(72.*o));
-   xy_TNW =   0.0625*eps_new *((     axyz -     bxyz           )/(72.*o));
-
-   xz_E   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_N   = -(0.0625*eps_new *((            4.*bxyz           )/(27.*o)));
-   xz_T   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_NE  = -(0.0625*eps_new *(( 3.*axyz +     bxyz           )/(54.*o)));
-   xz_SE  = -(0.0625*eps_new *((-3.*axyz +     bxyz           )/(54.*o)));
-   xz_TE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_BE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_TN  = -(0.0625*eps_new *((                bxyz + 3.*cxyz)/(54.*o)));
-   xz_BN  = -(0.0625*eps_new *((                bxyz - 3.*cxyz)/(54.*o)));
-   //xz_ZERO=   0.0625*eps_new;
-   xz_TNE = -(0.0625*eps_new *((     axyz            +     cxyz)/(72.*o)));
-   xz_TSW =   0.0625*eps_new *((-    axyz            +     cxyz)/(72.*o));
-   xz_TSE =   0.0625*eps_new *((     axyz            +     cxyz)/(72.*o));
-   xz_TNW =   0.0625*eps_new *((     axyz            -     cxyz)/(72.*o));
-
-   yz_E   = -(0.0625*eps_new *(( 4.*axyz                      )/(27.*o)));
-   yz_N   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_T   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_NE  = -(0.0625*eps_new *((     axyz + 3.*bxyz           )/(54.*o)));
-   yz_SE  = -(0.0625*eps_new *((     axyz - 3.*bxyz           )/(54.*o)));
-   yz_TE  = -(0.0625*eps_new *((     axyz            + 3.*cxyz)/(54.*o)));
-   yz_BE  = -(0.0625*eps_new *((     axyz            - 3.*cxyz)/(54.*o)));
-   yz_TN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   yz_BN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   //yz_ZERO=   0.0625*eps_new;
-   yz_TNE = -(0.0625*eps_new *((                bxyz +     cxyz)/(72.*o)));
-   yz_TSW =   0.0625*eps_new *((          -     bxyz +     cxyz)/(72.*o));
-   yz_TSE =   0.0625*eps_new *((                bxyz -     cxyz)/(72.*o));
-   yz_TNW =   0.0625*eps_new *((                bxyz +     cxyz)/(72.*o));
+   z_TNE = c1o4*eps_new*(-((ayz + c2o1*azz + bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSW = c1o4*eps_new*(((-ayz + c2o1*azz - bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSE = c1o4*eps_new*(((ayz - c2o1*azz + bxz + c2o1*bzz - cxz + cyz))/(c72o1*o));
+   z_TNW = c1o4*eps_new*(((ayz + c2o1*azz + bxz - c2o1*bzz + cxz - cyz))/(c72o1*o));
+
+   xy_E   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_N   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_T   = -(c1o16*eps_new *((                       c4o1*cxyz)/(c27o1*o)));
+   xy_NE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_SE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_TE  = -(c1o16*eps_new *(( c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_BE  = -(c1o16*eps_new *((-c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_TN  = -(c1o16*eps_new *((            c3o1*bxyz +     cxyz)/(c54o1*o)));
+   xy_BN  = -(c1o16*eps_new *((          - c3o1*bxyz +     cxyz)/(c54o1*o)));
+   //xy_ZERO=   c1o16*eps_new;
+   xy_TNE = -(c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o)));
+   xy_TSW =   c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o));
+   xy_TSE =   c1o16*eps_new *((-    axyz +     bxyz           )/(c72o1*o));
+   xy_TNW =   c1o16*eps_new *((     axyz -     bxyz           )/(c72o1*o));
+
+   xz_E   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_N   = -(c1o16*eps_new *((            c4o1*bxyz           )/(c27o1*o)));
+   xz_T   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_NE  = -(c1o16*eps_new *(( c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_SE  = -(c1o16*eps_new *((-c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_TE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_BE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_TN  = -(c1o16*eps_new *((                bxyz + c3o1*cxyz)/(c54o1*o)));
+   xz_BN  = -(c1o16*eps_new *((                bxyz - c3o1*cxyz)/(c54o1*o)));
+   //xz_ZERO=   c1o16*eps_new;
+   xz_TNE = -(c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o)));
+   xz_TSW =   c1o16*eps_new *((-    axyz            +     cxyz)/(c72o1*o));
+   xz_TSE =   c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o));
+   xz_TNW =   c1o16*eps_new *((     axyz            -     cxyz)/(c72o1*o));
+
+   yz_E   = -(c1o16*eps_new *(( c4o1*axyz                      )/(c27o1*o)));
+   yz_N   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_T   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_NE  = -(c1o16*eps_new *((     axyz + c3o1*bxyz           )/(c54o1*o)));
+   yz_SE  = -(c1o16*eps_new *((     axyz - c3o1*bxyz           )/(c54o1*o)));
+   yz_TE  = -(c1o16*eps_new *((     axyz            + c3o1*cxyz)/(c54o1*o)));
+   yz_BE  = -(c1o16*eps_new *((     axyz            - c3o1*cxyz)/(c54o1*o)));
+   yz_TN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   yz_BN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   //yz_ZERO=   c1o16*eps_new;
+   yz_TNE = -(c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o)));
+   yz_TSW =   c1o16*eps_new *((          -     bxyz +     cxyz)/(c72o1*o));
+   yz_TSE =   c1o16*eps_new *((                bxyz -     cxyz)/(c72o1*o));
+   yz_TNW =   c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeCF(real* f, real  /*omega*/, real  /*x*/, real  /*y*/, real  /*z*/, real press, real xs, real ys, real zs)
@@ -463,9 +463,9 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeCF(real* f, r
    using namespace vf::lbm::dir;
 
    real rho  = press ;//+ (2.*axx*x+axy*y+axz*z+axyz*y*z+ax + 2.*byy*y+bxy*x+byz*z+bxyz*x*z+by + 2.*czz*z+cxz*x+cyz*y+cxyz*x*y+cz)/3.;
-   real vx1  = a0 + 0.25*( xs*ax + ys*ay + zs*az) + 0.0625*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + 0.015625*(xs*ys*zs*axyz);
-   real vx2  = b0 + 0.25*( xs*bx + ys*by + zs*bz) + 0.0625*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + 0.015625*(xs*ys*zs*bxyz);
-   real vx3  = c0 + 0.25*( xs*cx + ys*cy + zs*cz) + 0.0625*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + 0.015625*(xs*ys*zs*cxyz);
+   real vx1  = a0 + c1o4*( xs*ax + ys*ay + zs*az) + c1o16*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + c1o64*(xs*ys*zs*axyz);
+   real vx2  = b0 + c1o4*( xs*bx + ys*by + zs*bz) + c1o16*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + c1o64*(xs*ys*zs*bxyz);
+   real vx3  = c0 + c1o4*( xs*cx + ys*cy + zs*cz) + c1o16*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + c1o64*(xs*ys*zs*cxyz);
 
    //////////////////////////////////////////////////////////////////////////
    //DRAFT
@@ -504,108 +504,108 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeCF(real* f, r
    f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
-//Position SWB -0.25, -0.25, -0.25
+//Position SWB -c1o4, -c1o4, -c1o4
 real CompressibleOffsetInterpolationProcessor::calcPressBSW()
 {
-   return   press_SWT * (0.140625 + 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NET * (0.015625 - 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.421875 + 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+   return   press_SWT * (c9o64 + c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NET * (c1o64 - c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c27o64 + c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
-//Position SWT -0.25, -0.25, 0.25
+//Position SWT -c1o4, -c1o4, c1o4
 real CompressibleOffsetInterpolationProcessor::calcPressTSW()
 {
-   return   press_SWT * (0.421875 + 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.015625 - 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+   return   press_SWT * (c27o64 + c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c1o64 - c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SET 0.25, -0.25, 0.25
 real CompressibleOffsetInterpolationProcessor::calcPressTSE()
 {
-   return   press_SET * (0.421875 - 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.015625 + 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+   return   press_SET * (c27o64 - c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c1o64 + c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SEB 0.25, -0.25, -0.25
 real CompressibleOffsetInterpolationProcessor::calcPressBSE()
 {
-   return   press_SET * (0.140625 - 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.015625 + 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.421875 - 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+   return   press_SET * (c9o64 - c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c1o64 + c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c27o64 - c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWB -0.25, 0.25, -0.25
 real CompressibleOffsetInterpolationProcessor::calcPressBNW()
 {
-   return   press_NWT * (0.140625 + 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.015625 - 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.421875 + 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+   return   press_NWT * (c9o64 + c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c1o64 - c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c27o64 + c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWT -0.25, 0.25, 0.25
 real CompressibleOffsetInterpolationProcessor::calcPressTNW()
 {
-   return   press_NWT * (0.421875 + 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.015625 - 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+   return   press_NWT * (c27o64 + c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c1o64 - c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NET 0.25, 0.25, 0.25
 real CompressibleOffsetInterpolationProcessor::calcPressTNE()
 {
-   return   press_NET * (0.421875 - 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.015625 + 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+   return   press_NET * (c27o64 - c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c1o64 + c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NEB 0.25, 0.25, -0.25
 real CompressibleOffsetInterpolationProcessor::calcPressBNE()
 {
-   return   press_NET * (0.140625 - 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.015625 + 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.421875 - 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+   return   press_NET * (c9o64 - c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c1o64 + c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c27o64 - c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position C 0.0, 0.0, 0.0
@@ -614,14 +614,14 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(real* f, r
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
 
-   real press  =  press_NET * (0.125 - 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_NWT * (0.125 + 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_SET * (0.125 - 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_SWT * (0.125 + 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_NEB * (0.125 - 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_NWB * (0.125 + 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_SEB * (0.125 - 0.25 * xoff + 0.25 * yoff + 0.25 * zoff) +
-      press_SWB * (0.125 + 0.25 * xoff + 0.25 * yoff + 0.25 * zoff);
+   real press  =  press_NET * (c4o32 - c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_NWT * (c4o32 + c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_SET * (c4o32 - c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_SWT * (c4o32 + c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_NEB * (c4o32 - c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_NWB * (c4o32 + c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_SEB * (c4o32 - c1o4 * xoff + c1o4 * yoff + c1o4 * zoff) +
+      press_SWB * (c4o32 + c1o4 * xoff + c1o4 * yoff + c1o4 * zoff);
    real vx1  = a0;
    real vx2  = b0;
    real vx3  = c0;
@@ -636,7 +636,7 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(real* f, r
    real feq[ENDF+1];
    D3Q27System::calcCompFeq(feq,rho,vx1,vx2,vx3);
 
-   real eps_new = 2.;
+   real eps_new = c2o1;
    real o  = omega;
 //   LBMReal op = 1.;
 
@@ -655,20 +655,20 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(real* f, r
    //f_TSE  = - eps_new *((az + cx)/(36.*o)) - f_TNE;
    //f_TNW  = - eps_new *((bz + cy)/(36.*o)) - f_TNE;
 
-   f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o));
-   f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o));
-   f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o));
-   f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o));
-   f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o));
-   f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o));
-   f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o));
-   f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o));
-   f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o));
-   f_ZERO = 0.;
-   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
-   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
+   f_E = eps_new*((c2o1*(-c2o1*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(c27o1*o));
+   f_N = eps_new*((c2o1*(ax - c2o1*by + cz+c2o1*kxxMyyAverage-kxxMzzAverage))/(c27o1*o));
+   f_T = eps_new*((c2o1*(ax + by - c2o1*cz-kxxMyyAverage+c2o1*kxxMzzAverage))/(c27o1*o));
+   f_NE = eps_new*(-(ax + c3o1*ay + c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage+c3o1*kxyAverage)/(c54o1*o));
+   f_SE = eps_new*(-(ax - c3o1*ay - c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage-c3o1*kxyAverage)/(c54o1*o));
+   f_TE = eps_new*(-(ax + c3o1*az - c2o1*by + c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage+c3o1*kxzAverage)/(c54o1*o));
+   f_BE = eps_new*(-(ax - c3o1*az - c2o1*by - c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage-c3o1*kxzAverage)/(c54o1*o));
+   f_TN = eps_new*(-(-c2o1*ax + by + c3o1*bz + c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage+c3o1*kyzAverage)/(c54o1*o));
+   f_BN = eps_new*(-(-c2o1*ax + by - c3o1*bz - c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage-c3o1*kyzAverage)/(c54o1*o));
+   f_ZERO = c0o1;
+   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(c72o1*o));
+   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(c72o1*o));
 
    f[DIR_P00]    = f_E    + feq[DIR_P00];
    f[DIR_M00]    = f_E    + feq[DIR_M00];
@@ -708,10 +708,10 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedVelocity(real x,
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetInterpolationProcessor::calcInterpolatedShearStress(real x, real y, real z,real& tauxx, real& tauyy, real& tauzz,real& tauxy, real& tauxz, real& tauyz)
 {
-	tauxx=ax+2*axx*x+axy*y+axz*z+axyz*y*z;
-	tauyy=by+2*byy*y+bxy*x+byz*z+bxyz*x*z;
-	tauzz=cz+2*czz*z+cxz*x+cyz*y+cxyz*x*y;
-	tauxy=0.5*((ay+2.0*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+2.0*bxx*x+bxy*y+bxz*z+bxyz*y*z));
-	tauxz=0.5*((az+2.0*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+2.0*cxx*x+cxy*y+cxz*z+cxyz*y*z));
-	tauyz=0.5*((bz+2.0*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+2.0*cyy*y+cxy*x+cyz*z+cxyz*x*z));
+	tauxx=ax+c2o1*axx*x+axy*y+axz*z+axyz*y*z;
+	tauyy=by+c2o1*byy*y+bxy*x+byz*z+bxyz*x*z;
+	tauzz=cz+c2o1*czz*z+cxz*x+cyz*y+cxyz*x*y;
+	tauxy=c1o2*((ay+c2o1*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+c2o1*bxx*x+bxy*y+bxz*z+bxyz*y*z));
+	tauxz=c1o2*((az+c2o1*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+c2o1*cxx*x+cxy*y+cxz*z+cxyz*y*z));
+	tauyz=c1o2*((bz+c2o1*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+c2o1*cyy*y+cxy*x+cyz*z+cxyz*x*z));
 }
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp
index 7321e7f7bfca2080b9c52f89c5c9354b219c1a94..f3511fd7a48a7e58ddefb397e681f182b121c499 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp
@@ -7,8 +7,8 @@ using namespace vf::lbm::constant;
 CompressibleOffsetMomentsInterpolationProcessor::CompressibleOffsetMomentsInterpolationProcessor()
     
 {
-   this->bulkViscosity = 0.0;
-   this->shearViscosity = 0.0;
+   this->bulkViscosity = c0o1;
+   this->shearViscosity = c0o1;
    this->OxxPyyPzzC = c1o1;
    this->OxxPyyPzzF = c1o1;
 }
@@ -16,8 +16,8 @@ CompressibleOffsetMomentsInterpolationProcessor::CompressibleOffsetMomentsInterp
 CompressibleOffsetMomentsInterpolationProcessor::CompressibleOffsetMomentsInterpolationProcessor(real omegaC, real omegaF)
    : omegaC(omegaC), omegaF(omegaF)
 {
-   this->bulkViscosity = 0.0;
-   this->shearViscosity = 0.0;
+   this->bulkViscosity = c0o1;
+   this->shearViscosity = c0o1;
    this->OxxPyyPzzC = c1o1;
    this->OxxPyyPzzF = c1o1;
 }
@@ -40,8 +40,8 @@ void CompressibleOffsetMomentsInterpolationProcessor::setOmegas( real omegaC, re
    this->omegaC = omegaC;
    this->omegaF = omegaF;
 
-   real dtC = (3.0*shearViscosity)/((1/omegaC)-0.5);
-   real dtF = (3.0*shearViscosity)/((1/omegaF)-0.5);
+   real dtC = (c3o1 *shearViscosity)/((c1o1/omegaC)-c1o2);
+   real dtF = (c3o1 *shearViscosity)/((c1o1/omegaF)-c1o2);
 
    if (bulkViscosity != 0)
    {
@@ -68,21 +68,21 @@ void CompressibleOffsetMomentsInterpolationProcessor::setOffsets(real xoff, real
 void CompressibleOffsetMomentsInterpolationProcessor::interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellC, omegaC, 0.5);
-   calcInterpolatedNodeCF(icellF.BSW, omegaF, -0.25, -0.25, -0.25, calcPressBSW(), -1, -1, -1);
-   calcInterpolatedNodeCF(icellF.BNE, omegaF,  0.25,  0.25, -0.25, calcPressBNE(),  1,  1, -1);
-   calcInterpolatedNodeCF(icellF.TNW, omegaF, -0.25,  0.25,  0.25, calcPressTNW(), -1,  1,  1);
-   calcInterpolatedNodeCF(icellF.TSE, omegaF,  0.25, -0.25,  0.25, calcPressTSE(),  1, -1,  1);
-   calcInterpolatedNodeCF(icellF.BNW, omegaF, -0.25,  0.25, -0.25, calcPressBNW(), -1,  1, -1);
-   calcInterpolatedNodeCF(icellF.BSE, omegaF,  0.25, -0.25, -0.25, calcPressBSE(),  1, -1, -1);
-   calcInterpolatedNodeCF(icellF.TSW, omegaF, -0.25, -0.25,  0.25, calcPressTSW(), -1, -1,  1);
-   calcInterpolatedNodeCF(icellF.TNE, omegaF,  0.25,  0.25,  0.25, calcPressTNE(),  1,  1,  1);
+   calcInterpolatedCoefficiets(icellC, omegaC, c1o2);
+   calcInterpolatedNodeCF(icellF.BSW, omegaF, -c1o4, -c1o4, -c1o4, calcPressBSW(), -c1o1, -c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.BNE, omegaF,  c1o4,  c1o4, -c1o4, calcPressBNE(),  c1o1,  c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.TNW, omegaF, -c1o4,  c1o4,  c1o4, calcPressTNW(), -c1o1,  c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.TSE, omegaF,  c1o4, -c1o4,  c1o4, calcPressTSE(),  c1o1, -c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.BNW, omegaF, -c1o4,  c1o4, -c1o4, calcPressBNW(), -c1o1,  c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.BSE, omegaF,  c1o4, -c1o4, -c1o4, calcPressBSE(),  c1o1, -c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.TSW, omegaF, -c1o4, -c1o4,  c1o4, calcPressTSW(), -c1o1, -c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.TNE, omegaF,  c1o4,  c1o4,  c1o4, calcPressTNE(),  c1o1,  c1o1,  c1o1);
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::interpolateFineToCoarse(D3Q27ICell& icellF, real* icellC, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellF, omegaF, 2.0);
+   calcInterpolatedCoefficiets(icellF, omegaF, c2o1);
    calcInterpolatedNodeFC(icellC, omegaC);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -92,16 +92,16 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcMoments(const real* co
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
 
-   real drho = 0.0;
+   real drho = c0o1;
    D3Q27System::calcCompMacroscopicValues(f,drho,vx1,vx2,vx3);
    
    press = drho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(c1o1 + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(c1o1 + drho)-(vx2*vx3));
-   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(c1o1 + drho)-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(c1o1 + drho)-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(c1o1 + drho)-(vx1*vx1-vx3*vx3));
+   kxy   = -c3o1*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(c1o1 + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -c3o1*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(c1o1 + drho)-(vx2*vx3));
+   kxz   = -c3o1*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(c1o1 + drho)-(vx1*vx3));
+   kxxMyy = -c3o1/c2o1*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(c1o1 + drho)-(vx1*vx1-vx2*vx2));
+   kxxMzz = -c3o1/c2o1*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(c1o1 + drho)-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, real omega, real eps_new)
@@ -200,116 +200,116 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET - 2.*kxyFromfcNEQ_NWB - 2.*kxyFromfcNEQ_NWT +
-      2.*kxyFromfcNEQ_SEB + 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB - 2.*kxzFromfcNEQ_NWT +
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB - 2.*kxzFromfcNEQ_SWT +
-      8.*vx1_NEB + 8.*vx1_NET + 8.*vx1_NWB + 8.*vx1_NWT + 8.*vx1_SEB +
-      8.*vx1_SET + 8.*vx1_SWB + 8.*vx1_SWT + 2.*vx2_NEB + 2.*vx2_NET -
-      2.*vx2_NWB - 2.*vx2_NWT - 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB +
-      2.*vx2_SWT - 2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
-   b0 = (2.*kxxMyyFromfcNEQ_NEB + 2.*kxxMyyFromfcNEQ_NET + 2.*kxxMyyFromfcNEQ_NWB + 2.*kxxMyyFromfcNEQ_NWT -
-      2.*kxxMyyFromfcNEQ_SEB - 2.*kxxMyyFromfcNEQ_SET - 2.*kxxMyyFromfcNEQ_SWB - 2.*kxxMyyFromfcNEQ_SWT -
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET - c2o1*kxyFromfcNEQ_NWB - c2o1*kxyFromfcNEQ_NWT +
+      c2o1*kxyFromfcNEQ_SEB + c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB - c2o1*kxzFromfcNEQ_NWT +
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB - c2o1*kxzFromfcNEQ_SWT +
+      c8o1*vx1_NEB + c8o1*vx1_NET + c8o1*vx1_NWB + c8o1*vx1_NWT + c8o1*vx1_SEB +
+      c8o1*vx1_SET + c8o1*vx1_SWB + c8o1*vx1_SWT + c2o1*vx2_NEB + c2o1*vx2_NET -
+      c2o1*vx2_NWB - c2o1*vx2_NWT - c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB +
+      c2o1*vx2_SWT - c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
+   b0 = (c2o1*kxxMyyFromfcNEQ_NEB + c2o1*kxxMyyFromfcNEQ_NET + c2o1*kxxMyyFromfcNEQ_NWB + c2o1*kxxMyyFromfcNEQ_NWT -
+      c2o1*kxxMyyFromfcNEQ_SEB - c2o1*kxxMyyFromfcNEQ_SET - c2o1*kxxMyyFromfcNEQ_SWB - c2o1*kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET + 2.*kxyFromfcNEQ_NWB + 2.*kxyFromfcNEQ_NWT -
-      2.*kxyFromfcNEQ_SEB - 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET + 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB - 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB - 2.*kyzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT +
-      8.*vx2_NEB + 8.*vx2_NET + 8.*vx2_NWB + 8.*vx2_NWT +
-      8.*vx2_SEB + 8.*vx2_SET + 8.*vx2_SWB + 8.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET + c2o1*kxyFromfcNEQ_NWB + c2o1*kxyFromfcNEQ_NWT -
+      c2o1*kxyFromfcNEQ_SEB - c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET + c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB - c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB - c2o1*kyzFromfcNEQ_SWT +
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT +
+      c8o1*vx2_NEB + c8o1*vx2_NET + c8o1*vx2_NWB + c8o1*vx2_NWT +
+      c8o1*vx2_SEB + c8o1*vx2_SET + c8o1*vx2_SWB + c8o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
    c0 = (kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT -
-      2.*kxxMzzFromfcNEQ_NEB + 2.*kxxMzzFromfcNEQ_NET - 2.*kxxMzzFromfcNEQ_NWB + 2.*kxxMzzFromfcNEQ_NWT -
-      2.*kxxMzzFromfcNEQ_SEB + 2.*kxxMzzFromfcNEQ_SET - 2.*kxxMzzFromfcNEQ_SWB + 2.*kxxMzzFromfcNEQ_SWT -
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB + 2.*kxzFromfcNEQ_NWT -
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB + 2.*kxzFromfcNEQ_SWT -
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET - 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB + 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB + 2.*kyzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT +
-      8.*vx3_NEB + 8.*vx3_NET + 8.*vx3_NWB + 8.*vx3_NWT +
-      8.*vx3_SEB + 8.*vx3_SET + 8.*vx3_SWB + 8.*vx3_SWT)/64.;
-   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*kxxMzzFromfcNEQ_NEB + c2o1*kxxMzzFromfcNEQ_NET - c2o1*kxxMzzFromfcNEQ_NWB + c2o1*kxxMzzFromfcNEQ_NWT -
+      c2o1*kxxMzzFromfcNEQ_SEB + c2o1*kxxMzzFromfcNEQ_SET - c2o1*kxxMzzFromfcNEQ_SWB + c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB + c2o1*kxzFromfcNEQ_NWT -
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB + c2o1*kxzFromfcNEQ_SWT -
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET - c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB + c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB + c2o1*kyzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT +
+      c8o1*vx3_NEB + c8o1*vx3_NET + c8o1*vx3_NWB + c8o1*vx3_NWT +
+      c8o1*vx3_SEB + c8o1*vx3_SET + c8o1*vx3_SWB + c8o1*vx3_SWT)/c64o1;
+   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    axx= (kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB + 2.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB + c2o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    bxx= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET - kxyFromfcNEQ_NWB - kxyFromfcNEQ_NWT +
       kxyFromfcNEQ_SEB + kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx1_NEB - 2.*vx1_NET + 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB + 2.*vx1_SET - 2.*vx1_SWB - 2.*vx1_SWT)/8.;
+      c2o1*vx1_NEB - c2o1*vx1_NET + c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB + c2o1*vx1_SET - c2o1*vx1_SWB - c2o1*vx1_SWT)/c8o1;
    cxx= (kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB - kxzFromfcNEQ_NWT +
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB - kxzFromfcNEQ_SWT +
-      2.*vx1_NEB - 2.*vx1_NET - 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB - 2.*vx1_SET - 2.*vx1_SWB + 2.*vx1_SWT)/8.;
-   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*vx1_NEB - c2o1*vx1_NET - c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB - c2o1*vx1_SET - c2o1*vx1_SWB + c2o1*vx1_SWT)/c8o1;
+   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    ayy= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET + kxyFromfcNEQ_NWB + kxyFromfcNEQ_NWT -
       kxyFromfcNEQ_SEB - kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB - 2.*vx2_SWT)/8.;
-   byy= (-2.*kxxMyyFromfcNEQ_NEB - 2.*kxxMyyFromfcNEQ_NET - 2.*kxxMyyFromfcNEQ_NWB - 2.*kxxMyyFromfcNEQ_NWT +
-      2.*kxxMyyFromfcNEQ_SEB + 2.*kxxMyyFromfcNEQ_SET + 2.*kxxMyyFromfcNEQ_SWB + 2.*kxxMyyFromfcNEQ_SWT +
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB - c2o1*vx2_SWT)/c8o1;
+   byy= (-c2o1*kxxMyyFromfcNEQ_NEB - c2o1*kxxMyyFromfcNEQ_NET - c2o1*kxxMyyFromfcNEQ_NWB - c2o1*kxxMyyFromfcNEQ_NWT +
+      c2o1*kxxMyyFromfcNEQ_SEB + c2o1*kxxMyyFromfcNEQ_SET + c2o1*kxxMyyFromfcNEQ_SWB + c2o1*kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    cyy= (kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET + kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB - kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB - kyzFromfcNEQ_SWT +
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB + 2.*vx2_SWT)/8.;
-   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/4.;
-   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/4.;
-   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/4.;
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB + c2o1*vx2_SWT)/c8o1;
+   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/c4o1;
+   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/c4o1;
+   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/c4o1;
    azz= (-kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB + kxzFromfcNEQ_NWT -
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB + kxzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    bzz= (-kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET - kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB + kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB + kyzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    czz= (-kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT -
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT +
-      2.*kxxMzzFromfcNEQ_NEB - 2.*kxxMzzFromfcNEQ_NET + 2.*kxxMzzFromfcNEQ_NWB - 2.*kxxMzzFromfcNEQ_NWT +
-      2.*kxxMzzFromfcNEQ_SEB - 2.*kxxMzzFromfcNEQ_SET + 2.*kxxMzzFromfcNEQ_SWB - 2.*kxxMzzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT)/16.;
-   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/2.;
-   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/2.;
-   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/2.;
-   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/2.;
-   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/2.;
+      c2o1*kxxMzzFromfcNEQ_NEB - c2o1*kxxMzzFromfcNEQ_NET + c2o1*kxxMzzFromfcNEQ_NWB - c2o1*kxxMzzFromfcNEQ_NWT +
+      c2o1*kxxMzzFromfcNEQ_SEB - c2o1*kxxMzzFromfcNEQ_SET + c2o1*kxxMzzFromfcNEQ_SWB - c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT)/c16o1;
+   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/c2o1;
+   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/c2o1;
+   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/c2o1;
+   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
+   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
    axyz=-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT + vx1_SEB - vx1_SET - vx1_SWB + vx1_SWT;
    bxyz=-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT + vx2_SEB - vx2_SET - vx2_SWB + vx2_SWT;
    cxyz=-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT + vx3_SEB - vx3_SET - vx3_SWB + vx3_SWT;
 
 
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-   kxyAverage       =0;//(kxyFromfcNEQ_SWB+
+   kxyAverage       = c0o1;//(kxyFromfcNEQ_SWB+
                        //kxyFromfcNEQ_SWT+
                        //kxyFromfcNEQ_SET+
                        //kxyFromfcNEQ_SEB+
@@ -317,7 +317,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
                        //kxyFromfcNEQ_NWT+
                        //kxyFromfcNEQ_NET+
                        //kxyFromfcNEQ_NEB)*c1o8-(ay+bx);
-   kyzAverage       =0;//(kyzFromfcNEQ_SWB+
+   kyzAverage       = c0o1;//(kyzFromfcNEQ_SWB+
                        //kyzFromfcNEQ_SWT+
                        //kyzFromfcNEQ_SET+
                        //kyzFromfcNEQ_SEB+
@@ -325,7 +325,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
                        //kyzFromfcNEQ_NWT+
                        //kyzFromfcNEQ_NET+
                        //kyzFromfcNEQ_NEB)*c1o8-(bz+cy);
-   kxzAverage       =0;//(kxzFromfcNEQ_SWB+
+   kxzAverage       = c0o1;//(kxzFromfcNEQ_SWB+
                        //kxzFromfcNEQ_SWT+
                        //kxzFromfcNEQ_SET+
                        //kxzFromfcNEQ_SEB+
@@ -333,7 +333,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
                        //kxzFromfcNEQ_NWT+
                        //kxzFromfcNEQ_NET+
                        //kxzFromfcNEQ_NEB)*c1o8-(az+cx);
-   kxxMyyAverage    =0;//(kxxMyyFromfcNEQ_SWB+
+   kxxMyyAverage    = c0o1;//(kxxMyyFromfcNEQ_SWB+
                        //kxxMyyFromfcNEQ_SWT+
                        //kxxMyyFromfcNEQ_SET+
                        //kxxMyyFromfcNEQ_SEB+
@@ -341,7 +341,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
                        //kxxMyyFromfcNEQ_NWT+
                        //kxxMyyFromfcNEQ_NET+
                        //kxxMyyFromfcNEQ_NEB)*c1o8-(ax-by);
-   kxxMzzAverage    =0;//(kxxMzzFromfcNEQ_SWB+
+   kxxMzzAverage    = c0o1;//(kxxMzzFromfcNEQ_SWB+
                        //kxxMzzFromfcNEQ_SWT+
                        //kxxMzzFromfcNEQ_SET+
                        //kxxMzzFromfcNEQ_SEB+
@@ -355,17 +355,17 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
    //
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    a0 = a0 + xoff * ax + yoff * ay + zoff * az + xoff_sq * axx + yoff_sq * ayy + zoff_sq * azz + xoff*yoff*axy + xoff*zoff*axz + yoff*zoff*ayz + xoff*yoff*zoff*axyz ;
-   ax = ax + 2. * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
-   ay = ay + 2. * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
-   az = az + 2. * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
+   ax = ax + c2o1 * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
+   ay = ay + c2o1 * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
+   az = az + c2o1 * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
    b0 = b0 + xoff * bx + yoff * by + zoff * bz + xoff_sq * bxx + yoff_sq * byy + zoff_sq * bzz + xoff*yoff*bxy + xoff*zoff*bxz + yoff*zoff*byz + xoff*yoff*zoff*bxyz;
-   bx = bx + 2. * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
-   by = by + 2. * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
-   bz = bz + 2. * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
+   bx = bx + c2o1 * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
+   by = by + c2o1 * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
+   bz = bz + c2o1 * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
    c0 = c0 + xoff * cx + yoff * cy + zoff * cz + xoff_sq * cxx + yoff_sq * cyy + zoff_sq * czz + xoff*yoff*cxy + xoff*zoff*cxz + yoff*zoff*cyz + xoff*yoff*zoff*cxyz;
-   cx = cx + 2. * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
-   cy = cy + 2. * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
-   cz = cz + 2. * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
+   cx = cx + c2o1 * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
+   cy = cy + c2o1 * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
+   cz = cz + c2o1 * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
    axy= axy + zoff*axyz;
    axz= axz + yoff*axyz;
    ayz= ayz + xoff*axyz;
@@ -379,110 +379,110 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiet
 
    const real o = omega;
 
-   f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o));
-   f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o));
-   f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o));
-   f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o));
-   f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o));
-   f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o));
-   f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o));
-   f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o));
-   f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o));
+   f_E = eps_new*((c2o1*(-c2o1*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(c27o1*o));
+   f_N = eps_new*((c2o1*(ax - c2o1*by + cz+c2o1*kxxMyyAverage-kxxMzzAverage))/(c27o1*o));
+   f_T = eps_new*((c2o1*(ax + by - c2o1*cz-kxxMyyAverage+c2o1*kxxMzzAverage))/(c27o1*o));
+   f_NE = eps_new*(-(ax + c3o1*ay + c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage+c3o1*kxyAverage)/(c54o1*o));
+   f_SE = eps_new*(-(ax - c3o1*ay - c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage-c3o1*kxyAverage)/(c54o1*o));
+   f_TE = eps_new*(-(ax + c3o1*az - c2o1*by + c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage+c3o1*kxzAverage)/(c54o1*o));
+   f_BE = eps_new*(-(ax - c3o1*az - c2o1*by - c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage-c3o1*kxzAverage)/(c54o1*o));
+   f_TN = eps_new*(-(-c2o1*ax + by + c3o1*bz + c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage+c3o1*kyzAverage)/(c54o1*o));
+   f_BN = eps_new*(-(-c2o1*ax + by - c3o1*bz - c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage-c3o1*kyzAverage)/(c54o1*o));
    f_ZERO = 0.;
-   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
-   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
-
-   x_E = 0.25*eps_new*((2*(-4*axx + bxy + cxz))/(27.*o));
-   x_N = 0.25*eps_new*((2*(2*axx - 2*bxy + cxz))/(27.*o));
-   x_T = 0.25*eps_new*((2*(2*axx + bxy - 2*cxz))/(27.*o));
-   x_NE = 0.25*eps_new*(-((2*axx + 3*axy + 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_SE = 0.25*eps_new*(-((2*axx - 3*axy - 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_TE = 0.25*eps_new*(-((2*axx + 3*axz - 2*bxy + 6*cxx + cxz))/(54.*o));
-   x_BE = 0.25*eps_new*(-((2*axx - 3*axz - 2*bxy - 6*cxx + cxz))/(54.*o));
-   x_TN = 0.25*eps_new*(-((-4*axx + bxy + 3*bxz + 3*cxy + cxz))/(54.*o));
-   x_BN = 0.25*eps_new*(-((-4*axx + bxy - 3*bxz - 3*cxy + cxz))/(54.*o));
-   x_ZERO = 0.;
-   x_TNE = 0.25*eps_new*(-((axy + axz + 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSW = 0.25*eps_new*(((-axy + axz - 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSE = 0.25*eps_new*(((axy - axz + 2*bxx + bxz - 2*cxx + cxy))/(72.*o));
-   x_TNW = 0.25*eps_new*(((axy + axz + 2*bxx - bxz + 2*cxx - cxy))/(72.*o));
-
-   y_E = 0.25*eps_new*(2*(-2*axy + 2*byy + cyz))/(27.*o);
-   y_N = 0.25*eps_new*(2*(axy - 4*byy + cyz))/(27.*o);
-   y_T = 0.25*eps_new*(2*(axy + 2*byy - 2*cyz))/(27.*o);
-   y_NE = 0.25*eps_new*(-((axy + 6*ayy + 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_SE = 0.25*eps_new*(-((axy - 6*ayy - 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_TE = 0.25*eps_new*(-((axy + 3*ayz - 4*byy + 3*cxy + cyz))/(54.*o));
-   y_BE = 0.25*eps_new*(-((axy - 3*ayz - 4*byy - 3*cxy + cyz))/(54.*o));
-   y_TN = 0.25*eps_new*(-((-2*axy + 2*byy + 3*byz + 6*cyy + cyz))/(54.*o));
-   y_BN = 0.25*eps_new*(-((-2*axy + 2*byy - 3*byz - 6*cyy + cyz))/(54.*o));
-   y_ZERO = 0.;
-   y_TNE = 0.25*eps_new*(-((2*ayy + ayz + bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSW = 0.25*eps_new*(((-2*ayy + ayz - bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSE = 0.25*eps_new*(((2*ayy - ayz + bxy + byz - cxy + 2*cyy))/(72.*o));
-   y_TNW = 0.25*eps_new*(((2*ayy + ayz + bxy - byz + cxy - 2*cyy))/(72.*o));
-
-   z_E = 0.25*eps_new*((2*(-2*axz + byz + 2*czz))/(27.*o));
-   z_N = 0.25*eps_new*((2*(axz - 2*byz + 2*czz))/(27.*o));
-   z_T = 0.25*eps_new*((2*(axz + byz - 4*czz))/(27.*o));
-   z_NE = 0.25*eps_new*(-((axz + 3*ayz + 3*bxz + byz - 4*czz))/(54.*o));
-   z_SE = 0.25*eps_new*(-((axz - 3*ayz - 3*bxz + byz - 4*czz))/(54.*o));
-   z_TE = 0.25*eps_new*(-((axz + 6*azz - 2*byz + 3*cxz + 2*czz))/(54.*o));
-   z_BE = 0.25*eps_new*(-((axz - 6*azz - 2*byz - 3*cxz + 2*czz))/(54.*o));
-   z_TN = 0.25*eps_new*(-((-2*axz + byz + 6*bzz + 3*cyz + 2*czz))/(54.*o));
-   z_BN = 0.25*eps_new*(-((-2*axz + byz - 6*bzz - 3*cyz + 2*czz))/(54.*o));
-   z_ZERO = 0.;
-   z_TNE = 0.25*eps_new*(-((ayz + 2*azz + bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSW = 0.25*eps_new*(((-ayz + 2*azz - bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSE = 0.25*eps_new*(((ayz - 2*azz + bxz + 2*bzz - cxz + cyz))/(72.*o));
-   z_TNW = 0.25*eps_new*(((ayz + 2*azz + bxz - 2*bzz + cxz - cyz))/(72.*o));
-
-   xy_E   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_N   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_T   = -(0.0625*eps_new *((                       4.*cxyz)/(27.*o)));
-   xy_NE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_SE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_TE  = -(0.0625*eps_new *(( 3.*axyz            +     cxyz)/(54.*o)));
-   xy_BE  = -(0.0625*eps_new *((-3.*axyz            +     cxyz)/(54.*o)));
-   xy_TN  = -(0.0625*eps_new *((            3.*bxyz +     cxyz)/(54.*o)));
-   xy_BN  = -(0.0625*eps_new *((          - 3.*bxyz +     cxyz)/(54.*o)));
-   //xy_ZERO=   0.0625*eps_new;
-   xy_TNE = -(0.0625*eps_new *((     axyz +     bxyz           )/(72.*o)));
-   xy_TSW =   0.0625*eps_new *((     axyz +     bxyz           )/(72.*o));
-   xy_TSE =   0.0625*eps_new *((-    axyz +     bxyz           )/(72.*o));
-   xy_TNW =   0.0625*eps_new *((     axyz -     bxyz           )/(72.*o));
-
-   xz_E   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_N   = -(0.0625*eps_new *((            4.*bxyz           )/(27.*o)));
-   xz_T   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_NE  = -(0.0625*eps_new *(( 3.*axyz +     bxyz           )/(54.*o)));
-   xz_SE  = -(0.0625*eps_new *((-3.*axyz +     bxyz           )/(54.*o)));
-   xz_TE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_BE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_TN  = -(0.0625*eps_new *((                bxyz + 3.*cxyz)/(54.*o)));
-   xz_BN  = -(0.0625*eps_new *((                bxyz - 3.*cxyz)/(54.*o)));
-   //xz_ZERO=   0.0625*eps_new;
-   xz_TNE = -(0.0625*eps_new *((     axyz            +     cxyz)/(72.*o)));
-   xz_TSW =   0.0625*eps_new *((-    axyz            +     cxyz)/(72.*o));
-   xz_TSE =   0.0625*eps_new *((     axyz            +     cxyz)/(72.*o));
-   xz_TNW =   0.0625*eps_new *((     axyz            -     cxyz)/(72.*o));
-
-   yz_E   = -(0.0625*eps_new *(( 4.*axyz                      )/(27.*o)));
-   yz_N   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_T   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_NE  = -(0.0625*eps_new *((     axyz + 3.*bxyz           )/(54.*o)));
-   yz_SE  = -(0.0625*eps_new *((     axyz - 3.*bxyz           )/(54.*o)));
-   yz_TE  = -(0.0625*eps_new *((     axyz            + 3.*cxyz)/(54.*o)));
-   yz_BE  = -(0.0625*eps_new *((     axyz            - 3.*cxyz)/(54.*o)));
-   yz_TN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   yz_BN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   //yz_ZERO=   0.0625*eps_new;
-   yz_TNE = -(0.0625*eps_new *((                bxyz +     cxyz)/(72.*o)));
-   yz_TSW =   0.0625*eps_new *((          -     bxyz +     cxyz)/(72.*o));
-   yz_TSE =   0.0625*eps_new *((                bxyz -     cxyz)/(72.*o));
-   yz_TNW =   0.0625*eps_new *((                bxyz +     cxyz)/(72.*o));
+   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(c72o1*o));
+   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(c72o1*o));
+
+   x_E = c1o4*eps_new*((c2o1*(-c4o1*axx + bxy + cxz))/(c27o1*o));
+   x_N = c1o4*eps_new*((c2o1*(c2o1*axx - c2o1*bxy + cxz))/(c27o1*o));
+   x_T = c1o4*eps_new*((c2o1*(c2o1*axx + bxy - c2o1*cxz))/(c27o1*o));
+   x_NE = c1o4*eps_new*(-((c2o1*axx + c3o1*axy + c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_SE = c1o4*eps_new*(-((c2o1*axx - c3o1*axy - c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_TE = c1o4*eps_new*(-((c2o1*axx + c3o1*axz - c2o1*bxy + c6o1*cxx + cxz))/(c54o1*o));
+   x_BE = c1o4*eps_new*(-((c2o1*axx - c3o1*axz - c2o1*bxy - c6o1*cxx + cxz))/(c54o1*o));
+   x_TN = c1o4*eps_new*(-((-c4o1*axx + bxy + c3o1*bxz + c3o1*cxy + cxz))/(c54o1*o));
+   x_BN = c1o4*eps_new*(-((-c4o1*axx + bxy - c3o1*bxz - c3o1*cxy + cxz))/(c54o1*o));
+   x_ZERO = c0o1;
+   x_TNE = c1o4*eps_new*(-((axy + axz + c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSW = c1o4*eps_new*(((-axy + axz - c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSE = c1o4*eps_new*(((axy - axz + c2o1*bxx + bxz - c2o1*cxx + cxy))/(c72o1*o));
+   x_TNW = c1o4*eps_new*(((axy + axz + c2o1*bxx - bxz + c2o1*cxx - cxy))/(c72o1*o));
+
+   y_E = c1o4*eps_new*(c2o1*(-c2o1*axy + c2o1*byy + cyz))/(c27o1*o);
+   y_N = c1o4*eps_new*(c2o1*(axy - c4o1*byy + cyz))/(c27o1*o);
+   y_T = c1o4*eps_new*(c2o1*(axy + c2o1*byy - c2o1*cyz))/(c27o1*o);
+   y_NE = c1o4*eps_new*(-((axy + c6o1*ayy + c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_SE = c1o4*eps_new*(-((axy - c6o1*ayy - c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_TE = c1o4*eps_new*(-((axy + c3o1*ayz - c4o1*byy + c3o1*cxy + cyz))/(c54o1*o));
+   y_BE = c1o4*eps_new*(-((axy - c3o1*ayz - c4o1*byy - c3o1*cxy + cyz))/(c54o1*o));
+   y_TN = c1o4*eps_new*(-((-c2o1*axy + c2o1*byy + c3o1*byz + c6o1*cyy + cyz))/(c54o1*o));
+   y_BN = c1o4*eps_new*(-((-c2o1*axy + c2o1*byy - c3o1*byz - c6o1*cyy + cyz))/(c54o1*o));
+   y_ZERO = c0o1;
+   y_TNE = c1o4*eps_new*(-((c2o1*ayy + ayz + bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSW = c1o4*eps_new*(((-c2o1*ayy + ayz - bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSE = c1o4*eps_new*(((c2o1*ayy - ayz + bxy + byz - cxy + c2o1*cyy))/(c72o1*o));
+   y_TNW = c1o4*eps_new*(((c2o1*ayy + ayz + bxy - byz + cxy - c2o1*cyy))/(c72o1*o));
+
+   z_E = c1o4*eps_new*((c2o1*(-c2o1*axz + byz + c2o1*czz))/(c27o1*o));
+   z_N = c1o4*eps_new*((c2o1*(axz - c2o1*byz + c2o1*czz))/(c27o1*o));
+   z_T = c1o4*eps_new*((c2o1*(axz + byz - c4o1*czz))/(c27o1*o));
+   z_NE = c1o4*eps_new*(-((axz + c3o1*ayz + c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_SE = c1o4*eps_new*(-((axz - c3o1*ayz - c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_TE = c1o4*eps_new*(-((axz + c6o1*azz - c2o1*byz + c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_BE = c1o4*eps_new*(-((axz - c6o1*azz - c2o1*byz - c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_TN = c1o4*eps_new*(-((-c2o1*axz + byz + c6o1*bzz + c3o1*cyz + c2o1*czz))/(c54o1*o));
+   z_BN = c1o4*eps_new*(-((-c2o1*axz + byz - c6o1*bzz - c3o1*cyz + c2o1*czz))/(c54o1*o));
+   z_ZERO = c0o1;
+   z_TNE = c1o4*eps_new*(-((ayz + c2o1*azz + bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSW = c1o4*eps_new*(((-ayz + c2o1*azz - bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSE = c1o4*eps_new*(((ayz - c2o1*azz + bxz + c2o1*bzz - cxz + cyz))/(c72o1*o));
+   z_TNW = c1o4*eps_new*(((ayz + c2o1*azz + bxz - c2o1*bzz + cxz - cyz))/(c72o1*o));
+
+   xy_E   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_N   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_T   = -(c1o16*eps_new *((                       c4o1*cxyz)/(c27o1*o)));
+   xy_NE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_SE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_TE  = -(c1o16*eps_new *(( c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_BE  = -(c1o16*eps_new *((-c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_TN  = -(c1o16*eps_new *((            c3o1*bxyz +     cxyz)/(c54o1*o)));
+   xy_BN  = -(c1o16*eps_new *((          - c3o1*bxyz +     cxyz)/(c54o1*o)));
+   //xy_ZERO=   c1o16*eps_new;
+   xy_TNE = -(c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o)));
+   xy_TSW =   c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o));
+   xy_TSE =   c1o16*eps_new *((-    axyz +     bxyz           )/(c72o1*o));
+   xy_TNW =   c1o16*eps_new *((     axyz -     bxyz           )/(c72o1*o));
+
+   xz_E   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_N   = -(c1o16*eps_new *((            c4o1*bxyz           )/(c27o1*o)));
+   xz_T   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_NE  = -(c1o16*eps_new *(( c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_SE  = -(c1o16*eps_new *((-c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_TE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_BE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_TN  = -(c1o16*eps_new *((                bxyz + c3o1*cxyz)/(c54o1*o)));
+   xz_BN  = -(c1o16*eps_new *((                bxyz - c3o1*cxyz)/(c54o1*o)));
+   //xz_ZERO=   c1o16*eps_new;
+   xz_TNE = -(c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o)));
+   xz_TSW =   c1o16*eps_new *((-    axyz            +     cxyz)/(c72o1*o));
+   xz_TSE =   c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o));
+   xz_TNW =   c1o16*eps_new *((     axyz            -     cxyz)/(c72o1*o));
+
+   yz_E   = -(c1o16*eps_new *(( c4o1*axyz                      )/(c27o1*o)));
+   yz_N   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_T   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_NE  = -(c1o16*eps_new *((     axyz + c3o1*bxyz           )/(c54o1*o)));
+   yz_SE  = -(c1o16*eps_new *((     axyz - c3o1*bxyz           )/(c54o1*o)));
+   yz_TE  = -(c1o16*eps_new *((     axyz            + c3o1*cxyz)/(c54o1*o)));
+   yz_BE  = -(c1o16*eps_new *((     axyz            - c3o1*cxyz)/(c54o1*o)));
+   yz_TN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   yz_BN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   //yz_ZERO=   c1o16*eps_new;
+   yz_TNE = -(c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o)));
+   yz_TSW =   c1o16*eps_new *((          -     bxyz +     cxyz)/(c72o1*o));
+   yz_TSE =   c1o16*eps_new *((                bxyz -     cxyz)/(c72o1*o));
+   yz_TNW =   c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeCF(real* f, real omega, real x, real y, real z, real press, real xs, real ys, real zs)
@@ -491,15 +491,15 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeCF(rea
    using namespace vf::lbm::dir;
    using namespace vf::lbm::constant;
 
-   real eps_new = 0.5;
+   real eps_new = c1o2;
    real o = omega;
    //bulk viscosity
    real oP = OxxPyyPzzF;
 
-//   LBMReal rho  = press ;//+ (2.*axx*x+axy*y+axz*z+axyz*y*z+ax + 2.*byy*y+bxy*x+byz*z+bxyz*x*z+by + 2.*czz*z+cxz*x+cyz*y+cxyz*x*y+cz)/3.;
-   real vx1  = a0 + 0.25*( xs*ax + ys*ay + zs*az) + 0.0625*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + 0.015625*(xs*ys*zs*axyz);
-   real vx2  = b0 + 0.25*( xs*bx + ys*by + zs*bz) + 0.0625*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + 0.015625*(xs*ys*zs*bxyz);
-   real vx3  = c0 + 0.25*( xs*cx + ys*cy + zs*cz) + 0.0625*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + 0.015625*(xs*ys*zs*cxyz);
+//   LBMReal rho  = press ;//+ (c2o1*axx*x+axy*y+axz*z+axyz*y*z+ax + c2o1*byy*y+bxy*x+byz*z+bxyz*x*z+by + c2o1*czz*z+cxz*x+cyz*y+cxyz*x*y+cz)/c3o1;
+   real vx1  = a0 + c1o4*( xs*ax + ys*ay + zs*az) + c1o16*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + c1o64*(xs*ys*zs*axyz);
+   real vx2  = b0 + c1o4*( xs*bx + ys*by + zs*bz) + c1o16*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + c1o64*(xs*ys*zs*bxyz);
+   real vx3  = c0 + c1o4*( xs*cx + ys*cy + zs*cz) + c1o16*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + c1o64*(xs*ys*zs*cxyz);
 
    real mfcbb = c0o1;
    real mfabb = c0o1;
@@ -536,7 +536,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeCF(rea
    real vx3Sq = vx3*vx3;
    real oMdrho = c1o1;
 
-   //2.f
+   //c2o1f
 
    // linear combinations
    real mxxPyyPzz = mfaaa - c2o3*(ax + by + c2o1 *axx*x + bxy*x + axy*y + c2o1 *byy*y + axz*z + byz*z + bxyz*x*z + axyz*y*z + cz - cxz*x + cyz*y + cxyz*x*y + c2o1 *czz*z)*eps_new / oP* (c1o1 + press);
@@ -821,105 +821,105 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeCF(rea
 //Position SWB -0.25, -0.25, -0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressBSW()
 {
-   return   press_SWT * (0.140625 + 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NET * (0.015625 - 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.421875 + 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+   return   press_SWT * (c9o64 + c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NET * (c1o64 - c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c27o64 + c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWT -0.25, -0.25, 0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressTSW()
 {
-   return   press_SWT * (0.421875 + 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.015625 - 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+   return   press_SWT * (c27o64 + c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c1o64 - c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SET 0.25, -0.25, 0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressTSE()
 {
-   return   press_SET * (0.421875 - 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.015625 + 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+   return   press_SET * (c27o64 - c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c1o64 + c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SEB 0.25, -0.25, -0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressBSE()
 {
-   return   press_SET * (0.140625 - 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.015625 + 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.421875 - 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+   return   press_SET * (c9o64 - c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c1o64 + c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c27o64 - c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWB -0.25, 0.25, -0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressBNW()
 {
-   return   press_NWT * (0.140625 + 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.015625 - 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.421875 + 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+   return   press_NWT * (c9o64 + c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c1o64 - c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c27o64 + c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWT -0.25, 0.25, 0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressTNW()
 {
-   return   press_NWT * (0.421875 + 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.015625 - 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+   return   press_NWT * (c27o64 + c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c1o64 - c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NET 0.25, 0.25, 0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressTNE()
 {
-   return   press_NET * (0.421875 - 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.015625 + 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+   return   press_NET * (c27o64 - c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c1o64 + c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NEB 0.25, 0.25, -0.25
 real CompressibleOffsetMomentsInterpolationProcessor::calcPressBNE()
 {
-   return   press_NET * (0.140625 - 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.015625 + 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.421875 - 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+   return   press_NET * (c9o64 - c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c1o64 + c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c27o64 - c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position C 0.0, 0.0, 0.0
@@ -928,21 +928,21 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeFC(rea
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
 
-   real press  =  press_NET * (0.125 - 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_NWT * (0.125 + 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_SET * (0.125 - 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_SWT * (0.125 + 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_NEB * (0.125 - 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_NWB * (0.125 + 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_SEB * (0.125 - 0.25 * xoff + 0.25 * yoff + 0.25 * zoff) +
-      press_SWB * (0.125 + 0.25 * xoff + 0.25 * yoff + 0.25 * zoff);
+   real press  =  press_NET * (c4o32 - c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_NWT * (c4o32 + c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_SET * (c4o32 - c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_SWT * (c4o32 + c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_NEB * (c4o32 - c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_NWB * (c4o32 + c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_SEB * (c4o32 - c1o4 * xoff + c1o4 * yoff + c1o4 * zoff) +
+      press_SWB * (c4o32 + c1o4 * xoff + c1o4 * yoff + c1o4 * zoff);
    real vx1  = a0;
    real vx2  = b0;
    real vx3  = c0;
 
-//   LBMReal rho = press ;//+ (ax+by+cz)/3.;
+//   LBMReal rho = press ;//+ (ax+by+cz)/c3o1;
 
-   real eps_new = 2.;
+   real eps_new = c2o1;
    real o  = omega;
    //bulk viscosity
    real oP = OxxPyyPzzC;
@@ -1276,12 +1276,12 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedVelocity(r
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedShearStress(real x, real y, real z,real& tauxx, real& tauyy, real& tauzz,real& tauxy, real& tauxz, real& tauyz)
 {
-	tauxx=ax+2*axx*x+axy*y+axz*z+axyz*y*z;
-	tauyy=by+2*byy*y+bxy*x+byz*z+bxyz*x*z;
-	tauzz=cz+2*czz*z+cxz*x+cyz*y+cxyz*x*y;
-	tauxy=0.5*((ay+2.0*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+2.0*bxx*x+bxy*y+bxz*z+bxyz*y*z));
-	tauxz=0.5*((az+2.0*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+2.0*cxx*x+cxy*y+cxz*z+cxyz*y*z));
-	tauyz=0.5*((bz+2.0*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+2.0*cyy*y+cxy*x+cyz*z+cxyz*x*z));
+	tauxx=ax+c2o1*axx*x+axy*y+axz*z+axyz*y*z;
+	tauyy=by+c2o1*byy*y+bxy*x+byz*z+bxyz*x*z;
+	tauzz=cz+c2o1*czz*z+cxz*x+cyz*y+cxyz*x*y;
+	tauxy= c1o2*((ay+c2o1*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+c2o1*bxx*x+bxy*y+bxz*z+bxyz*y*z));
+	tauxz= c1o2*((az+c2o1*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+c2o1*cxx*x+cxy*y+cxz*z+cxyz*y*z));
+	tauyz= c1o2*((bz+c2o1*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+c2o1*cyy*y+cxy*x+cyz*z+cxyz*x*z));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::setBulkViscosity(real shearViscosity, real bulkViscosity)
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp
index f924d4b9150eabc78b9aa8b5e72eb3dd5df3cf45..1e82ff96f950eb84a2ef7e1da636ef91e51b85f4 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp
@@ -58,21 +58,21 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::setOffsets(real xof
 void CompressibleOffsetSquarePressureInterpolationProcessor::interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellC, omegaC, 0.5);
-   calcInterpolatedNodeCF(icellF.BSW, omegaF, -0.25, -0.25, -0.25, calcPressBSW(), -1, -1, -1);
-   calcInterpolatedNodeCF(icellF.BNE, omegaF,  0.25,  0.25, -0.25, calcPressBNE(),  1,  1, -1);
-   calcInterpolatedNodeCF(icellF.TNW, omegaF, -0.25,  0.25,  0.25, calcPressTNW(), -1,  1,  1);
-   calcInterpolatedNodeCF(icellF.TSE, omegaF,  0.25, -0.25,  0.25, calcPressTSE(),  1, -1,  1);
-   calcInterpolatedNodeCF(icellF.BNW, omegaF, -0.25,  0.25, -0.25, calcPressBNW(), -1,  1, -1);
-   calcInterpolatedNodeCF(icellF.BSE, omegaF,  0.25, -0.25, -0.25, calcPressBSE(),  1, -1, -1);
-   calcInterpolatedNodeCF(icellF.TSW, omegaF, -0.25, -0.25,  0.25, calcPressTSW(), -1, -1,  1);
-   calcInterpolatedNodeCF(icellF.TNE, omegaF,  0.25,  0.25,  0.25, calcPressTNE(),  1,  1,  1);
+   calcInterpolatedCoefficiets(icellC, omegaC, c1o2);
+   calcInterpolatedNodeCF(icellF.BSW, omegaF, -c1o4, -c1o4, -c1o4, calcPressBSW(), -c1o1, -c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.BNE, omegaF,  c1o4,  c1o4, -c1o4, calcPressBNE(),  c1o1,  c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.TNW, omegaF, -c1o4,  c1o4,  c1o4, calcPressTNW(), -c1o1,  c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.TSE, omegaF,  c1o4, -c1o4,  c1o4, calcPressTSE(),  c1o1, -c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.BNW, omegaF, -c1o4,  c1o4, -c1o4, calcPressBNW(), -c1o1,  c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.BSE, omegaF,  c1o4, -c1o4, -c1o4, calcPressBSE(),  c1o1, -c1o1, -c1o1);
+   calcInterpolatedNodeCF(icellF.TSW, omegaF, -c1o4, -c1o4,  c1o4, calcPressTSW(), -c1o1, -c1o1,  c1o1);
+   calcInterpolatedNodeCF(icellF.TNE, omegaF,  c1o4,  c1o4,  c1o4, calcPressTNE(),  c1o1,  c1o1,  c1o1);
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::interpolateFineToCoarse(D3Q27ICell& icellF, real* icellC, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellF, omegaF, 2.0);
+   calcInterpolatedCoefficiets(icellF, omegaF, c2o1);
    calcInterpolatedNodeFC(icellC, omegaC);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -82,16 +82,16 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcMoments(const r
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
 
-   real drho = 0.0;
+   real drho = c0o1;
    D3Q27System::calcCompMacroscopicValues(f,drho,vx1,vx2,vx3);
    
    press = drho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(c1o1 + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(c1o1 + drho)-(vx2*vx3));
-   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(c1o1 + drho)-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(c1o1 + drho)-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(c1o1 + drho)-(vx1*vx1-vx3*vx3));
+   kxy   = -c3o1*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(c1o1 + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -c3o1*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(c1o1 + drho)-(vx2*vx3));
+   kxz   = -c3o1*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(c1o1 + drho)-(vx1*vx3));
+   kxxMyy = -c3o1/c2o1*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(c1o1 + drho)-(vx1*vx1-vx2*vx2));
+   kxxMzz = -c3o1/c2o1*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(c1o1 + drho)-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, real omega, real eps_new)
@@ -190,116 +190,116 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET - 2.*kxyFromfcNEQ_NWB - 2.*kxyFromfcNEQ_NWT +
-      2.*kxyFromfcNEQ_SEB + 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB - 2.*kxzFromfcNEQ_NWT +
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB - 2.*kxzFromfcNEQ_SWT +
-      8.*vx1_NEB + 8.*vx1_NET + 8.*vx1_NWB + 8.*vx1_NWT + 8.*vx1_SEB +
-      8.*vx1_SET + 8.*vx1_SWB + 8.*vx1_SWT + 2.*vx2_NEB + 2.*vx2_NET -
-      2.*vx2_NWB - 2.*vx2_NWT - 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB +
-      2.*vx2_SWT - 2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
-   b0 = (2.*kxxMyyFromfcNEQ_NEB + 2.*kxxMyyFromfcNEQ_NET + 2.*kxxMyyFromfcNEQ_NWB + 2.*kxxMyyFromfcNEQ_NWT -
-      2.*kxxMyyFromfcNEQ_SEB - 2.*kxxMyyFromfcNEQ_SET - 2.*kxxMyyFromfcNEQ_SWB - 2.*kxxMyyFromfcNEQ_SWT -
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET - c2o1*kxyFromfcNEQ_NWB - c2o1*kxyFromfcNEQ_NWT +
+      c2o1*kxyFromfcNEQ_SEB + c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB - c2o1*kxzFromfcNEQ_NWT +
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB - c2o1*kxzFromfcNEQ_SWT +
+      c8o1*vx1_NEB + c8o1*vx1_NET + c8o1*vx1_NWB + c8o1*vx1_NWT + c8o1*vx1_SEB +
+      c8o1*vx1_SET + c8o1*vx1_SWB + c8o1*vx1_SWT + c2o1*vx2_NEB + c2o1*vx2_NET -
+      c2o1*vx2_NWB - c2o1*vx2_NWT - c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB +
+      c2o1*vx2_SWT - c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
+   b0 = (c2o1*kxxMyyFromfcNEQ_NEB + c2o1*kxxMyyFromfcNEQ_NET + c2o1*kxxMyyFromfcNEQ_NWB + c2o1*kxxMyyFromfcNEQ_NWT -
+      c2o1*kxxMyyFromfcNEQ_SEB - c2o1*kxxMyyFromfcNEQ_SET - c2o1*kxxMyyFromfcNEQ_SWB - c2o1*kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET + 2.*kxyFromfcNEQ_NWB + 2.*kxyFromfcNEQ_NWT -
-      2.*kxyFromfcNEQ_SEB - 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET + 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB - 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB - 2.*kyzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT +
-      8.*vx2_NEB + 8.*vx2_NET + 8.*vx2_NWB + 8.*vx2_NWT +
-      8.*vx2_SEB + 8.*vx2_SET + 8.*vx2_SWB + 8.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET + c2o1*kxyFromfcNEQ_NWB + c2o1*kxyFromfcNEQ_NWT -
+      c2o1*kxyFromfcNEQ_SEB - c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET + c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB - c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB - c2o1*kyzFromfcNEQ_SWT +
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT +
+      c8o1*vx2_NEB + c8o1*vx2_NET + c8o1*vx2_NWB + c8o1*vx2_NWT +
+      c8o1*vx2_SEB + c8o1*vx2_SET + c8o1*vx2_SWB + c8o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
    c0 = (kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT -
-      2.*kxxMzzFromfcNEQ_NEB + 2.*kxxMzzFromfcNEQ_NET - 2.*kxxMzzFromfcNEQ_NWB + 2.*kxxMzzFromfcNEQ_NWT -
-      2.*kxxMzzFromfcNEQ_SEB + 2.*kxxMzzFromfcNEQ_SET - 2.*kxxMzzFromfcNEQ_SWB + 2.*kxxMzzFromfcNEQ_SWT -
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB + 2.*kxzFromfcNEQ_NWT -
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB + 2.*kxzFromfcNEQ_SWT -
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET - 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB + 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB + 2.*kyzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT +
-      8.*vx3_NEB + 8.*vx3_NET + 8.*vx3_NWB + 8.*vx3_NWT +
-      8.*vx3_SEB + 8.*vx3_SET + 8.*vx3_SWB + 8.*vx3_SWT)/64.;
-   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*kxxMzzFromfcNEQ_NEB + c2o1*kxxMzzFromfcNEQ_NET - c2o1*kxxMzzFromfcNEQ_NWB + c2o1*kxxMzzFromfcNEQ_NWT -
+      c2o1*kxxMzzFromfcNEQ_SEB + c2o1*kxxMzzFromfcNEQ_SET - c2o1*kxxMzzFromfcNEQ_SWB + c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB + c2o1*kxzFromfcNEQ_NWT -
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB + c2o1*kxzFromfcNEQ_SWT -
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET - c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB + c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB + c2o1*kyzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT +
+      c8o1*vx3_NEB + c8o1*vx3_NET + c8o1*vx3_NWB + c8o1*vx3_NWT +
+      c8o1*vx3_SEB + c8o1*vx3_SET + c8o1*vx3_SWB + c8o1*vx3_SWT)/c64o1;
+   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    axx= (kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB + 2.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB + c2o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    bxx= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET - kxyFromfcNEQ_NWB - kxyFromfcNEQ_NWT +
       kxyFromfcNEQ_SEB + kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx1_NEB - 2.*vx1_NET + 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB + 2.*vx1_SET - 2.*vx1_SWB - 2.*vx1_SWT)/8.;
+      c2o1*vx1_NEB - c2o1*vx1_NET + c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB + c2o1*vx1_SET - c2o1*vx1_SWB - c2o1*vx1_SWT)/c8o1;
    cxx= (kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB - kxzFromfcNEQ_NWT +
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB - kxzFromfcNEQ_SWT +
-      2.*vx1_NEB - 2.*vx1_NET - 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB - 2.*vx1_SET - 2.*vx1_SWB + 2.*vx1_SWT)/8.;
-   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*vx1_NEB - c2o1*vx1_NET - c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB - c2o1*vx1_SET - c2o1*vx1_SWB + c2o1*vx1_SWT)/c8o1;
+   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    ayy= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET + kxyFromfcNEQ_NWB + kxyFromfcNEQ_NWT -
       kxyFromfcNEQ_SEB - kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB - 2.*vx2_SWT)/8.;
-   byy= (-2.*kxxMyyFromfcNEQ_NEB - 2.*kxxMyyFromfcNEQ_NET - 2.*kxxMyyFromfcNEQ_NWB - 2.*kxxMyyFromfcNEQ_NWT +
-      2.*kxxMyyFromfcNEQ_SEB + 2.*kxxMyyFromfcNEQ_SET + 2.*kxxMyyFromfcNEQ_SWB + 2.*kxxMyyFromfcNEQ_SWT +
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB - c2o1*vx2_SWT)/c8o1;
+   byy= (-c2o1*kxxMyyFromfcNEQ_NEB - c2o1*kxxMyyFromfcNEQ_NET - c2o1*kxxMyyFromfcNEQ_NWB - c2o1*kxxMyyFromfcNEQ_NWT +
+      c2o1*kxxMyyFromfcNEQ_SEB + c2o1*kxxMyyFromfcNEQ_SET + c2o1*kxxMyyFromfcNEQ_SWB + c2o1*kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    cyy= (kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET + kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB - kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB - kyzFromfcNEQ_SWT +
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB + 2.*vx2_SWT)/8.;
-   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/4.;
-   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/4.;
-   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/4.;
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB + c2o1*vx2_SWT)/c8o1;
+   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/c4o1;
+   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/c4o1;
+   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/c4o1;
    azz= (-kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB + kxzFromfcNEQ_NWT -
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB + kxzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    bzz= (-kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET - kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB + kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB + kyzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    czz= (-kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT -
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT +
-      2.*kxxMzzFromfcNEQ_NEB - 2.*kxxMzzFromfcNEQ_NET + 2.*kxxMzzFromfcNEQ_NWB - 2.*kxxMzzFromfcNEQ_NWT +
-      2.*kxxMzzFromfcNEQ_SEB - 2.*kxxMzzFromfcNEQ_SET + 2.*kxxMzzFromfcNEQ_SWB - 2.*kxxMzzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT)/16.;
-   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/2.;
-   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/2.;
-   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/2.;
-   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/2.;
-   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/2.;
+      c2o1*kxxMzzFromfcNEQ_NEB - c2o1*kxxMzzFromfcNEQ_NET + c2o1*kxxMzzFromfcNEQ_NWB - c2o1*kxxMzzFromfcNEQ_NWT +
+      c2o1*kxxMzzFromfcNEQ_SEB - c2o1*kxxMzzFromfcNEQ_SET + c2o1*kxxMzzFromfcNEQ_SWB - c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT)/c16o1;
+   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/c2o1;
+   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/c2o1;
+   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/c2o1;
+   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
+   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
    axyz=-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT + vx1_SEB - vx1_SET - vx1_SWB + vx1_SWT;
    bxyz=-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT + vx2_SEB - vx2_SET - vx2_SWB + vx2_SWT;
    cxyz=-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT + vx3_SEB - vx3_SET - vx3_SWB + vx3_SWT;
 
 
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-   kxyAverage       =0;//(kxyFromfcNEQ_SWB+
+   kxyAverage       = c0o1;//(kxyFromfcNEQ_SWB+
                        //kxyFromfcNEQ_SWT+
                        //kxyFromfcNEQ_SET+
                        //kxyFromfcNEQ_SEB+
@@ -307,7 +307,7 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
                        //kxyFromfcNEQ_NWT+
                        //kxyFromfcNEQ_NET+
                        //kxyFromfcNEQ_NEB)*c1o8-(ay+bx);
-   kyzAverage       =0;//(kyzFromfcNEQ_SWB+
+   kyzAverage       = c0o1;//(kyzFromfcNEQ_SWB+
                        //kyzFromfcNEQ_SWT+
                        //kyzFromfcNEQ_SET+
                        //kyzFromfcNEQ_SEB+
@@ -315,7 +315,7 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
                        //kyzFromfcNEQ_NWT+
                        //kyzFromfcNEQ_NET+
                        //kyzFromfcNEQ_NEB)*c1o8-(bz+cy);
-   kxzAverage       =0;//(kxzFromfcNEQ_SWB+
+   kxzAverage       = c0o1;//(kxzFromfcNEQ_SWB+
                        //kxzFromfcNEQ_SWT+
                        //kxzFromfcNEQ_SET+
                        //kxzFromfcNEQ_SEB+
@@ -323,7 +323,7 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
                        //kxzFromfcNEQ_NWT+
                        //kxzFromfcNEQ_NET+
                        //kxzFromfcNEQ_NEB)*c1o8-(az+cx);
-   kxxMyyAverage    =0;//(kxxMyyFromfcNEQ_SWB+
+   kxxMyyAverage    = c0o1;//(kxxMyyFromfcNEQ_SWB+
                        //kxxMyyFromfcNEQ_SWT+
                        //kxxMyyFromfcNEQ_SET+
                        //kxxMyyFromfcNEQ_SEB+
@@ -331,7 +331,7 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
                        //kxxMyyFromfcNEQ_NWT+
                        //kxxMyyFromfcNEQ_NET+
                        //kxxMyyFromfcNEQ_NEB)*c1o8-(ax-by);
-   kxxMzzAverage    =0;//(kxxMzzFromfcNEQ_SWB+
+   kxxMzzAverage    = c0o1;//(kxxMzzFromfcNEQ_SWB+
                        //kxxMzzFromfcNEQ_SWT+
                        //kxxMzzFromfcNEQ_SET+
                        //kxxMzzFromfcNEQ_SEB+
@@ -345,17 +345,17 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
    //
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    a0 = a0 + xoff * ax + yoff * ay + zoff * az + xoff_sq * axx + yoff_sq * ayy + zoff_sq * azz + xoff*yoff*axy + xoff*zoff*axz + yoff*zoff*ayz + xoff*yoff*zoff*axyz ;
-   ax = ax + 2. * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
-   ay = ay + 2. * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
-   az = az + 2. * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
+   ax = ax + c2o1 * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
+   ay = ay + c2o1 * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
+   az = az + c2o1 * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
    b0 = b0 + xoff * bx + yoff * by + zoff * bz + xoff_sq * bxx + yoff_sq * byy + zoff_sq * bzz + xoff*yoff*bxy + xoff*zoff*bxz + yoff*zoff*byz + xoff*yoff*zoff*bxyz;
-   bx = bx + 2. * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
-   by = by + 2. * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
-   bz = bz + 2. * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
+   bx = bx + c2o1 * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
+   by = by + c2o1 * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
+   bz = bz + c2o1 * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
    c0 = c0 + xoff * cx + yoff * cy + zoff * cz + xoff_sq * cxx + yoff_sq * cyy + zoff_sq * czz + xoff*yoff*cxy + xoff*zoff*cxz + yoff*zoff*cyz + xoff*yoff*zoff*cxyz;
-   cx = cx + 2. * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
-   cy = cy + 2. * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
-   cz = cz + 2. * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
+   cx = cx + c2o1 * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
+   cy = cy + c2o1 * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
+   cz = cz + c2o1 * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
    axy= axy + zoff*axyz;
    axz= axz + yoff*axyz;
    ayz= ayz + xoff*axyz;
@@ -369,110 +369,110 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoe
 
    const real o = omega;
 
-   f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o));
-   f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o));
-   f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o));
-   f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o));
-   f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o));
-   f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o));
-   f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o));
-   f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o));
-   f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o));
+   f_E = eps_new*((c2o1*(-c2o1*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(c27o1*o));
+   f_N = eps_new*((c2o1*(ax - c2o1*by + cz+c2o1*kxxMyyAverage-kxxMzzAverage))/(c27o1*o));
+   f_T = eps_new*((c2o1*(ax + by - c2o1*cz-kxxMyyAverage+c2o1*kxxMzzAverage))/(c27o1*o));
+   f_NE = eps_new*(-(ax + c3o1*ay + c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage+c3o1*kxyAverage)/(c54o1*o));
+   f_SE = eps_new*(-(ax - c3o1*ay - c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage-c3o1*kxyAverage)/(c54o1*o));
+   f_TE = eps_new*(-(ax + c3o1*az - c2o1*by + c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage+c3o1*kxzAverage)/(c54o1*o));
+   f_BE = eps_new*(-(ax - c3o1*az - c2o1*by - c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage-c3o1*kxzAverage)/(c54o1*o));
+   f_TN = eps_new*(-(-c2o1*ax + by + c3o1*bz + c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage+c3o1*kyzAverage)/(c54o1*o));
+   f_BN = eps_new*(-(-c2o1*ax + by - c3o1*bz - c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage-c3o1*kyzAverage)/(c54o1*o));
    f_ZERO = 0.;
-   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
-   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
-
-   x_E = 0.25*eps_new*((2*(-4*axx + bxy + cxz))/(27.*o));
-   x_N = 0.25*eps_new*((2*(2*axx - 2*bxy + cxz))/(27.*o));
-   x_T = 0.25*eps_new*((2*(2*axx + bxy - 2*cxz))/(27.*o));
-   x_NE = 0.25*eps_new*(-((2*axx + 3*axy + 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_SE = 0.25*eps_new*(-((2*axx - 3*axy - 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_TE = 0.25*eps_new*(-((2*axx + 3*axz - 2*bxy + 6*cxx + cxz))/(54.*o));
-   x_BE = 0.25*eps_new*(-((2*axx - 3*axz - 2*bxy - 6*cxx + cxz))/(54.*o));
-   x_TN = 0.25*eps_new*(-((-4*axx + bxy + 3*bxz + 3*cxy + cxz))/(54.*o));
-   x_BN = 0.25*eps_new*(-((-4*axx + bxy - 3*bxz - 3*cxy + cxz))/(54.*o));
+   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(c72o1*o));
+   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(c72o1*o));
+
+   x_E = c1o4*eps_new*((c2o1*(-c4o1*axx + bxy + cxz))/(c27o1*o));
+   x_N = c1o4*eps_new*((c2o1*(c2o1*axx - c2o1*bxy + cxz))/(c27o1*o));
+   x_T = c1o4*eps_new*((c2o1*(c2o1*axx + bxy - c2o1*cxz))/(c27o1*o));
+   x_NE = c1o4*eps_new*(-((c2o1*axx + c3o1*axy + c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_SE = c1o4*eps_new*(-((c2o1*axx - c3o1*axy - c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_TE = c1o4*eps_new*(-((c2o1*axx + c3o1*axz - c2o1*bxy + c6o1*cxx + cxz))/(c54o1*o));
+   x_BE = c1o4*eps_new*(-((c2o1*axx - c3o1*axz - c2o1*bxy - c6o1*cxx + cxz))/(c54o1*o));
+   x_TN = c1o4*eps_new*(-((-c4o1*axx + bxy + c3o1*bxz + c3o1*cxy + cxz))/(c54o1*o));
+   x_BN = c1o4*eps_new*(-((-c4o1*axx + bxy - c3o1*bxz - c3o1*cxy + cxz))/(c54o1*o));
    x_ZERO = 0.;
-   x_TNE = 0.25*eps_new*(-((axy + axz + 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSW = 0.25*eps_new*(((-axy + axz - 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSE = 0.25*eps_new*(((axy - axz + 2*bxx + bxz - 2*cxx + cxy))/(72.*o));
-   x_TNW = 0.25*eps_new*(((axy + axz + 2*bxx - bxz + 2*cxx - cxy))/(72.*o));
-
-   y_E = 0.25*eps_new*(2*(-2*axy + 2*byy + cyz))/(27.*o);
-   y_N = 0.25*eps_new*(2*(axy - 4*byy + cyz))/(27.*o);
-   y_T = 0.25*eps_new*(2*(axy + 2*byy - 2*cyz))/(27.*o);
-   y_NE = 0.25*eps_new*(-((axy + 6*ayy + 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_SE = 0.25*eps_new*(-((axy - 6*ayy - 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_TE = 0.25*eps_new*(-((axy + 3*ayz - 4*byy + 3*cxy + cyz))/(54.*o));
-   y_BE = 0.25*eps_new*(-((axy - 3*ayz - 4*byy - 3*cxy + cyz))/(54.*o));
-   y_TN = 0.25*eps_new*(-((-2*axy + 2*byy + 3*byz + 6*cyy + cyz))/(54.*o));
-   y_BN = 0.25*eps_new*(-((-2*axy + 2*byy - 3*byz - 6*cyy + cyz))/(54.*o));
+   x_TNE = c1o4*eps_new*(-((axy + axz + c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSW = c1o4*eps_new*(((-axy + axz - c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSE = c1o4*eps_new*(((axy - axz + c2o1*bxx + bxz - c2o1*cxx + cxy))/(c72o1*o));
+   x_TNW = c1o4*eps_new*(((axy + axz + c2o1*bxx - bxz + c2o1*cxx - cxy))/(c72o1*o));
+
+   y_E = c1o4*eps_new*(c2o1*(-c2o1*axy + c2o1*byy + cyz))/(c27o1*o);
+   y_N = c1o4*eps_new*(c2o1*(axy - c4o1*byy + cyz))/(c27o1*o);
+   y_T = c1o4*eps_new*(c2o1*(axy + c2o1*byy - c2o1*cyz))/(c27o1*o);
+   y_NE = c1o4*eps_new*(-((axy + c6o1*ayy + c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_SE = c1o4*eps_new*(-((axy - c6o1*ayy - c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_TE = c1o4*eps_new*(-((axy + c3o1*ayz - c4o1*byy + c3o1*cxy + cyz))/(c54o1*o));
+   y_BE = c1o4*eps_new*(-((axy - c3o1*ayz - c4o1*byy - c3o1*cxy + cyz))/(c54o1*o));
+   y_TN = c1o4*eps_new*(-((-c2o1*axy + c2o1*byy + c3o1*byz + c6o1*cyy + cyz))/(c54o1*o));
+   y_BN = c1o4*eps_new*(-((-c2o1*axy + c2o1*byy - c3o1*byz - c6o1*cyy + cyz))/(c54o1*o));
    y_ZERO = 0.;
-   y_TNE = 0.25*eps_new*(-((2*ayy + ayz + bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSW = 0.25*eps_new*(((-2*ayy + ayz - bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSE = 0.25*eps_new*(((2*ayy - ayz + bxy + byz - cxy + 2*cyy))/(72.*o));
-   y_TNW = 0.25*eps_new*(((2*ayy + ayz + bxy - byz + cxy - 2*cyy))/(72.*o));
-
-   z_E = 0.25*eps_new*((2*(-2*axz + byz + 2*czz))/(27.*o));
-   z_N = 0.25*eps_new*((2*(axz - 2*byz + 2*czz))/(27.*o));
-   z_T = 0.25*eps_new*((2*(axz + byz - 4*czz))/(27.*o));
-   z_NE = 0.25*eps_new*(-((axz + 3*ayz + 3*bxz + byz - 4*czz))/(54.*o));
-   z_SE = 0.25*eps_new*(-((axz - 3*ayz - 3*bxz + byz - 4*czz))/(54.*o));
-   z_TE = 0.25*eps_new*(-((axz + 6*azz - 2*byz + 3*cxz + 2*czz))/(54.*o));
-   z_BE = 0.25*eps_new*(-((axz - 6*azz - 2*byz - 3*cxz + 2*czz))/(54.*o));
-   z_TN = 0.25*eps_new*(-((-2*axz + byz + 6*bzz + 3*cyz + 2*czz))/(54.*o));
-   z_BN = 0.25*eps_new*(-((-2*axz + byz - 6*bzz - 3*cyz + 2*czz))/(54.*o));
+   y_TNE = c1o4*eps_new*(-((c2o1*ayy + ayz + bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSW = c1o4*eps_new*(((-c2o1*ayy + ayz - bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSE = c1o4*eps_new*(((c2o1*ayy - ayz + bxy + byz - cxy + c2o1*cyy))/(c72o1*o));
+   y_TNW = c1o4*eps_new*(((c2o1*ayy + ayz + bxy - byz + cxy - c2o1*cyy))/(c72o1*o));
+
+   z_E = c1o4*eps_new*((c2o1*(-c2o1*axz + byz + c2o1*czz))/(c27o1*o));
+   z_N = c1o4*eps_new*((c2o1*(axz - c2o1*byz + c2o1*czz))/(c27o1*o));
+   z_T = c1o4*eps_new*((c2o1*(axz + byz - c4o1*czz))/(c27o1*o));
+   z_NE = c1o4*eps_new*(-((axz + c3o1*ayz + c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_SE = c1o4*eps_new*(-((axz - c3o1*ayz - c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_TE = c1o4*eps_new*(-((axz + c6o1*azz - c2o1*byz + c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_BE = c1o4*eps_new*(-((axz - c6o1*azz - c2o1*byz - c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_TN = c1o4*eps_new*(-((-c2o1*axz + byz + c6o1*bzz + c3o1*cyz + c2o1*czz))/(c54o1*o));
+   z_BN = c1o4*eps_new*(-((-c2o1*axz + byz - c6o1*bzz - c3o1*cyz + c2o1*czz))/(c54o1*o));
    z_ZERO = 0.;
-   z_TNE = 0.25*eps_new*(-((ayz + 2*azz + bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSW = 0.25*eps_new*(((-ayz + 2*azz - bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSE = 0.25*eps_new*(((ayz - 2*azz + bxz + 2*bzz - cxz + cyz))/(72.*o));
-   z_TNW = 0.25*eps_new*(((ayz + 2*azz + bxz - 2*bzz + cxz - cyz))/(72.*o));
-
-   xy_E   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_N   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_T   = -(0.0625*eps_new *((                       4.*cxyz)/(27.*o)));
-   xy_NE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_SE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_TE  = -(0.0625*eps_new *(( 3.*axyz            +     cxyz)/(54.*o)));
-   xy_BE  = -(0.0625*eps_new *((-3.*axyz            +     cxyz)/(54.*o)));
-   xy_TN  = -(0.0625*eps_new *((            3.*bxyz +     cxyz)/(54.*o)));
-   xy_BN  = -(0.0625*eps_new *((          - 3.*bxyz +     cxyz)/(54.*o)));
-   //xy_ZERO=   0.0625*eps_new;
-   xy_TNE = -(0.0625*eps_new *((     axyz +     bxyz           )/(72.*o)));
-   xy_TSW =   0.0625*eps_new *((     axyz +     bxyz           )/(72.*o));
-   xy_TSE =   0.0625*eps_new *((-    axyz +     bxyz           )/(72.*o));
-   xy_TNW =   0.0625*eps_new *((     axyz -     bxyz           )/(72.*o));
-
-   xz_E   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_N   = -(0.0625*eps_new *((            4.*bxyz           )/(27.*o)));
-   xz_T   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_NE  = -(0.0625*eps_new *(( 3.*axyz +     bxyz           )/(54.*o)));
-   xz_SE  = -(0.0625*eps_new *((-3.*axyz +     bxyz           )/(54.*o)));
-   xz_TE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_BE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_TN  = -(0.0625*eps_new *((                bxyz + 3.*cxyz)/(54.*o)));
-   xz_BN  = -(0.0625*eps_new *((                bxyz - 3.*cxyz)/(54.*o)));
-   //xz_ZERO=   0.0625*eps_new;
-   xz_TNE = -(0.0625*eps_new *((     axyz            +     cxyz)/(72.*o)));
-   xz_TSW =   0.0625*eps_new *((-    axyz            +     cxyz)/(72.*o));
-   xz_TSE =   0.0625*eps_new *((     axyz            +     cxyz)/(72.*o));
-   xz_TNW =   0.0625*eps_new *((     axyz            -     cxyz)/(72.*o));
-
-   yz_E   = -(0.0625*eps_new *(( 4.*axyz                      )/(27.*o)));
-   yz_N   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_T   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_NE  = -(0.0625*eps_new *((     axyz + 3.*bxyz           )/(54.*o)));
-   yz_SE  = -(0.0625*eps_new *((     axyz - 3.*bxyz           )/(54.*o)));
-   yz_TE  = -(0.0625*eps_new *((     axyz            + 3.*cxyz)/(54.*o)));
-   yz_BE  = -(0.0625*eps_new *((     axyz            - 3.*cxyz)/(54.*o)));
-   yz_TN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   yz_BN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   //yz_ZERO=   0.0625*eps_new;
-   yz_TNE = -(0.0625*eps_new *((                bxyz +     cxyz)/(72.*o)));
-   yz_TSW =   0.0625*eps_new *((          -     bxyz +     cxyz)/(72.*o));
-   yz_TSE =   0.0625*eps_new *((                bxyz -     cxyz)/(72.*o));
-   yz_TNW =   0.0625*eps_new *((                bxyz +     cxyz)/(72.*o));
+   z_TNE = c1o4*eps_new*(-((ayz + c2o1*azz + bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSW = c1o4*eps_new*(((-ayz + c2o1*azz - bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSE = c1o4*eps_new*(((ayz - c2o1*azz + bxz + c2o1*bzz - cxz + cyz))/(c72o1*o));
+   z_TNW = c1o4*eps_new*(((ayz + c2o1*azz + bxz - c2o1*bzz + cxz - cyz))/(c72o1*o));
+
+   xy_E   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_N   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_T   = -(c1o16*eps_new *((                       c4o1*cxyz)/(c27o1*o)));
+   xy_NE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_SE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_TE  = -(c1o16*eps_new *(( c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_BE  = -(c1o16*eps_new *((-c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_TN  = -(c1o16*eps_new *((            c3o1*bxyz +     cxyz)/(c54o1*o)));
+   xy_BN  = -(c1o16*eps_new *((          - c3o1*bxyz +     cxyz)/(c54o1*o)));
+   //xy_ZERO=   c1o16*eps_new;
+   xy_TNE = -(c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o)));
+   xy_TSW =   c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o));
+   xy_TSE =   c1o16*eps_new *((-    axyz +     bxyz           )/(c72o1*o));
+   xy_TNW =   c1o16*eps_new *((     axyz -     bxyz           )/(c72o1*o));
+
+   xz_E   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_N   = -(c1o16*eps_new *((            c4o1*bxyz           )/(c27o1*o)));
+   xz_T   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_NE  = -(c1o16*eps_new *(( c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_SE  = -(c1o16*eps_new *((-c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_TE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_BE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_TN  = -(c1o16*eps_new *((                bxyz + c3o1*cxyz)/(c54o1*o)));
+   xz_BN  = -(c1o16*eps_new *((                bxyz - c3o1*cxyz)/(c54o1*o)));
+   //xz_ZERO=   c1o16*eps_new;
+   xz_TNE = -(c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o)));
+   xz_TSW =   c1o16*eps_new *((-    axyz            +     cxyz)/(c72o1*o));
+   xz_TSE =   c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o));
+   xz_TNW =   c1o16*eps_new *((     axyz            -     cxyz)/(c72o1*o));
+
+   yz_E   = -(c1o16*eps_new *(( c4o1*axyz                      )/(c27o1*o)));
+   yz_N   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_T   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_NE  = -(c1o16*eps_new *((     axyz + c3o1*bxyz           )/(c54o1*o)));
+   yz_SE  = -(c1o16*eps_new *((     axyz - c3o1*bxyz           )/(c54o1*o)));
+   yz_TE  = -(c1o16*eps_new *((     axyz            + c3o1*cxyz)/(c54o1*o)));
+   yz_BE  = -(c1o16*eps_new *((     axyz            - c3o1*cxyz)/(c54o1*o)));
+   yz_TN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   yz_BN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   //yz_ZERO=   c1o16*eps_new;
+   yz_TNE = -(c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o)));
+   yz_TSW =   c1o16*eps_new *((          -     bxyz +     cxyz)/(c72o1*o));
+   yz_TSE =   c1o16*eps_new *((                bxyz -     cxyz)/(c72o1*o));
+   yz_TNW =   c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNodeCF(real* f, real omega, real x, real y, real z, real press, real xs, real ys, real zs)
@@ -480,20 +480,20 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
 
-   real eps_new = 0.5;
+   real eps_new = c1o2;
    real o = omega;
    //bulk viscosity
    real oP = OxxPyyPzzF;
 
-   real rho  = press ;//+ (2.*axx*x+axy*y+axz*z+axyz*y*z+ax + 2.*byy*y+bxy*x+byz*z+bxyz*x*z+by + 2.*czz*z+cxz*x+cyz*y+cxyz*x*y+cz)/3.;
+   real rho  = press ;//+ (c2o1*axx*x+axy*y+axz*z+axyz*y*z+ax + c2o1*byy*y+bxy*x+byz*z+bxyz*x*z+by + c2o1*czz*z+cxz*x+cyz*y+cxyz*x*y+cz)/3.;
 
-   real laplaceRho = (xoff!=0.0 || yoff!=0.0 || zoff!= 0.0) ? 0.0 :(-3.0*(by*by+ax*ax+cz*cz)-6.0*(ay*bx+bz*cy+az*cx))*(1.0+rho);
+   real laplaceRho = (xoff!=c0o1 || yoff!=c0o1 || zoff!= c0o1) ? c0o1 :(-c3o1*(by*by+ax*ax+cz*cz)-c6o1*(ay*bx+bz*cy+az*cx))*(c1o1+rho);
 
-   rho=rho+laplaceRho*(3.0/16.0);
+   rho=rho+laplaceRho*(c3o1/c16o1);
 
-   real vx1  = a0 + 0.25*( xs*ax + ys*ay + zs*az) + 0.0625*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + 0.015625*(xs*ys*zs*axyz);
-   real vx2  = b0 + 0.25*( xs*bx + ys*by + zs*bz) + 0.0625*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + 0.015625*(xs*ys*zs*bxyz);
-   real vx3  = c0 + 0.25*( xs*cx + ys*cy + zs*cz) + 0.0625*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + 0.015625*(xs*ys*zs*cxyz);
+   real vx1  = a0 + c1o4*( xs*ax + ys*ay + zs*az) + c1o16*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + c1o64*(xs*ys*zs*axyz);
+   real vx2  = b0 + c1o4*( xs*bx + ys*by + zs*bz) + c1o16*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + c1o64*(xs*ys*zs*bxyz);
+   real vx3  = c0 + c1o4*( xs*cx + ys*cy + zs*cz) + c1o16*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + c1o64*(xs*ys*zs*cxyz);
 
    real mfcbb = c0o1;
    real mfabb = c0o1;
@@ -812,108 +812,108 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    f[DIR_MMM]  = mfaaa;
 }
 //////////////////////////////////////////////////////////////////////////
-//Position SWB -0.25, -0.25, -0.25
+//Position SWB -c1o4, -c1o4, -c1o4
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressBSW()
 {
-   return   press_SWT * (0.140625 + 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NET * (0.015625 - 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.421875 + 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+   return   press_SWT * (c9o64 + c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NET * (c1o64 - c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c27o64 + c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWT -0.25, -0.25, 0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressTSW()
 {
-   return   press_SWT * (0.421875 + 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.015625 - 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+   return   press_SWT * (c27o64 + c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c1o64 - c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SET 0.25, -0.25, 0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressTSE()
 {
-   return   press_SET * (0.421875 - 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.015625 + 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+   return   press_SET * (c27o64 - c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c1o64 + c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SEB 0.25, -0.25, -0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressBSE()
 {
-   return   press_SET * (0.140625 - 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.015625 + 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.421875 - 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+   return   press_SET * (c9o64 - c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c1o64 + c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c27o64 - c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWB -0.25, 0.25, -0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressBNW()
 {
-   return   press_NWT * (0.140625 + 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.015625 - 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.421875 + 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+   return   press_NWT * (c9o64 + c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c1o64 - c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c27o64 + c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWT -0.25, 0.25, 0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressTNW()
 {
-   return   press_NWT * (0.421875 + 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.015625 - 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+   return   press_NWT * (c27o64 + c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c1o64 - c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NET 0.25, 0.25, 0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressTNE()
 {
-   return   press_NET * (0.421875 - 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.015625 + 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+   return   press_NET * (c27o64 - c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c1o64 + c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NEB 0.25, 0.25, -0.25
 real CompressibleOffsetSquarePressureInterpolationProcessor::calcPressBNE()
 {
-   return   press_NET * (0.140625 - 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.015625 + 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.421875 - 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+   return   press_NET * (c9o64 - c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c1o64 + c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c27o64 - c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position C 0.0, 0.0, 0.0
@@ -922,14 +922,14 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
 
-   real press  =  press_NET * (0.125 - 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_NWT * (0.125 + 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_SET * (0.125 - 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_SWT * (0.125 + 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_NEB * (0.125 - 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_NWB * (0.125 + 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_SEB * (0.125 - 0.25 * xoff + 0.25 * yoff + 0.25 * zoff) +
-      press_SWB * (0.125 + 0.25 * xoff + 0.25 * yoff + 0.25 * zoff);
+   real press  =  press_NET * (c1o8 - c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_NWT * (c1o8 + c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_SET * (c1o8 - c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_SWT * (c1o8 + c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_NEB * (c1o8 - c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_NWB * (c1o8 + c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_SEB * (c1o8 - c1o4 * xoff + c1o4 * yoff + c1o4 * zoff) +
+      press_SWB * (c1o8 + c1o4 * xoff + c1o4 * yoff + c1o4 * zoff);
    real vx1  = a0;
    real vx2  = b0;
    real vx3  = c0;
@@ -937,11 +937,11 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    
    real rho = press ;//+ (ax+by+cz)/3.;
 
-   real laplaceRho = (xoff!=0.0 || yoff!=0.0 || zoff!= 0.0) ? 0.0 :(-3.0*(by*by+ax*ax+cz*cz)-6.0*(ay*bx+bz*cy+az*cx))*(1.0+rho);
+   real laplaceRho = (xoff!=c0o1 || yoff!=c0o1 || zoff!= c0o1) ? c0o1 :(-c3o1*(by*by+ax*ax+cz*cz)-c6o1*(ay*bx+bz*cy+az*cx))*(c1o1+rho);
 
-   rho=rho-laplaceRho*0.25;
+   rho=rho-laplaceRho*c1o4;
 
-   real eps_new = 2.0;
+   real eps_new = c2o1;
    real o  = omega;
    //bulk viscosity
    real oP = OxxPyyPzzC;
@@ -1008,7 +1008,7 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    real mxxyMyzz = c0o1;
    real mxxzPyyz = c0o1;
    real mxxzMyyz = c0o1;
-   real mxyyPxzz =  c0o1;
+   real mxyyPxzz = c0o1;
    real mxyyMxzz = c0o1;
 
    // linear combinations back
@@ -1275,12 +1275,12 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedVel
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedShearStress(real x, real y, real z,real& tauxx, real& tauyy, real& tauzz,real& tauxy, real& tauxz, real& tauyz)
 {
-	tauxx=ax+2*axx*x+axy*y+axz*z+axyz*y*z;
-	tauyy=by+2*byy*y+bxy*x+byz*z+bxyz*x*z;
-	tauzz=cz+2*czz*z+cxz*x+cyz*y+cxyz*x*y;
-	tauxy=0.5*((ay+2.0*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+2.0*bxx*x+bxy*y+bxz*z+bxyz*y*z));
-	tauxz=0.5*((az+2.0*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+2.0*cxx*x+cxy*y+cxz*z+cxyz*y*z));
-	tauyz=0.5*((bz+2.0*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+2.0*cyy*y+cxy*x+cyz*z+cxyz*x*z));
+	tauxx=ax+c2o1*axx*x+axy*y+axz*z+axyz*y*z;
+	tauyy=by+c2o1*byy*y+bxy*x+byz*z+bxyz*x*z;
+	tauzz=cz+c2o1*czz*z+cxz*x+cyz*y+cxyz*x*y;
+	tauxy=c1o2*((ay+c2o1*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+c2o1*bxx*x+bxy*y+bxz*z+bxyz*y*z));
+	tauxz=c1o2*((az+c2o1*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+c2o1*cxx*x+cxy*y+cxz*z+cxyz*y*z));
+	tauyz=c1o2*((bz+c2o1*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+c2o1*cyy*y+cxy*x+cyz*z+cxyz*x*z));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::setBulkOmegaToOmega(bool value)
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp
index e9c7007a90063c0f65a6c69053441ae8581866a6..5ffc4ca1397100854e7c0c4b6902f87be3765618 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp
@@ -63,7 +63,7 @@ SPtr<LBMKernel> CumulantK17LBMKernel::clone()
     kernel->setNX(nx);
     std::dynamic_pointer_cast<CumulantK17LBMKernel>(kernel)->initDataSet();
     kernel->setCollisionFactor(this->collFactor);
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -104,7 +104,7 @@ void CumulantK17LBMKernel::calculate(int step)
         muForcingX2.DefineVar("dt", &muDeltaT);
         muForcingX3.DefineVar("dt", &muDeltaT);
 
-        muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+        muNu = (c1o1 / c3o1) * (c1o1 / collFactor - c1o1 / c2o1);
 
         muForcingX1.DefineVar("nu", &muNu);
         muForcingX2.DefineVar("nu", &muNu);
@@ -116,7 +116,7 @@ void CumulantK17LBMKernel::calculate(int step)
     nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
     restDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h
index 345f12fd81f708f13371bffc77a4690dae37d085..39dd0a2c75d39d27bda587f8810cb76691fea99d 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h
@@ -35,7 +35,7 @@
 #define CumulantK17LBMKernel_h__
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
index 2d39205c544e430aac8c0a4181d2c8e3b4791e7a..1b8bdd340ff20facf0d91cbb3ff424357508446f 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
@@ -67,7 +67,7 @@ SPtr<LBMKernel> CumulantK17LBMKernelUnified::clone()
     kernel->setNX(nx);
     std::dynamic_pointer_cast<CumulantK17LBMKernelUnified>(kernel)->initDataSet();
     kernel->setCollisionFactor(this->collFactor);
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -108,7 +108,7 @@ void CumulantK17LBMKernelUnified::calculate(int step)
         muForcingX2.DefineVar("dt", &muDeltaT);
         muForcingX3.DefineVar("dt", &muDeltaT);
 
-        muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+        muNu = (c1o1 / c3o1) * (c1o1 / collFactor - c1o1 / c2o1);
 
         muForcingX1.DefineVar("nu", &muNu);
         muForcingX2.DefineVar("nu", &muNu);
@@ -120,7 +120,7 @@ void CumulantK17LBMKernelUnified::calculate(int step)
     nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
     restDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
     const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -201,7 +201,7 @@ void CumulantK17LBMKernelUnified::calculate(int step)
                     real mfbbb = (*this->restDistributions)(x1, x2, x3);
 
                     
-                    real forces[3] = {0., 0., 0.};
+                    real forces[3] = { c0o1, c0o1, c0o1 };
                     if (withForcing)
                     {
                         muX1 = static_cast<real>(x1 - 1 + ix1 * maxX1);
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h
index d13e82efce5f5bc9211476ea86d989fe8663ab8c..9c6876f4d4de855f931ea90e8764cb1e9a39202a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h
@@ -35,7 +35,7 @@
 #define CumulantK17LBMKernelUnified_h__
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp
index 375f5c406c179e1e17316e7ff7faa896a5f06b2d..b30884d386279bf2d8243fe68338c7a45cac8073 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp
@@ -16,9 +16,9 @@ CumulantLBMKernel::CumulantLBMKernel()
 {
    this->compressible = true;
    this->parameter = CumulantLBMKernel::NORMAL;
-   this->OxyyMxzz = 1.0;
+   this->OxyyMxzz = c1o1;
    this->bulkOmegaToOmega = false;
-   this->OxxPyyPzz = 1.0;
+   this->OxxPyyPzz = c1o1;
 }
 //////////////////////////////////////////////////////////////////////////
 void CumulantLBMKernel::initDataSet()
@@ -33,7 +33,7 @@ SPtr<LBMKernel> CumulantLBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<CumulantLBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -45,10 +45,10 @@ SPtr<LBMKernel> CumulantLBMKernel::clone()
    switch (parameter)
    {
    case NORMAL:
-      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = 1.0;
+      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = c1o1;
       break;
    case MAGIC:
-      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactor);
+      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = c2o1 + (-collFactor);
       break;
    }
 
@@ -99,7 +99,7 @@ SPtr<LBMKernel> CumulantLBMKernel::clone()
 //   nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
 //   zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 //
-//   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+//   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 //
 //   const int bcArrayMaxX1 = (int)bcArray->getNX1();
 //   const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -1060,7 +1060,7 @@ void CumulantLBMKernel::initData()
       muForcingX2.DefineVar("dt", &muDeltaT);
       muForcingX3.DefineVar("dt", &muDeltaT);
 
-      muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+      muNu = (c1o1 / c3o1) * (c1o1 / collFactor - c1o1 / c2o1);
 
       muForcingX1.DefineVar("nu", &muNu);
       muForcingX2.DefineVar("nu", &muNu);
@@ -1158,9 +1158,9 @@ void CumulantLBMKernel::nodeCollision(int step, int x1, int x2, int x3)
       forcingX2 = muForcingX2.Eval();
       forcingX3 = muForcingX3.Eval();
 
-      vvx += forcingX1 * deltaT * 0.5; // X
-      vvy += forcingX2 * deltaT * 0.5; // Y
-      vvz += forcingX3 * deltaT * 0.5; // Z
+      vvx += forcingX1 * deltaT * c1o2; // X
+      vvy += forcingX2 * deltaT * c1o2; // Y
+      vvz += forcingX3 * deltaT * c1o2; // Z
    }
    ///////////////////////////////////////////////////////////////////////////////////////////               
 ////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h
index 9fb6d834fc8904af84e20798b03ea23b68ad63a4..3ba644ccccd6d2fef780f8175b8140e9053d77e6 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h
@@ -2,7 +2,7 @@
 #define CumulantLBMKernel_h__
 
 #include "BasicLBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h
index ab047a86081f9afc1a099eea0087f2728bfa519d..490aafc1c54d806a997021415004eec9c4579168 100644
--- a/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h
@@ -38,7 +38,7 @@
 
 #include "LBMSystem.h"
 
-class BCProcessor;
+class BCSet;
 class DataSet3D;
 
 //! Abstract class provides interface for LBM kernel
@@ -52,8 +52,8 @@ public:
     virtual void swapDistributions()    = 0;
 
     virtual bool getCompressible() const                                             = 0;
-    virtual SPtr<BCProcessor> getBCProcessor() const                                 = 0;
-    virtual void setBCProcessor(SPtr<BCProcessor> bcProcessor)                       = 0;
+    virtual SPtr<BCSet> getBCSet() const                                 = 0;
+    virtual void setBCSet(SPtr<BCSet> BCSet)                       = 0;
     virtual SPtr<DataSet3D> getDataSet() const                                       = 0;
     virtual real getCollisionFactor() const                                        = 0;
     virtual void setCollisionFactor(real collFactor)                               = 0;
diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.cpp
index 782d5c96856b1c623d17a453f9552d10ab0a04ad..23ea001f3d754f274d103b8c4f13458506705654 100644
--- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.cpp
@@ -15,7 +15,7 @@ using namespace vf::lbm::constant;
 IncompressibleCumulantLBMKernel::IncompressibleCumulantLBMKernel()
 {
    this->parameter = NORMAL;
-   this->OxyyMxzz = 1.0;
+   this->OxyyMxzz = c1o1;
    this->compressible = false;
 }
 //////////////////////////////////////////////////////////////////////////
@@ -34,7 +34,7 @@ SPtr<LBMKernel> IncompressibleCumulantLBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<IncompressibleCumulantLBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -46,10 +46,10 @@ SPtr<LBMKernel> IncompressibleCumulantLBMKernel::clone()
    switch (parameter)
    {
    case NORMAL:
-      dynamicPointerCast<IncompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = 1.0;
+      dynamicPointerCast<IncompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = c1o1;
       break;
    case MAGIC:
-      dynamicPointerCast<IncompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = 2.0 +(-collFactor);
+      dynamicPointerCast<IncompressibleCumulantLBMKernel>(kernel)->OxyyMxzz = c2o1 +(-collFactor);
       break;
    }
    return kernel;
@@ -75,7 +75,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
       muForcingX2.DefineVar("dt", &muDeltaT);
       muForcingX3.DefineVar("dt", &muDeltaT);
 
-      muNu = (1.0/3.0)*(1.0/collFactor - 1.0/2.0);
+      muNu = (c1o1/c3o1)*(c1o1/collFactor - c1o1/c2o1);
 
       muForcingX1.DefineVar("nu", &muNu);
       muForcingX2.DefineVar("nu", &muNu);
@@ -91,7 +91,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
    const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -194,9 +194,9 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                   forcingX2 = muForcingX2.Eval();
                   forcingX3 = muForcingX3.Eval();
 
-                  vvx += forcingX1*deltaT*0.5; // X
-                  vvy += forcingX2*deltaT*0.5; // Y
-                  vvz += forcingX3*deltaT*0.5; // Z
+                  vvx += forcingX1*deltaT*c1o2; // X
+                  vvy += forcingX2*deltaT*c1o2; // Y
+                  vvz += forcingX3*deltaT*c1o2; // Z
                }
                ///////////////////////////////////////////////////////////////////////////////////////////               
                real oMdrho;
@@ -225,7 +225,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                m2=mfbba+mfbbc;
                m0+=m1+m2;
                m0+=mfbbb; //hat gefehlt
-               oMdrho = 1. - (oMdrho + m0);
+               oMdrho = c1o1 - (oMdrho + m0);
 
                real vx2;
                real vy2;
@@ -235,7 +235,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                vz2=vvz*vvz;
                ////////////////////////////////////////////////////////////////////////////////////
                real wadjust;
-               real qudricLimit = 0.01;
+               real qudricLimit = c1o100;
                ////////////////////////////////////////////////////////////////////////////////////
                //Hin
                ////////////////////////////////////////////////////////////////////////////////////
@@ -248,7 +248,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaaa = m0;
                m0   += c1o36 * oMdrho;
                mfaab = m1 -        m0 * vvz;
-               mfaac = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfaac = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaba  + mfabc;
                m1    = mfabc  - mfaba;
@@ -256,7 +256,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaba = m0;
                m0   += c1o9 * oMdrho;
                mfabb = m1 -        m0 * vvz;
-               mfabc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfabc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaca  + mfacc;
                m1    = mfacc  - mfaca;
@@ -264,7 +264,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaca = m0;
                m0   += c1o36 * oMdrho;
                mfacb = m1 -        m0 * vvz;
-               mfacc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfacc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbaa + mfbac;
@@ -273,7 +273,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfbaa = m0;
                m0   += c1o9 * oMdrho;
                mfbab = m1 -        m0 * vvz;
-               mfbac = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfbac = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbba  + mfbbc;
                m1    = mfbbc  - mfbba;
@@ -281,7 +281,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfbba = m0;
                m0   += c4o9 * oMdrho;
                mfbbb = m1 -        m0 * vvz;
-               mfbbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfbbc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbca  + mfbcc;
                m1    = mfbcc  - mfbca;
@@ -289,7 +289,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfbca = m0;
                m0   += c1o9 * oMdrho;
                mfbcb = m1 -        m0 * vvz;
-               mfbcc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfbcc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcaa + mfcac;
@@ -298,7 +298,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfcaa = m0;
                m0   += c1o36 * oMdrho;
                mfcab = m1 -        m0 * vvz;
-               mfcac = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfcac = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcba  + mfcbc;
                m1    = mfcbc  - mfcba;
@@ -306,7 +306,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfcba = m0;
                m0   += c1o9 * oMdrho;
                mfcbb = m1 -        m0 * vvz;
-               mfcbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfcbc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcca  + mfccc;
                m1    = mfccc  - mfcca;
@@ -314,7 +314,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfcca = m0;
                m0   += c1o36 * oMdrho;
                mfccb = m1 -        m0 * vvz;
-               mfccc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfccc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
@@ -326,14 +326,14 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaaa = m0;
                m0   += c1o6 * oMdrho;
                mfaba = m1 -        m0 * vvy;
-               mfaca = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfaca = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaab  + mfacb;
                m1    = mfacb  - mfaab;
                m0    = m2          + mfabb;
                mfaab = m0;
                mfabb = m1 -        m0 * vvy;
-               mfacb = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfacb = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaac  + mfacc;
                m1    = mfacc  - mfaac;
@@ -341,7 +341,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaac = m0;
                m0   += c1o18 * oMdrho;
                mfabc = m1 -        m0 * vvy;
-               mfacc = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfacc = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbaa + mfbca;
@@ -350,14 +350,14 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfbaa = m0;
                m0   += c2o3 * oMdrho;
                mfbba = m1 -        m0 * vvy;
-               mfbca = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfbca = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbab  + mfbcb;
                m1    = mfbcb  - mfbab;
                m0    = m2          + mfbbb;
                mfbab = m0;
                mfbbb = m1 -        m0 * vvy;
-               mfbcb = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfbcb = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbac  + mfbcc;
                m1    = mfbcc  - mfbac;
@@ -365,7 +365,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfbac = m0;
                m0   += c2o9 * oMdrho;
                mfbbc = m1 -        m0 * vvy;
-               mfbcc = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfbcc = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcaa + mfcca;
@@ -374,14 +374,14 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfcaa = m0;
                m0   += c1o6 * oMdrho;
                mfcba = m1 -        m0 * vvy;
-               mfcca = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfcca = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcab  + mfccb;
                m1    = mfccb  - mfcab;
                m0    = m2          + mfcbb;
                mfcab = m0;
                mfcbb = m1 -        m0 * vvy;
-               mfccb = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfccb = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcac  + mfccc;
                m1    = mfccc  - mfcac;
@@ -389,7 +389,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfcac = m0;
                m0   += c1o18 * oMdrho;
                mfcbc = m1 -        m0 * vvy;
-               mfccc = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfccc = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
@@ -399,16 +399,16 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                m1    = mfcaa - mfaaa;
                m0    = m2          + mfbaa;
                mfaaa = m0;
-               m0   += 1. * oMdrho;
+               m0   += c1o1 * oMdrho;
                mfbaa = m1 -        m0 * vvx;
-               mfcaa = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcaa = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaba  + mfcba;
                m1    = mfcba  - mfaba;
                m0    = m2          + mfbba;
                mfaba = m0;
                mfbba = m1 -        m0 * vvx;
-               mfcba = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcba = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaca  + mfcca;
                m1    = mfcca  - mfaca;
@@ -416,7 +416,7 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaca = m0;
                m0   += c1o3 * oMdrho;
                mfbca = m1 -        m0 * vvx;
-               mfcca = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcca = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaab + mfcab;
@@ -424,21 +424,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                m0    = m2          + mfbab;
                mfaab = m0;
                mfbab = m1 -        m0 * vvx;
-               mfcab = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcab = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfabb  + mfcbb;
                m1    = mfcbb  - mfabb;
                m0    = m2          + mfbbb;
                mfabb = m0;
                mfbbb = m1 -        m0 * vvx;
-               mfcbb = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcbb = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfacb  + mfccb;
                m1    = mfccb  - mfacb;
                m0    = m2          + mfbcb;
                mfacb = m0;
                mfbcb = m1 -        m0 * vvx;
-               mfccb = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfccb = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaac + mfcac;
@@ -447,14 +447,14 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfaac = m0;
                m0   += c1o3 * oMdrho;
                mfbac = m1 -        m0 * vvx;
-               mfcac = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcac = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfabc  + mfcbc;
                m1    = mfcbc  - mfabc;
                m0    = m2          + mfbbc;
                mfabc = m0;
                mfbbc = m1 -        m0 * vvx;
-               mfcbc = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcbc = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfacc  + mfccc;
                m1    = mfccc  - mfacc;
@@ -462,46 +462,46 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                mfacc = m0;
                m0   += c1o9 * oMdrho;
                mfbcc = m1 -        m0 * vvx;
-               mfccc = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfccc = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                // Cumulants
                ////////////////////////////////////////////////////////////////////////////////////
-               real OxxPyyPzz = 1.; //omega2 or bulk viscosity
-               real OxyyPxzz  = 1.;//-s9;//2+s9;//
-               //real OxyyMxzz  = 1.;//2+s9;//
-               real O4        = 1.;
-               real O5        = 1.;
-               real O6        = 1.;
+               real OxxPyyPzz = c1o1; //omega2 or bulk viscosity
+               real OxyyPxzz  = c1o1;//-s9;//2+s9;//
+               //real OxyyMxzz  = c1o1;//2+s9;//
+               real O4        = c1o1;
+               real O5        = c1o1;
+               real O6        = c1o1;
 
                //Cum 4.
                //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
                //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
                //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
 
-               real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
-               real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
-               real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+               real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab);
+               real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb);
+               real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb);
 
-               real CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1.)*oMdrho);
-               real CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1.)*oMdrho);
-               real CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1.)*oMdrho);
+               real CUMcca = mfcca - ((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-c1o1)*oMdrho);
+               real CUMcac = mfcac - ((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-c1o1)*oMdrho);
+               real CUMacc = mfacc - ((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-c1o1)*oMdrho);
 
                //Cum 5.
-               real CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
-               real CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
-               real CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+               real CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+               real CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+               real CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
 
                //Cum 6.
-               real CUMccc = mfccc  +((-4. *  mfbbb * mfbbb
+               real CUMccc = mfccc  +((-c4o1 *  mfbbb * mfbbb
                   -       (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-                  -  4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-                  -  2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
-                  +(4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-                     +  2. * (mfcaa * mfaca * mfaac)
-                     + 16. *  mfbba * mfbab * mfabb)
+                  -  c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                  -  c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+                  +(c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                     +  c2o1 * (mfcaa * mfaca * mfaac)
+                     + c16o1 *  mfbba * mfbab * mfabb)
                   - c1o3* (mfacc + mfcac + mfcca) * oMdrho  -c1o9*oMdrho*oMdrho
-                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1.-2.* oMdrho)- c1o27* oMdrho * oMdrho*(-2.* oMdrho)
-                  +(2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(c1o1-c2o1* oMdrho)- c1o27* oMdrho * oMdrho*(-c2o1* oMdrho)
+                  +(c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
                      +       (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) +c1o27*oMdrho;
 
                //2.
@@ -515,9 +515,9 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                real dzuz = dxux + collFactor * c3o2 * mxxMzz;
 
                //relax
-               mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
-               mxxMyy    += collFactor * (-mxxMyy) - 3. * (1. - c1o2 * collFactor) * (vx2 * dxux - vy2 * dyuy);
-               mxxMzz    += collFactor * (-mxxMzz) - 3. * (1. - c1o2 * collFactor) * (vx2 * dxux - vz2 * dzuz);
+               mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+               mxxMyy    += collFactor * (-mxxMyy) - c3o1 * (c1o1 - c1o2 * collFactor) * (vx2 * dxux - vy2 * dyuy);
+               mxxMzz    += collFactor * (-mxxMzz) - c3o1 * (c1o1 - c1o2 * collFactor) * (vx2 * dxux - vz2 * dzuz);
 
                mfabb     += collFactor * (-mfabb);
                mfbab     += collFactor * (-mfbab);
@@ -525,8 +525,8 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
 
                // linear combinations back
                mfcaa = c1o3 * (mxxMyy +      mxxMzz + mxxPyyPzz);
-               mfaca = c1o3 * (-2. *  mxxMyy +      mxxMzz + mxxPyyPzz);
-               mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+               mfaca = c1o3 * (-c2o1 *  mxxMyy +      mxxMzz + mxxPyyPzz);
+               mfaac = c1o3 * (mxxMyy - c2o1 * mxxMzz + mxxPyyPzz);
 
                //3.
                // linear combinations
@@ -540,19 +540,19 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                real mxyyMxzz = mfbca - mfbac;
 
                //relax
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimit);
                mfbbb     += wadjust * (-mfbbb);
-               wadjust    = OxyyPxzz+(1.-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimit);
+               wadjust    = OxyyPxzz+(c1o1-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimit);
                mxxyPyzz  += wadjust * (-mxxyPyzz);
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimit);
                mxxyMyzz  += wadjust * (-mxxyMyzz);
-               wadjust    = OxyyPxzz+(1.-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimit);
+               wadjust    = OxyyPxzz+(c1o1-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimit);
                mxxzPyyz  += wadjust * (-mxxzPyyz);
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimit);
                mxxzMyyz  += wadjust * (-mxxzMyyz);
-               wadjust    = OxyyPxzz+(1.-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimit);
+               wadjust    = OxyyPxzz+(c1o1-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimit);
                mxyyPxzz  += wadjust * (-mxyyPxzz);
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimit);
                mxyyMxzz  += wadjust * (-mxyyMxzz);
 
                // linear combinations back
@@ -586,30 +586,30 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
                //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
 
-               mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
-               mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
-               mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+               mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab);
+               mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb);
+               mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb);
 
-               mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
-               mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
-               mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               mfcca = CUMcca + (mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               mfcac = CUMcac + (mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               mfacc = CUMacc + (mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
 
                //5.
-               mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
-               mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
-               mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+               mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+               mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+               mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
 
                //6.
-               mfccc = CUMccc  -((-4. *  mfbbb * mfbbb
+               mfccc = CUMccc  -((-c4o1 *  mfbbb * mfbbb
                   -       (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-                  -  4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
-                  -  2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
-                  +(4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-                     +  2. * (mfcaa * mfaca * mfaac)
-                     + 16. *  mfbba * mfbab * mfabb)
+                  -  c4o1 * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+                  -  c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+                  +(c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                     +  c2o1 * (mfcaa * mfaca * mfaac)
+                     + c16o1 *  mfbba * mfbab * mfabb)
                   - c1o3* (mfacc + mfcac + mfcca) * oMdrho  -c1o9*oMdrho*oMdrho
-                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1.-2.* oMdrho)- c1o27* oMdrho * oMdrho*(-2.* oMdrho)
-                  +(2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(c1o1-c2o1* oMdrho)- c1o27* oMdrho * oMdrho*(-c2o1* oMdrho)
+                  +(c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
                      +       (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) -c1o27*oMdrho;
 
                ////////////////////////////////////////////////////////////////////////////////////
@@ -625,22 +625,22 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
                ////////////////////////////////////////////////////////////////////////////////////
                // Z - Dir
-               m0 =  mfaac * c1o2 +      mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
-               m1 = -mfaac        - 2. * mfaab *  vvz         +  mfaaa                * (1. - vz2)              - 1. * oMdrho * vz2;
-               m2 =  mfaac * c1o2 +      mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+               m0 =  mfaac * c1o2 +      mfaab * (vvz - c1o2) + (mfaaa + c1o1 * oMdrho) * (vz2 - vvz) * c1o2;
+               m1 = -mfaac        - c2o1 * mfaab *  vvz         +  mfaaa                * (c1o1 - vz2)              - c1o1 * oMdrho * vz2;
+               m2 =  mfaac * c1o2 +      mfaab * (vvz + c1o2) + (mfaaa + c1o1 * oMdrho) * (vz2 + vvz) * c1o2;
                mfaaa = m0;
                mfaab = m1;
                mfaac = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfabc * c1o2 +      mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
-               m1 = -mfabc        - 2. * mfabb *  vvz         + mfaba * (1. - vz2);
+               m1 = -mfabc        - c2o1 * mfabb *  vvz         + mfaba * (c1o1 - vz2);
                m2 =  mfabc * c1o2 +      mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
                mfaba = m0;
                mfabb = m1;
                mfabc = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfacc * c1o2 +      mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
-               m1 = -mfacc        - 2. * mfacb *  vvz         +  mfaca                  * (1. - vz2)              - c1o3 * oMdrho * vz2;
+               m1 = -mfacc        - c2o1 * mfacb *  vvz         +  mfaca                  * (c1o1 - vz2)              - c1o3 * oMdrho * vz2;
                m2 =  mfacc * c1o2 +      mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
                mfaca = m0;
                mfacb = m1;
@@ -648,21 +648,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfbac * c1o2 +      mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
-               m1 = -mfbac        - 2. * mfbab *  vvz         + mfbaa * (1. - vz2);
+               m1 = -mfbac        - c2o1 * mfbab *  vvz         + mfbaa * (c1o1 - vz2);
                m2 =  mfbac * c1o2 +      mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
                mfbaa = m0;
                mfbab = m1;
                mfbac = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbbc * c1o2 +      mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
-               m1 = -mfbbc        - 2. * mfbbb *  vvz         + mfbba * (1. - vz2);
+               m1 = -mfbbc        - c2o1 * mfbbb *  vvz         + mfbba * (c1o1 - vz2);
                m2 =  mfbbc * c1o2 +      mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
                mfbba = m0;
                mfbbb = m1;
                mfbbc = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbcc * c1o2 +      mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
-               m1 = -mfbcc        - 2. * mfbcb *  vvz         + mfbca * (1. - vz2);
+               m1 = -mfbcc        - c2o1 * mfbcb *  vvz         + mfbca * (c1o1 - vz2);
                m2 =  mfbcc * c1o2 +      mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
                mfbca = m0;
                mfbcb = m1;
@@ -670,21 +670,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcac * c1o2 +      mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
-               m1 = -mfcac        - 2. * mfcab *  vvz         +  mfcaa                  * (1. - vz2)              - c1o3 * oMdrho * vz2;
+               m1 = -mfcac        - c2o1 * mfcab *  vvz         +  mfcaa                  * (c1o1 - vz2)              - c1o3 * oMdrho * vz2;
                m2 =  mfcac * c1o2 +      mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
                mfcaa = m0;
                mfcab = m1;
                mfcac = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfcbc * c1o2 +      mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
-               m1 = -mfcbc        - 2. * mfcbb *  vvz         + mfcba * (1. - vz2);
+               m1 = -mfcbc        - c2o1 * mfcbb *  vvz         + mfcba * (c1o1 - vz2);
                m2 =  mfcbc * c1o2 +      mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
                mfcba = m0;
                mfcbb = m1;
                mfcbc = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfccc * c1o2 +      mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
-               m1 = -mfccc        - 2. * mfccb *  vvz         +  mfcca                  * (1. - vz2)              - c1o9 * oMdrho * vz2;
+               m1 = -mfccc        - c2o1 * mfccb *  vvz         +  mfcca                  * (c1o1 - vz2)              - c1o9 * oMdrho * vz2;
                m2 =  mfccc * c1o2 +      mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
                mfcca = m0;
                mfccb = m1;
@@ -695,21 +695,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                // Y - Dir
                m0 =  mfaca * c1o2 +      mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
-               m1 = -mfaca        - 2. * mfaba *  vvy         +  mfaaa                  * (1. - vy2)              - c1o6 * oMdrho * vy2;
+               m1 = -mfaca        - c2o1 * mfaba *  vvy         +  mfaaa                  * (c1o1 - vy2)              - c1o6 * oMdrho * vy2;
                m2 =  mfaca * c1o2 +      mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
                mfaaa = m0;
                mfaba = m1;
                mfaca = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfacb * c1o2 +      mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
-               m1 = -mfacb        - 2. * mfabb *  vvy         +  mfaab                  * (1. - vy2)              - c2o3 * oMdrho * vy2;
+               m1 = -mfacb        - c2o1 * mfabb *  vvy         +  mfaab                  * (c1o1 - vy2)              - c2o3 * oMdrho * vy2;
                m2 =  mfacb * c1o2 +      mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
                mfaab = m0;
                mfabb = m1;
                mfacb = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfacc * c1o2 +      mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
-               m1 = -mfacc        - 2. * mfabc *  vvy         +  mfaac                  * (1. - vy2)              - c1o6 * oMdrho * vy2;
+               m1 = -mfacc        - c2o1 * mfabc *  vvy         +  mfaac                  * (c1o1 - vy2)              - c1o6 * oMdrho * vy2;
                m2 =  mfacc * c1o2 +      mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
                mfaac = m0;
                mfabc = m1;
@@ -717,21 +717,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfbca * c1o2 +      mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
-               m1 = -mfbca        - 2. * mfbba *  vvy         + mfbaa * (1. - vy2);
+               m1 = -mfbca        - c2o1 * mfbba *  vvy         + mfbaa * (c1o1 - vy2);
                m2 =  mfbca * c1o2 +      mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
                mfbaa = m0;
                mfbba = m1;
                mfbca = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbcb * c1o2 +      mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
-               m1 = -mfbcb        - 2. * mfbbb *  vvy         + mfbab * (1. - vy2);
+               m1 = -mfbcb        - c2o1 * mfbbb *  vvy         + mfbab * (c1o1 - vy2);
                m2 =  mfbcb * c1o2 +      mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
                mfbab = m0;
                mfbbb = m1;
                mfbcb = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbcc * c1o2 +      mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
-               m1 = -mfbcc        - 2. * mfbbc *  vvy         + mfbac * (1. - vy2);
+               m1 = -mfbcc        - c2o1 * mfbbc *  vvy         + mfbac * (c1o1 - vy2);
                m2 =  mfbcc * c1o2 +      mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
                mfbac = m0;
                mfbbc = m1;
@@ -739,21 +739,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcca * c1o2 +      mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
-               m1 = -mfcca        - 2. * mfcba *  vvy         +  mfcaa                   * (1. - vy2)              - c1o18 * oMdrho * vy2;
+               m1 = -mfcca        - c2o1 * mfcba *  vvy         +  mfcaa                   * (c1o1 - vy2)              - c1o18 * oMdrho * vy2;
                m2 =  mfcca * c1o2 +      mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
                mfcaa = m0;
                mfcba = m1;
                mfcca = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfccb * c1o2 +      mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
-               m1 = -mfccb        - 2. * mfcbb *  vvy         +  mfcab                  * (1. - vy2)              - c2o9 * oMdrho * vy2;
+               m1 = -mfccb        - c2o1 * mfcbb *  vvy         +  mfcab                  * (c1o1 - vy2)              - c2o9 * oMdrho * vy2;
                m2 =  mfccb * c1o2 +      mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
                mfcab = m0;
                mfcbb = m1;
                mfccb = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfccc * c1o2 +      mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
-               m1 = -mfccc        - 2. * mfcbc *  vvy         +  mfcac                   * (1. - vy2)              - c1o18 * oMdrho * vy2;
+               m1 = -mfccc        - c2o1 * mfcbc *  vvy         +  mfcac                   * (c1o1 - vy2)              - c1o18 * oMdrho * vy2;
                m2 =  mfccc * c1o2 +      mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
                mfcac = m0;
                mfcbc = m1;
@@ -764,21 +764,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                // X - Dir
                m0 =  mfcaa * c1o2 +      mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcaa        - 2. * mfbaa *  vvx         +  mfaaa                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfcaa        - c2o1 * mfbaa *  vvx         +  mfaaa                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfcaa * c1o2 +      mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
                mfaaa = m0;
                mfbaa = m1;
                mfcaa = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcba * c1o2 +      mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcba        - 2. * mfbba *  vvx         +  mfaba                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfcba        - c2o1 * mfbba *  vvx         +  mfaba                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfcba * c1o2 +      mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
                mfaba = m0;
                mfbba = m1;
                mfcba = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcca * c1o2 +      mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcca        - 2. * mfbca *  vvx         +  mfaca                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfcca        - c2o1 * mfbca *  vvx         +  mfaca                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfcca * c1o2 +      mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
                mfaca = m0;
                mfbca = m1;
@@ -786,21 +786,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcab * c1o2 +      mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcab        - 2. * mfbab *  vvx         +  mfaab                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfcab        - c2o1 * mfbab *  vvx         +  mfaab                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfcab * c1o2 +      mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
                mfaab = m0;
                mfbab = m1;
                mfcab = m2;
                ///////////b////////////////////////////////////////////////////////////////////////
                m0 =  mfcbb * c1o2 +      mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcbb        - 2. * mfbbb *  vvx         +  mfabb                  * (1. - vx2)              - c4o9 * oMdrho * vx2;
+               m1 = -mfcbb        - c2o1 * mfbbb *  vvx         +  mfabb                  * (c1o1 - vx2)              - c4o9 * oMdrho * vx2;
                m2 =  mfcbb * c1o2 +      mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
                mfabb = m0;
                mfbbb = m1;
                mfcbb = m2;
                ///////////b////////////////////////////////////////////////////////////////////////
                m0 =  mfccb * c1o2 +      mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfccb        - 2. * mfbcb *  vvx         +  mfacb                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfccb        - c2o1 * mfbcb *  vvx         +  mfacb                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfccb * c1o2 +      mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
                mfacb = m0;
                mfbcb = m1;
@@ -808,21 +808,21 @@ void IncompressibleCumulantLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcac * c1o2 +      mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcac        - 2. * mfbac *  vvx         +  mfaac                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfcac        - c2o1 * mfbac *  vvx         +  mfaac                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfcac * c1o2 +      mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
                mfaac = m0;
                mfbac = m1;
                mfcac = m2;
                ///////////c////////////////////////////////////////////////////////////////////////
                m0 =  mfcbc * c1o2 +      mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfcbc        - 2. * mfbbc *  vvx         +  mfabc                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfcbc        - c2o1 * mfbbc *  vvx         +  mfabc                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfcbc * c1o2 +      mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
                mfabc = m0;
                mfbbc = m1;
                mfcbc = m2;
                ///////////c////////////////////////////////////////////////////////////////////////
                m0 =  mfccc * c1o2 +      mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-               m1 = -mfccc        - 2. * mfbcc *  vvx         +  mfacc                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfccc        - c2o1 * mfbcc *  vvx         +  mfacc                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfccc * c1o2 +      mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
                mfacc = m0;
                mfbcc = m1;
diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.h
index 5abe9afc29caf6fe178d6b0e7c3b44e373c6defb..99e64ce0cac5a0a1e53a40f1eb4a4ab36cfa2f81 100644
--- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantLBMKernel.h
@@ -4,7 +4,7 @@
 #define IncompressibleCumulantLBMKernel_H
 
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "basics/utilities/UbTiming.h"
 #include "basics/container/CbArray4D.h"
diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp
index ed77717f6573932d8a247863dc69bfafc462b555..ec4d2a5a89ea066c7aa89d8632fb305f7dcdc10e 100644
--- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp
@@ -47,7 +47,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::initRelaxFactor(int vdir, r
 
    real spongeFactor;
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
    const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -74,38 +74,38 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::initRelaxFactor(int vdir, r
             case DIR_P00:
                muX1 = (real)(x1 + ix1 * maxX1);
                if (muX1 >= (sizeX - sizeSP) / deltaT)
-                  spongeFactor = (sizeX - (muX1 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
-               else spongeFactor = 1.0;
+                  spongeFactor = (sizeX - (muX1 * deltaT + c1o1)) / sizeSP / c2o1 + c1o2;
+               else spongeFactor = c1o1;
                break;
             case DIR_M00:
                muX1 = (real)(x1 + ix1 * maxX1);
                if (muX1 <= sizeSP / deltaT)
-                  spongeFactor = (sizeSP - (muX1 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
-               else spongeFactor = 1.0;
+                  spongeFactor = (sizeSP - (muX1 * deltaT + c1o1)) / sizeSP / c2o1 + c1o2;
+               else spongeFactor = c1o1;
                break;
             case DIR_0P0:
                muX2 = (real)(x2 + ix2 * maxX2);
                if (muX2 >= (sizeX - sizeSP) / deltaT)
-                  spongeFactor = (sizeX - (muX2 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
-               else spongeFactor = 1.0;
+                  spongeFactor = (sizeX - (muX2 * deltaT + c1o1)) / sizeSP / c2o1 + c1o2;
+               else spongeFactor = c1o1;
                break;
             case DIR_0M0:
                muX2 = (real)(x2 + ix2 * maxX2);
                if (muX2 <= sizeSP / deltaT)
-                  spongeFactor = (sizeSP - (muX2 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
-               else spongeFactor = 1.0;
+                  spongeFactor = (sizeSP - (muX2 * deltaT + c1o1)) / sizeSP / c2o1 + c1o2;
+               else spongeFactor = c1o1;
                break;
             case DIR_00P:
                muX3 = (real)(x3 + ix3 * maxX3);
                if (muX3 >= (sizeX - sizeSP) / deltaT)
-                  spongeFactor = (sizeX - (muX3 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
-               else spongeFactor = 1.0;
+                  spongeFactor = (sizeX - (muX3 * deltaT + c1o1)) / sizeSP / c2o1 + c1o2;
+               else spongeFactor = c1o1;
                break;
             case DIR_00M:
                muX3 = (real)(x3 + ix3 * maxX3);
                if (muX3 <= sizeSP / deltaT)
-                  spongeFactor = (sizeSP - (muX3 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
-               else spongeFactor = 1.0;
+                  spongeFactor = (sizeSP - (muX3 * deltaT + c1o1)) / sizeSP / c2o1 + c1o2;
+               else spongeFactor = c1o1;
                break;
             default: throw UbException(UB_EXARGS, "unknown dir");
             }
@@ -122,7 +122,7 @@ SPtr<LBMKernel> IncompressibleCumulantWithSpongeLayerLBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<IncompressibleCumulantWithSpongeLayerLBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -134,10 +134,10 @@ SPtr<LBMKernel> IncompressibleCumulantWithSpongeLayerLBMKernel::clone()
    switch (parameter)
    {
    case NORMAL:
-      dynamicPointerCast<IncompressibleCumulantWithSpongeLayerLBMKernel>(kernel)->OxyyMxzz = 1.0;
+      dynamicPointerCast<IncompressibleCumulantWithSpongeLayerLBMKernel>(kernel)->OxyyMxzz = c1o1;
       break;
    case MAGIC:
-      dynamicPointerCast<IncompressibleCumulantWithSpongeLayerLBMKernel>(kernel)->OxyyMxzz = 2.0 +(-collFactor);
+      dynamicPointerCast<IncompressibleCumulantWithSpongeLayerLBMKernel>(kernel)->OxyyMxzz = c2o1 +(-collFactor);
       break;
    }
 
@@ -169,7 +169,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
    //   muForcingX2.DefineVar("dx",&muDeltaT);
    //   muForcingX3.DefineVar("dx",&muDeltaT);
 
-   //   muNu = (1.0/3.0)*(1.0/collFactor - 1.0/2.0);
+   //   muNu = (1.0/3.0)*(1.0/collFactor - 1.0/c2o10);
 
    //   muForcingX1.DefineVar("nu",&muNu);
    //   muForcingX2.DefineVar("nu",&muNu);
@@ -193,7 +193,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
    SPtr<RelaxationFactorArray3D> relaxationFactorPtr = dataSet->getRelaxationFactor();
 
    const int bcArrayMaxX1 = (int)bcArray->getNX1();
@@ -352,7 +352,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                m2=mfbba+mfbbc;
                m0+=m1+m2;
                m0+=mfbbb; //hat gefehlt
-               oMdrho = 1. - (oMdrho + m0);
+               oMdrho = c1o1 - (oMdrho + m0);
 
                real vx2;
                real vy2;
@@ -362,7 +362,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                vz2=vvz*vvz;
                ////////////////////////////////////////////////////////////////////////////////////
                real wadjust;
-               real qudricLimit = 0.01;
+               real qudricLimit = c1o100;
                ////////////////////////////////////////////////////////////////////////////////////
                //Hin
                ////////////////////////////////////////////////////////////////////////////////////
@@ -375,7 +375,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaaa = m0;
                m0   += c1o36 * oMdrho;   
                mfaab = m1 -        m0 * vvz;
-               mfaac = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfaac = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaba  + mfabc;
                m1    = mfabc  - mfaba;
@@ -383,7 +383,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaba = m0;
                m0   += c1o9 * oMdrho;
                mfabb = m1 -        m0 * vvz;
-               mfabc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfabc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaca  + mfacc;
                m1    = mfacc  - mfaca;
@@ -391,7 +391,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaca = m0;
                m0   += c1o36 * oMdrho;
                mfacb = m1 -        m0 * vvz;
-               mfacc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfacc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbaa + mfbac;
@@ -400,7 +400,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfbaa = m0;
                m0   += c1o9 * oMdrho;
                mfbab = m1 -        m0 * vvz;
-               mfbac = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfbac = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbba  + mfbbc;
                m1    = mfbbc  - mfbba;
@@ -408,7 +408,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfbba = m0;
                m0   += c4o9 * oMdrho;
                mfbbb = m1 -        m0 * vvz;
-               mfbbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfbbc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbca  + mfbcc;
                m1    = mfbcc  - mfbca;
@@ -416,7 +416,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfbca = m0;
                m0   += c1o9 * oMdrho;
                mfbcb = m1 -        m0 * vvz;
-               mfbcc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfbcc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcaa + mfcac;
@@ -425,7 +425,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfcaa = m0;
                m0   += c1o36 * oMdrho;
                mfcab = m1 -        m0 * vvz;
-               mfcac = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfcac = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcba  + mfcbc;
                m1    = mfcbc  - mfcba;
@@ -433,7 +433,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfcba = m0;
                m0   += c1o9 * oMdrho;
                mfcbb = m1 -        m0 * vvz;
-               mfcbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfcbc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcca  + mfccc;
                m1    = mfccc  - mfcca;
@@ -441,7 +441,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfcca = m0;
                m0   += c1o36 * oMdrho;
                mfccb = m1 -        m0 * vvz;
-               mfccc = m2 - 2. *   m1 * vvz + vz2 * m0;
+               mfccc = m2 - c2o1 *   m1 * vvz + vz2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
@@ -453,14 +453,14 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaaa = m0;
                m0   += c1o6 * oMdrho;
                mfaba = m1 -        m0 * vvy;
-               mfaca = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfaca = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaab  + mfacb;
                m1    = mfacb  - mfaab;
                m0    = m2          + mfabb;
                mfaab = m0;
                mfabb = m1 -        m0 * vvy;
-               mfacb = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfacb = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaac  + mfacc;
                m1    = mfacc  - mfaac;
@@ -468,7 +468,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaac = m0;
                m0   += c1o18 * oMdrho;
                mfabc = m1 -        m0 * vvy;
-               mfacc = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfacc = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbaa + mfbca;
@@ -477,14 +477,14 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfbaa = m0;
                m0   += c2o3 * oMdrho;
                mfbba = m1 -        m0 * vvy;
-               mfbca = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfbca = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbab  + mfbcb;
                m1    = mfbcb  - mfbab;
                m0    = m2          + mfbbb;
                mfbab = m0;
                mfbbb = m1 -        m0 * vvy;
-               mfbcb = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfbcb = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfbac  + mfbcc;
                m1    = mfbcc  - mfbac;
@@ -492,7 +492,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfbac = m0;
                m0   += c2o9 * oMdrho;
                mfbbc = m1 -        m0 * vvy;
-               mfbcc = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfbcc = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcaa + mfcca;
@@ -501,14 +501,14 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfcaa = m0;
                m0   += c1o6 * oMdrho;
                mfcba = m1 -        m0 * vvy;
-               mfcca = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfcca = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcab  + mfccb;
                m1    = mfccb  - mfcab;
                m0    = m2          + mfcbb;
                mfcab = m0;
                mfcbb = m1 -        m0 * vvy;
-               mfccb = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfccb = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfcac  + mfccc;
                m1    = mfccc  - mfcac;
@@ -516,7 +516,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfcac = m0;
                m0   += c1o18 * oMdrho;
                mfcbc = m1 -        m0 * vvy;
-               mfccc = m2 - 2. *   m1 * vvy + vy2 * m0;
+               mfccc = m2 - c2o1 *   m1 * vvy + vy2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
@@ -526,16 +526,16 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                m1    = mfcaa - mfaaa;
                m0    = m2          + mfbaa;
                mfaaa = m0;
-               m0   += 1. * oMdrho;
+               m0   += c1o1 * oMdrho;
                mfbaa = m1 -        m0 * vvx;
-               mfcaa = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcaa = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaba  + mfcba;
                m1    = mfcba  - mfaba;
                m0    = m2          + mfbba;
                mfaba = m0;
                mfbba = m1 -        m0 * vvx;
-               mfcba = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcba = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaca  + mfcca;
                m1    = mfcca  - mfaca;
@@ -543,7 +543,7 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaca = m0;
                m0   += c1o3 * oMdrho;
                mfbca = m1 -        m0 * vvx;
-               mfcca = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcca = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaab + mfcab;
@@ -551,21 +551,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                m0    = m2          + mfbab;
                mfaab = m0;
                mfbab = m1 -        m0 * vvx;
-               mfcab = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcab = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfabb  + mfcbb;
                m1    = mfcbb  - mfabb;
                m0    = m2          + mfbbb;
                mfabb = m0;
                mfbbb = m1 -        m0 * vvx;
-               mfcbb = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcbb = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfacb  + mfccb;
                m1    = mfccb  - mfacb;
                m0    = m2          + mfbcb;
                mfacb = m0;
                mfbcb = m1 -        m0 * vvx;
-               mfccb = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfccb = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfaac + mfcac;
@@ -574,14 +574,14 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfaac = m0;
                m0   += c1o3 * oMdrho;
                mfbac = m1 -        m0 * vvx;
-               mfcac = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcac = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfabc  + mfcbc;
                m1    = mfcbc  - mfabc;
                m0    = m2          + mfbbc;
                mfabc = m0;
                mfbbc = m1 -        m0 * vvx;
-               mfcbc = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfcbc = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                m2    = mfacc  + mfccc;
                m1    = mfccc  - mfacc;
@@ -589,42 +589,42 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                mfacc = m0;
                m0   += c1o9 * oMdrho;
                mfbcc = m1 -        m0 * vvx;
-               mfccc = m2 - 2. *   m1 * vvx + vx2 * m0;
+               mfccc = m2 - c2o1 *   m1 * vvx + vx2 * m0;
                ////////////////////////////////////////////////////////////////////////////////////
                // Cumulants
                ////////////////////////////////////////////////////////////////////////////////////
-               real OxxPyyPzz = 1.;
-               real OxyyPxzz  = 1.;//-s9;//2+s9;//
-               //real OxyyMxzz  = 1.;//2+s9;//
-               real O4        = 1.;
-               real O5        = 1.;
-               real O6        = 1.;
+               real OxxPyyPzz = c1o1;
+               real OxyyPxzz  = c1o1;//-s9;//2+s9;//
+               //real OxyyMxzz  = c1o1;//2+s9;//
+               real O4        = c1o1;
+               real O5        = c1o1;
+               real O6        = c1o1;
 
-               //Cum 4.
-               real CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab);
-               real CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb);
-               real CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb);
+               //Cum c4o1
+               real CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + c2o1 * mfbba * mfbab);
+               real CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + c2o1 * mfbba * mfabb);
+               real CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + c2o1 * mfbab * mfabb);
 
-               real CUMcca = mfcca - (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
-               real CUMcac = mfcac - (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
-               real CUMacc = mfacc - (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               real CUMcca = mfcca - (mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               real CUMcac = mfcac - (mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               real CUMacc = mfacc - (mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
 
                //Cum 5.
-               real CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
-               real CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
-               real CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+               real CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+               real CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+               real CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
 
                //Cum 6.
-               real CUMccc = mfccc  +((-4. *  mfbbb * mfbbb 
+               real CUMccc = mfccc  +((-c4o1 *  mfbbb * mfbbb 
                   -       (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-                  -  4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-                  -  2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
-                  +( 4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-                  +  2. * (mfcaa * mfaca * mfaac)
-                  + 16. *  mfbba * mfbab * mfabb)
+                  -  c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                  -  c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+                  +( c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                  +  c2o1 * (mfcaa * mfaca * mfaac)
+                  + c16o1 *  mfbba * mfbab * mfabb)
                   - c1o3* (mfacc + mfcac + mfcca) * oMdrho  -c1o9*oMdrho*oMdrho
-                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1.-2.* oMdrho)- c1o27* oMdrho * oMdrho*(-2.* oMdrho)
-                  +( 2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(c1o1-c2o1* oMdrho)- c1o27* oMdrho * oMdrho*(-c2o1* oMdrho)
+                  +( c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
                   +       (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) +c1o27*oMdrho;
 
                //2.
@@ -638,9 +638,9 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                real dzuz = dxux + collFactor * c3o2 * mxxMzz;
 
                //relax
-               mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
-               mxxMyy    += collFactor * (-mxxMyy) - 3. * (1. - c1o2 * collFactor) * (vx2 * dxux - vy2 * dyuy);
-               mxxMzz    += collFactor * (-mxxMzz) - 3. * (1. - c1o2 * collFactor) * (vx2 * dxux - vz2 * dzuz);
+               mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+               mxxMyy    += collFactor * (-mxxMyy) - c3o1 * (c1o1 - c1o2 * collFactor) * (vx2 * dxux - vy2 * dyuy);
+               mxxMzz    += collFactor * (-mxxMzz) - c3o1 * (c1o1 - c1o2 * collFactor) * (vx2 * dxux - vz2 * dzuz);
 
                mfabb     += collFactor * (-mfabb);
                mfbab     += collFactor * (-mfbab);
@@ -648,8 +648,8 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
 
                // linear combinations back
                mfcaa = c1o3 * (       mxxMyy +      mxxMzz + mxxPyyPzz);
-               mfaca = c1o3 * (-2. *  mxxMyy +      mxxMzz + mxxPyyPzz);
-               mfaac = c1o3 * (       mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+               mfaca = c1o3 * (-c2o1 *  mxxMyy +      mxxMzz + mxxPyyPzz);
+               mfaac = c1o3 * (       mxxMyy - c2o1 * mxxMzz + mxxPyyPzz);
 
                //3.
                // linear combinations
@@ -663,19 +663,19 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                real mxyyMxzz = mfbca - mfbac;
 
                //relax
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimit);
                mfbbb     += wadjust * (-mfbbb);
-               wadjust    = OxyyPxzz+(1.-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimit);
+               wadjust    = OxyyPxzz+(c1o1-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimit);
                mxxyPyzz  += wadjust * (-mxxyPyzz);
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimit);
                mxxyMyzz  += wadjust * (-mxxyMyzz);
-               wadjust    = OxyyPxzz+(1.-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimit);
+               wadjust    = OxyyPxzz+(c1o1-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimit);
                mxxzPyyz  += wadjust * (-mxxzPyyz);
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimit);
                mxxzMyyz  += wadjust * (-mxxzMyyz);
-               wadjust    = OxyyPxzz+(1.-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimit);
+               wadjust    = OxyyPxzz+(c1o1-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimit);
                mxyyPxzz  += wadjust * (-mxyyPxzz);
-               wadjust    = OxyyMxzz+(1.-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimit);
+               wadjust    = OxyyMxzz+(c1o1-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimit);
                mxyyMxzz  += wadjust * (-mxyyMxzz);
 
                // linear combinations back
@@ -705,30 +705,30 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
 
                //back cumulants to central moments
                //4.
-               mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab);
-               mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb);
-               mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb);
+               mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + c2o1 * mfbba * mfbab);
+               mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + c2o1 * mfbba * mfabb);
+               mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + c2o1 * mfbab * mfabb);
 
-               mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
-               mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
-               mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               mfcca = CUMcca + (mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               mfcac = CUMcac + (mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
+               mfacc = CUMacc + (mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho-1)*oMdrho;
 
                //5.
-               mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
-               mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
-               mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+               mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+               mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+               mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
 
                //6.
-               mfccc = CUMccc  -((-4. *  mfbbb * mfbbb 
+               mfccc = CUMccc  -((-c4o1 *  mfbbb * mfbbb 
                   -       (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-                  -  4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
-                  -  2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
-                  +( 4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-                  +  2. * (mfcaa * mfaca * mfaac)
-                  + 16. *  mfbba * mfbab * mfabb)
+                  -  c4o1 * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+                  -  c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+                  +( c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                  +  c2o1 * (mfcaa * mfaca * mfaac)
+                  + c16o1 *  mfbba * mfbab * mfabb)
                   - c1o3* (mfacc + mfcac + mfcca) * oMdrho  -c1o9*oMdrho*oMdrho
-                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1.-2.* oMdrho)- c1o27* oMdrho * oMdrho*(-2.* oMdrho)
-                  +( 2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                  - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(c1o1-c2o1* oMdrho)- c1o27* oMdrho * oMdrho*(-c2o1* oMdrho)
+                  +( c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
                   +       (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) -c1o27*oMdrho;
 
                ////////////////////////////////////////////////////////////////////////////////////
@@ -744,22 +744,22 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
                ////////////////////////////////////////////////////////////////////////////////////
                // Z - Dir
-               m0 =  mfaac * c1o2 +      mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (     vz2 - vvz) * c1o2;
-               m1 = -mfaac        - 2. * mfaab *  vvz         +  mfaaa                * (1. - vz2)              - 1. * oMdrho * vz2;
-               m2 =  mfaac * c1o2 +      mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (     vz2 + vvz) * c1o2;
+               m0 =  mfaac * c1o2 +      mfaab * (vvz - c1o2) + (mfaaa + c1o1 * oMdrho) * (     vz2 - vvz) * c1o2;
+               m1 = -mfaac        - c2o1 * mfaab *  vvz         +  mfaaa                * (c1o1 - vz2)              - c1o1 * oMdrho * vz2;
+               m2 =  mfaac * c1o2 +      mfaab * (vvz + c1o2) + (mfaaa + c1o1 * oMdrho) * (     vz2 + vvz) * c1o2;
                mfaaa = m0;
                mfaab = m1;
                mfaac = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfabc * c1o2 +      mfabb * (vvz - c1o2) + mfaba * (     vz2 - vvz) * c1o2;
-               m1 = -mfabc        - 2. * mfabb *  vvz         + mfaba * (1. - vz2);
+               m1 = -mfabc        - c2o1 * mfabb *  vvz         + mfaba * (c1o1 - vz2);
                m2 =  mfabc * c1o2 +      mfabb * (vvz + c1o2) + mfaba * (     vz2 + vvz) * c1o2;
                mfaba = m0;
                mfabb = m1;
                mfabc = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfacc * c1o2 +      mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (     vz2 - vvz) * c1o2;
-               m1 = -mfacc        - 2. * mfacb *  vvz         +  mfaca                  * (1. - vz2)              - c1o3 * oMdrho * vz2;
+               m1 = -mfacc        - c2o1 * mfacb *  vvz         +  mfaca                  * (c1o1 - vz2)              - c1o3 * oMdrho * vz2;
                m2 =  mfacc * c1o2 +      mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (     vz2 + vvz) * c1o2;
                mfaca = m0;
                mfacb = m1;
@@ -767,21 +767,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfbac * c1o2 +      mfbab * (vvz - c1o2) + mfbaa * (     vz2 - vvz) * c1o2;
-               m1 = -mfbac        - 2. * mfbab *  vvz         + mfbaa * (1. - vz2);
+               m1 = -mfbac        - c2o1 * mfbab *  vvz         + mfbaa * (c1o1 - vz2);
                m2 =  mfbac * c1o2 +      mfbab * (vvz + c1o2) + mfbaa * (     vz2 + vvz) * c1o2;
                mfbaa = m0;
                mfbab = m1;
                mfbac = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbbc * c1o2 +      mfbbb * (vvz - c1o2) + mfbba * (     vz2 - vvz) * c1o2;
-               m1 = -mfbbc        - 2. * mfbbb *  vvz         + mfbba * (1. - vz2);
+               m1 = -mfbbc        - c2o1 * mfbbb *  vvz         + mfbba * (c1o1 - vz2);
                m2 =  mfbbc * c1o2 +      mfbbb * (vvz + c1o2) + mfbba * (     vz2 + vvz) * c1o2;
                mfbba = m0;
                mfbbb = m1;
                mfbbc = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbcc * c1o2 +      mfbcb * (vvz - c1o2) + mfbca * (     vz2 - vvz) * c1o2;
-               m1 = -mfbcc        - 2. * mfbcb *  vvz         + mfbca * (1. - vz2);
+               m1 = -mfbcc        - c2o1 * mfbcb *  vvz         + mfbca * (c1o1 - vz2);
                m2 =  mfbcc * c1o2 +      mfbcb * (vvz + c1o2) + mfbca * (     vz2 + vvz) * c1o2;
                mfbca = m0;
                mfbcb = m1;
@@ -789,21 +789,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcac * c1o2 +      mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (     vz2 - vvz) * c1o2;
-               m1 = -mfcac        - 2. * mfcab *  vvz         +  mfcaa                  * (1. - vz2)              - c1o3 * oMdrho * vz2;
+               m1 = -mfcac        - c2o1 * mfcab *  vvz         +  mfcaa                  * (c1o1 - vz2)              - c1o3 * oMdrho * vz2;
                m2 =  mfcac * c1o2 +      mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (     vz2 + vvz) * c1o2;
                mfcaa = m0;
                mfcab = m1;
                mfcac = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfcbc * c1o2 +      mfcbb * (vvz - c1o2) + mfcba * (     vz2 - vvz) * c1o2;
-               m1 = -mfcbc        - 2. * mfcbb *  vvz         + mfcba * (1. - vz2);
+               m1 = -mfcbc        - c2o1 * mfcbb *  vvz         + mfcba * (c1o1 - vz2);
                m2 =  mfcbc * c1o2 +      mfcbb * (vvz + c1o2) + mfcba * (     vz2 + vvz) * c1o2;
                mfcba = m0;
                mfcbb = m1;
                mfcbc = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfccc * c1o2 +      mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (     vz2 - vvz) * c1o2;
-               m1 = -mfccc        - 2. * mfccb *  vvz         +  mfcca                  * (1. - vz2)              - c1o9 * oMdrho * vz2;
+               m1 = -mfccc        - c2o1 * mfccb *  vvz         +  mfcca                  * (c1o1 - vz2)              - c1o9 * oMdrho * vz2;
                m2 =  mfccc * c1o2 +      mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (     vz2 + vvz) * c1o2;
                mfcca = m0;
                mfccb = m1;
@@ -814,21 +814,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                // Y - Dir
                m0 =  mfaca * c1o2 +      mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (     vy2 - vvy) * c1o2;
-               m1 = -mfaca        - 2. * mfaba *  vvy         +  mfaaa                  * (1. - vy2)              - c1o6 * oMdrho * vy2;
+               m1 = -mfaca        - c2o1 * mfaba *  vvy         +  mfaaa                  * (c1o1 - vy2)              - c1o6 * oMdrho * vy2;
                m2 =  mfaca * c1o2 +      mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (     vy2 + vvy) * c1o2;
                mfaaa = m0;
                mfaba = m1;
                mfaca = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfacb * c1o2 +      mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (     vy2 - vvy) * c1o2;
-               m1 = -mfacb        - 2. * mfabb *  vvy         +  mfaab                  * (1. - vy2)              - c2o3 * oMdrho * vy2;
+               m1 = -mfacb        - c2o1 * mfabb *  vvy         +  mfaab                  * (c1o1 - vy2)              - c2o3 * oMdrho * vy2;
                m2 =  mfacb * c1o2 +      mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (     vy2 + vvy) * c1o2;
                mfaab = m0;
                mfabb = m1;
                mfacb = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfacc * c1o2 +      mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (     vy2 - vvy) * c1o2;
-               m1 = -mfacc        - 2. * mfabc *  vvy         +  mfaac                  * (1. - vy2)              - c1o6 * oMdrho * vy2;
+               m1 = -mfacc        - c2o1 * mfabc *  vvy         +  mfaac                  * (c1o1 - vy2)              - c1o6 * oMdrho * vy2;
                m2 =  mfacc * c1o2 +      mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (     vy2 + vvy) * c1o2;
                mfaac = m0;
                mfabc = m1;
@@ -836,21 +836,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfbca * c1o2 +      mfbba * (vvy - c1o2) + mfbaa * (     vy2 - vvy) * c1o2;
-               m1 = -mfbca        - 2. * mfbba *  vvy         + mfbaa * (1. - vy2);
+               m1 = -mfbca        - c2o1 * mfbba *  vvy         + mfbaa * (c1o1 - vy2);
                m2 =  mfbca * c1o2 +      mfbba * (vvy + c1o2) + mfbaa * (     vy2 + vvy) * c1o2;
                mfbaa = m0;
                mfbba = m1;
                mfbca = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbcb * c1o2 +      mfbbb * (vvy - c1o2) + mfbab * (     vy2 - vvy) * c1o2;
-               m1 = -mfbcb        - 2. * mfbbb *  vvy         + mfbab * (1. - vy2);
+               m1 = -mfbcb        - c2o1 * mfbbb *  vvy         + mfbab * (c1o1 - vy2);
                m2 =  mfbcb * c1o2 +      mfbbb * (vvy + c1o2) + mfbab * (     vy2 + vvy) * c1o2;
                mfbab = m0;
                mfbbb = m1;
                mfbcb = m2;
                /////////b//////////////////////////////////////////////////////////////////////////
                m0 =  mfbcc * c1o2 +      mfbbc * (vvy - c1o2) + mfbac * (     vy2 - vvy) * c1o2;
-               m1 = -mfbcc        - 2. * mfbbc *  vvy         + mfbac * (1. - vy2);
+               m1 = -mfbcc        - c2o1 * mfbbc *  vvy         + mfbac * (c1o1 - vy2);
                m2 =  mfbcc * c1o2 +      mfbbc * (vvy + c1o2) + mfbac * (     vy2 + vvy) * c1o2;
                mfbac = m0;
                mfbbc = m1;
@@ -858,21 +858,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcca * c1o2 +      mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (     vy2 - vvy) * c1o2;
-               m1 = -mfcca        - 2. * mfcba *  vvy         +  mfcaa                   * (1. - vy2)              - c1o18 * oMdrho * vy2;
+               m1 = -mfcca        - c2o1 * mfcba *  vvy         +  mfcaa                   * (c1o1 - vy2)              - c1o18 * oMdrho * vy2;
                m2 =  mfcca * c1o2 +      mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (     vy2 + vvy) * c1o2;
                mfcaa = m0;
                mfcba = m1;
                mfcca = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfccb * c1o2 +      mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (     vy2 - vvy) * c1o2;
-               m1 = -mfccb        - 2. * mfcbb *  vvy         +  mfcab                  * (1. - vy2)              - c2o9 * oMdrho * vy2;
+               m1 = -mfccb        - c2o1 * mfcbb *  vvy         +  mfcab                  * (c1o1 - vy2)              - c2o9 * oMdrho * vy2;
                m2 =  mfccb * c1o2 +      mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (     vy2 + vvy) * c1o2;
                mfcab = m0;
                mfcbb = m1;
                mfccb = m2;
                /////////c//////////////////////////////////////////////////////////////////////////
                m0 =  mfccc * c1o2 +      mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (     vy2 - vvy) * c1o2;
-               m1 = -mfccc        - 2. * mfcbc *  vvy         +  mfcac                   * (1. - vy2)              - c1o18 * oMdrho * vy2;
+               m1 = -mfccc        - c2o1 * mfcbc *  vvy         +  mfcac                   * (c1o1 - vy2)              - c1o18 * oMdrho * vy2;
                m2 =  mfccc * c1o2 +      mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (     vy2 + vvy) * c1o2;
                mfcac = m0;
                mfcbc = m1;
@@ -883,21 +883,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                // X - Dir
                m0 =  mfcaa * c1o2 +      mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcaa        - 2. * mfbaa *  vvx         +  mfaaa                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfcaa        - c2o1 * mfbaa *  vvx         +  mfaaa                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfcaa * c1o2 +      mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfaaa = m0;
                mfbaa = m1;
                mfcaa = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcba * c1o2 +      mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcba        - 2. * mfbba *  vvx         +  mfaba                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfcba        - c2o1 * mfbba *  vvx         +  mfaba                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfcba * c1o2 +      mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfaba = m0;
                mfbba = m1;
                mfcba = m2;
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcca * c1o2 +      mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcca        - 2. * mfbca *  vvx         +  mfaca                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfcca        - c2o1 * mfbca *  vvx         +  mfaca                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfcca * c1o2 +      mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfaca = m0;
                mfbca = m1;
@@ -905,21 +905,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcab * c1o2 +      mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcab        - 2. * mfbab *  vvx         +  mfaab                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfcab        - c2o1 * mfbab *  vvx         +  mfaab                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfcab * c1o2 +      mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfaab = m0;
                mfbab = m1;
                mfcab = m2;
                ///////////b////////////////////////////////////////////////////////////////////////
                m0 =  mfcbb * c1o2 +      mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcbb        - 2. * mfbbb *  vvx         +  mfabb                  * (1. - vx2)              - c4o9 * oMdrho * vx2;
+               m1 = -mfcbb        - c2o1 * mfbbb *  vvx         +  mfabb                  * (c1o1 - vx2)              - c4o9 * oMdrho * vx2;
                m2 =  mfcbb * c1o2 +      mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfabb = m0;
                mfbbb = m1;
                mfcbb = m2;
                ///////////b////////////////////////////////////////////////////////////////////////
                m0 =  mfccb * c1o2 +      mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfccb        - 2. * mfbcb *  vvx         +  mfacb                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfccb        - c2o1 * mfbcb *  vvx         +  mfacb                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfccb * c1o2 +      mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfacb = m0;
                mfbcb = m1;
@@ -927,21 +927,21 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::calculate(int step)
                ////////////////////////////////////////////////////////////////////////////////////
                ////////////////////////////////////////////////////////////////////////////////////
                m0 =  mfcac * c1o2 +      mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcac        - 2. * mfbac *  vvx         +  mfaac                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfcac        - c2o1 * mfbac *  vvx         +  mfaac                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfcac * c1o2 +      mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfaac = m0;
                mfbac = m1;
                mfcac = m2;
                ///////////c////////////////////////////////////////////////////////////////////////
                m0 =  mfcbc * c1o2 +      mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfcbc        - 2. * mfbbc *  vvx         +  mfabc                  * (1. - vx2)              - c1o9 * oMdrho * vx2;
+               m1 = -mfcbc        - c2o1 * mfbbc *  vvx         +  mfabc                  * (c1o1 - vx2)              - c1o9 * oMdrho * vx2;
                m2 =  mfcbc * c1o2 +      mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfabc = m0;
                mfbbc = m1;
                mfcbc = m2;
                ///////////c////////////////////////////////////////////////////////////////////////
                m0 =  mfccc * c1o2 +      mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (     vx2 - vvx) * c1o2;
-               m1 = -mfccc        - 2. * mfbcc *  vvx         +  mfacc                   * (1. - vx2)              - c1o36 * oMdrho * vx2;
+               m1 = -mfccc        - c2o1 * mfbcc *  vvx         +  mfacc                   * (c1o1 - vx2)              - c1o36 * oMdrho * vx2;
                m2 =  mfccc * c1o2 +      mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (     vx2 + vvx) * c1o2;
                mfacc = m0;
                mfbcc = m1;
diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp
index c4759d786367fc9c5030898839b57cbec7bd48ec..93fb699ea4c612fed513fa7d1b079814a8332fe4 100644
--- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp
@@ -37,22 +37,24 @@ void IncompressibleOffsetInterpolationProcessor::setOffsets(real xoff, real yoff
 //////////////////////////////////////////////////////////////////////////
 void IncompressibleOffsetInterpolationProcessor::interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF, real xoff, real yoff, real zoff)
 {
+    using namespace vf::lbm::constant;
+
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellC, omegaC, 0.5);
-   calcInterpolatedNode(icellF.BSW, omegaF, -0.25, -0.25, -0.25, calcPressBSW(), -1, -1, -1);
-   calcInterpolatedNode(icellF.BNE, omegaF,  0.25,  0.25, -0.25, calcPressBNE(),  1,  1, -1);
-   calcInterpolatedNode(icellF.TNW, omegaF, -0.25,  0.25,  0.25, calcPressTNW(), -1,  1,  1);
-   calcInterpolatedNode(icellF.TSE, omegaF,  0.25, -0.25,  0.25, calcPressTSE(),  1, -1,  1);
-   calcInterpolatedNode(icellF.BNW, omegaF, -0.25,  0.25, -0.25, calcPressBNW(), -1,  1, -1);
-   calcInterpolatedNode(icellF.BSE, omegaF,  0.25, -0.25, -0.25, calcPressBSE(),  1, -1, -1);
-   calcInterpolatedNode(icellF.TSW, omegaF, -0.25, -0.25,  0.25, calcPressTSW(), -1, -1,  1);
-   calcInterpolatedNode(icellF.TNE, omegaF,  0.25,  0.25,  0.25, calcPressTNE(),  1,  1,  1);
+   calcInterpolatedCoefficiets(icellC, omegaC, c1o2);
+   calcInterpolatedNode(icellF.BSW, omegaF, -c1o4, -c1o4, -c1o4, calcPressBSW(), -c1o1, -c1o1, -c1o1);
+   calcInterpolatedNode(icellF.BNE, omegaF,  c1o4,  c1o4, -c1o4, calcPressBNE(),  c1o1,  c1o1, -c1o1);
+   calcInterpolatedNode(icellF.TNW, omegaF, -c1o4,  c1o4,  c1o4, calcPressTNW(), -c1o1,  c1o1,  c1o1);
+   calcInterpolatedNode(icellF.TSE, omegaF,  c1o4, -c1o4,  c1o4, calcPressTSE(),  c1o1, -c1o1,  c1o1);
+   calcInterpolatedNode(icellF.BNW, omegaF, -c1o4,  c1o4, -c1o4, calcPressBNW(), -c1o1,  c1o1, -c1o1);
+   calcInterpolatedNode(icellF.BSE, omegaF,  c1o4, -c1o4, -c1o4, calcPressBSE(),  c1o1, -c1o1, -c1o1);
+   calcInterpolatedNode(icellF.TSW, omegaF, -c1o4, -c1o4,  c1o4, calcPressTSW(), -c1o1, -c1o1,  c1o1);
+   calcInterpolatedNode(icellF.TNE, omegaF,  c1o4,  c1o4,  c1o4, calcPressTNE(),  c1o1,  c1o1,  c1o1);
 }
 //////////////////////////////////////////////////////////////////////////
 void IncompressibleOffsetInterpolationProcessor::interpolateFineToCoarse(D3Q27ICell& icellF, real* icellC, real xoff, real yoff, real zoff)
 {
    setOffsets(xoff, yoff, zoff);
-   calcInterpolatedCoefficiets(icellF, omegaF, 2.0);
+   calcInterpolatedCoefficiets(icellF, omegaF, vf::lbm::constant::c2o1);
    calcInterpolatedNodeFC(icellC, omegaC);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -61,11 +63,12 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const real* const f
 {
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
+   using namespace vf::lbm::constant;
 
    //UBLOG(logINFO,"D3Q27System::DIR_M0M  = " << D3Q27System::DIR_M0M);
    //UBLOG(logINFO,"BW  = " << BW);;
 
-   real rho = 0.0;
+   real rho = c0o1;
    D3Q27System::calcIncompMacroscopicValues(f,rho,vx1,vx2,vx3);
    
    //////////////////////////////////////////////////////////////////////////
@@ -83,12 +86,12 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const real* const f
    //press = D3Q27System::calcPress(f,rho,vx1,vx2,vx3);
    press = rho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))-(vx2*vx3));
-   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))-(vx1*vx1-vx3*vx3));
-   //kxxMzz = -3./2.*omega*(((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T])))-(vx1*vx1-vx3*vx3));
+   kxy   = -c3o1*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -c3o1*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))-(vx2*vx3));
+   kxz   = -c3o1*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))-(vx1*vx3));
+   kxxMyy = -c3o1/c2o1*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))-(vx1*vx1-vx2*vx2));
+   kxxMzz = -c3o1/c2o1*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))-(vx1*vx1-vx3*vx3));
+   //kxxMzz = -c3o1/c2o1*omega*(((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T])))-(vx1*vx1-vx3*vx3));
 
    //UBLOG(logINFO, "t1 = "<<(((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T])));
    //UBLOG(logINFO, "kxxMzz = "<<kxxMzz);
@@ -103,6 +106,8 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const real* const f
 //////////////////////////////////////////////////////////////////////////
 void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, real omega, real eps_new)
 {
+    using namespace vf::lbm::constant;
+
    real        vx1_SWT,vx2_SWT,vx3_SWT;
    real        vx1_NWT,vx2_NWT,vx3_NWT;
    real        vx1_NET,vx2_NET,vx3_NET;
@@ -197,109 +202,109 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET - 2.*kxyFromfcNEQ_NWB - 2.*kxyFromfcNEQ_NWT +
-      2.*kxyFromfcNEQ_SEB + 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB - 2.*kxzFromfcNEQ_NWT +
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB - 2.*kxzFromfcNEQ_SWT +
-      8.*vx1_NEB + 8.*vx1_NET + 8.*vx1_NWB + 8.*vx1_NWT + 8.*vx1_SEB +
-      8.*vx1_SET + 8.*vx1_SWB + 8.*vx1_SWT + 2.*vx2_NEB + 2.*vx2_NET -
-      2.*vx2_NWB - 2.*vx2_NWT - 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB +
-      2.*vx2_SWT - 2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
-   b0 = (2.*kxxMyyFromfcNEQ_NEB + 2.*kxxMyyFromfcNEQ_NET + 2.*kxxMyyFromfcNEQ_NWB + 2.*kxxMyyFromfcNEQ_NWT -
-      2.*kxxMyyFromfcNEQ_SEB - 2.*kxxMyyFromfcNEQ_SET - 2.*kxxMyyFromfcNEQ_SWB - 2.*kxxMyyFromfcNEQ_SWT -
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET - c2o1*kxyFromfcNEQ_NWB - c2o1*kxyFromfcNEQ_NWT +
+      c2o1*kxyFromfcNEQ_SEB + c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB - c2o1*kxzFromfcNEQ_NWT +
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB - c2o1*kxzFromfcNEQ_SWT +
+      c8o1*vx1_NEB + c8o1*vx1_NET + c8o1*vx1_NWB + c8o1*vx1_NWT + c8o1*vx1_SEB +
+      c8o1*vx1_SET + c8o1*vx1_SWB + c8o1*vx1_SWT + c2o1*vx2_NEB + c2o1*vx2_NET -
+      c2o1*vx2_NWB - c2o1*vx2_NWT - c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB +
+      c2o1*vx2_SWT - c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
+   b0 = (c2o1*kxxMyyFromfcNEQ_NEB + c2o1*kxxMyyFromfcNEQ_NET + c2o1*kxxMyyFromfcNEQ_NWB + c2o1*kxxMyyFromfcNEQ_NWT -
+      c2o1*kxxMyyFromfcNEQ_SEB - c2o1*kxxMyyFromfcNEQ_SET - c2o1*kxxMyyFromfcNEQ_SWB - c2o1*kxxMyyFromfcNEQ_SWT -
       kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT -
-      2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET + 2.*kxyFromfcNEQ_NWB + 2.*kxyFromfcNEQ_NWT -
-      2.*kxyFromfcNEQ_SEB - 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT +
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET + 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB - 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB - 2.*kyzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT +
-      8.*vx2_NEB + 8.*vx2_NET + 8.*vx2_NWB + 8.*vx2_NWT +
-      8.*vx2_SEB + 8.*vx2_SET + 8.*vx2_SWB + 8.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.;
+      c2o1*kxyFromfcNEQ_NEB - c2o1*kxyFromfcNEQ_NET + c2o1*kxyFromfcNEQ_NWB + c2o1*kxyFromfcNEQ_NWT -
+      c2o1*kxyFromfcNEQ_SEB - c2o1*kxyFromfcNEQ_SET + c2o1*kxyFromfcNEQ_SWB + c2o1*kxyFromfcNEQ_SWT +
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET + c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB - c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB - c2o1*kyzFromfcNEQ_SWT +
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT +
+      c8o1*vx2_NEB + c8o1*vx2_NET + c8o1*vx2_NWB + c8o1*vx2_NWT +
+      c8o1*vx2_SEB + c8o1*vx2_SET + c8o1*vx2_SWB + c8o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c64o1;
    c0 = (kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT -
-      2.*kxxMzzFromfcNEQ_NEB + 2.*kxxMzzFromfcNEQ_NET - 2.*kxxMzzFromfcNEQ_NWB + 2.*kxxMzzFromfcNEQ_NWT -
-      2.*kxxMzzFromfcNEQ_SEB + 2.*kxxMzzFromfcNEQ_SET - 2.*kxxMzzFromfcNEQ_SWB + 2.*kxxMzzFromfcNEQ_SWT -
-      2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB + 2.*kxzFromfcNEQ_NWT -
-      2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB + 2.*kxzFromfcNEQ_SWT -
-      2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET - 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT +
-      2.*kyzFromfcNEQ_SEB + 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB + 2.*kyzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT +
-      8.*vx3_NEB + 8.*vx3_NET + 8.*vx3_NWB + 8.*vx3_NWT +
-      8.*vx3_SEB + 8.*vx3_SET + 8.*vx3_SWB + 8.*vx3_SWT)/64.;
-   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*kxxMzzFromfcNEQ_NEB + c2o1*kxxMzzFromfcNEQ_NET - c2o1*kxxMzzFromfcNEQ_NWB + c2o1*kxxMzzFromfcNEQ_NWT -
+      c2o1*kxxMzzFromfcNEQ_SEB + c2o1*kxxMzzFromfcNEQ_SET - c2o1*kxxMzzFromfcNEQ_SWB + c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*kxzFromfcNEQ_NEB - c2o1*kxzFromfcNEQ_NET + c2o1*kxzFromfcNEQ_NWB + c2o1*kxzFromfcNEQ_NWT -
+      c2o1*kxzFromfcNEQ_SEB - c2o1*kxzFromfcNEQ_SET + c2o1*kxzFromfcNEQ_SWB + c2o1*kxzFromfcNEQ_SWT -
+      c2o1*kyzFromfcNEQ_NEB - c2o1*kyzFromfcNEQ_NET - c2o1*kyzFromfcNEQ_NWB - c2o1*kyzFromfcNEQ_NWT +
+      c2o1*kyzFromfcNEQ_SEB + c2o1*kyzFromfcNEQ_SET + c2o1*kyzFromfcNEQ_SWB + c2o1*kyzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT +
+      c8o1*vx3_NEB + c8o1*vx3_NET + c8o1*vx3_NWB + c8o1*vx3_NWT +
+      c8o1*vx3_SEB + c8o1*vx3_SET + c8o1*vx3_SWB + c8o1*vx3_SWT)/c64o1;
+   ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    axx= (kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT +
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT +
       kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB + 2.*vx2_SWT -
-      2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB + c2o1*vx2_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    bxx= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET - kxyFromfcNEQ_NWB - kxyFromfcNEQ_NWT +
       kxyFromfcNEQ_SEB + kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx1_NEB - 2.*vx1_NET + 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB + 2.*vx1_SET - 2.*vx1_SWB - 2.*vx1_SWT)/8.;
+      c2o1*vx1_NEB - c2o1*vx1_NET + c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB + c2o1*vx1_SET - c2o1*vx1_SWB - c2o1*vx1_SWT)/c8o1;
    cxx= (kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB - kxzFromfcNEQ_NWT +
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB - kxzFromfcNEQ_SWT +
-      2.*vx1_NEB - 2.*vx1_NET - 2.*vx1_NWB + 2.*vx1_NWT +
-      2.*vx1_SEB - 2.*vx1_SET - 2.*vx1_SWB + 2.*vx1_SWT)/8.;
-   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/4.;
-   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/4.;
-   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/4.;
+      c2o1*vx1_NEB - c2o1*vx1_NET - c2o1*vx1_NWB + c2o1*vx1_NWT +
+      c2o1*vx1_SEB - c2o1*vx1_SET - c2o1*vx1_SWB + c2o1*vx1_SWT)/c8o1;
+   ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/c4o1;
+   by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/c4o1;
+   cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/c4o1;
    ayy= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET + kxyFromfcNEQ_NWB + kxyFromfcNEQ_NWT -
       kxyFromfcNEQ_SEB - kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT -
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB - 2.*vx2_SWT)/8.;
-   byy= (-2.*kxxMyyFromfcNEQ_NEB - 2.*kxxMyyFromfcNEQ_NET - 2.*kxxMyyFromfcNEQ_NWB - 2.*kxxMyyFromfcNEQ_NWT +
-      2.*kxxMyyFromfcNEQ_SEB + 2.*kxxMyyFromfcNEQ_SET + 2.*kxxMyyFromfcNEQ_SWB + 2.*kxxMyyFromfcNEQ_SWT +
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB - c2o1*vx2_SWT)/c8o1;
+   byy= (-c2o1*kxxMyyFromfcNEQ_NEB - c2o1*kxxMyyFromfcNEQ_NET - c2o1*kxxMyyFromfcNEQ_NWB - c2o1*kxxMyyFromfcNEQ_NWT +
+      c2o1*kxxMyyFromfcNEQ_SEB + c2o1*kxxMyyFromfcNEQ_SET + c2o1*kxxMyyFromfcNEQ_SWB + c2o1*kxxMyyFromfcNEQ_SWT +
       kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT -
       kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT +
-      2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT -
-      2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.;
+      c2o1*vx1_NEB + c2o1*vx1_NET - c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB - c2o1*vx1_SET + c2o1*vx1_SWB + c2o1*vx1_SWT -
+      c2o1*vx3_NEB + c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET + c2o1*vx3_SWB - c2o1*vx3_SWT)/c16o1;
    cyy= (kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET + kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB - kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB - kyzFromfcNEQ_SWT +
-      2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB - 2.*vx2_NWT -
-      2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB + 2.*vx2_SWT)/8.;
-   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/4.;
-   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/4.;
-   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/4.;
+      c2o1*vx2_NEB - c2o1*vx2_NET + c2o1*vx2_NWB - c2o1*vx2_NWT -
+      c2o1*vx2_SEB + c2o1*vx2_SET - c2o1*vx2_SWB + c2o1*vx2_SWT)/c8o1;
+   az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/c4o1;
+   bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/c4o1;
+   cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/c4o1;
    azz= (-kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB + kxzFromfcNEQ_NWT -
       kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB + kxzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT +
-      2.*vx3_SEB - 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET - c2o1*vx3_NWB + c2o1*vx3_NWT +
+      c2o1*vx3_SEB - c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    bzz= (-kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET - kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT -
       kyzFromfcNEQ_SEB + kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB + kyzFromfcNEQ_SWT +
-      2.*vx3_NEB - 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT -
-      2.*vx3_SEB + 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.;
+      c2o1*vx3_NEB - c2o1*vx3_NET + c2o1*vx3_NWB - c2o1*vx3_NWT -
+      c2o1*vx3_SEB + c2o1*vx3_SET - c2o1*vx3_SWB + c2o1*vx3_SWT)/c8o1;
    czz= (-kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT -
       kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT +
-      2.*kxxMzzFromfcNEQ_NEB - 2.*kxxMzzFromfcNEQ_NET + 2.*kxxMzzFromfcNEQ_NWB - 2.*kxxMzzFromfcNEQ_NWT +
-      2.*kxxMzzFromfcNEQ_SEB - 2.*kxxMzzFromfcNEQ_SET + 2.*kxxMzzFromfcNEQ_SWB - 2.*kxxMzzFromfcNEQ_SWT -
-      2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT -
-      2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT -
-      2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT +
-      2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT)/16.;
-   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/2.;
-   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/2.;
-   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/2.;
-   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/2.;
-   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/2.;
-   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/2.;
-   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/2.;
+      c2o1*kxxMzzFromfcNEQ_NEB - c2o1*kxxMzzFromfcNEQ_NET + c2o1*kxxMzzFromfcNEQ_NWB - c2o1*kxxMzzFromfcNEQ_NWT +
+      c2o1*kxxMzzFromfcNEQ_SEB - c2o1*kxxMzzFromfcNEQ_SET + c2o1*kxxMzzFromfcNEQ_SWB - c2o1*kxxMzzFromfcNEQ_SWT -
+      c2o1*vx1_NEB + c2o1*vx1_NET + c2o1*vx1_NWB - c2o1*vx1_NWT -
+      c2o1*vx1_SEB + c2o1*vx1_SET + c2o1*vx1_SWB - c2o1*vx1_SWT -
+      c2o1*vx2_NEB + c2o1*vx2_NET - c2o1*vx2_NWB + c2o1*vx2_NWT +
+      c2o1*vx2_SEB - c2o1*vx2_SET + c2o1*vx2_SWB - c2o1*vx2_SWT)/c16o1;
+   axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/c2o1;
+   bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/c2o1;
+   cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/c2o1;
+   axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
+   ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/c2o1;
+   byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/c2o1;
+   cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/c2o1;
    axyz=-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT + vx1_SEB - vx1_SET - vx1_SWB + vx1_SWT;
    bxyz=-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT + vx2_SEB - vx2_SET - vx2_SWB + vx2_SWT;
    cxyz=-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT + vx3_SEB - vx3_SET - vx3_SWB + vx3_SWT;
@@ -351,7 +356,7 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
    //                  kxxMzzFromfcNEQ_NWT+
    //                  kxxMzzFromfcNEQ_NET+
    //                  kxxMzzFromfcNEQ_NEB)*c1o8-(ax-cz);
-   kxyAverage       =0;//(kxyFromfcNEQ_SWB+
+   kxyAverage       = c0o1;//(kxyFromfcNEQ_SWB+
                     //kxyFromfcNEQ_SWT+
                     //kxyFromfcNEQ_SET+
                     //kxyFromfcNEQ_SEB+
@@ -359,7 +364,7 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
                     //kxyFromfcNEQ_NWT+
                     //kxyFromfcNEQ_NET+
                     //kxyFromfcNEQ_NEB)*c1o8-(ay+bx);
-   kyzAverage       =0;//(kyzFromfcNEQ_SWB+
+   kyzAverage       = c0o1;//(kyzFromfcNEQ_SWB+
                        //kyzFromfcNEQ_SWT+
                        //kyzFromfcNEQ_SET+
                        //kyzFromfcNEQ_SEB+
@@ -367,7 +372,7 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
                        //kyzFromfcNEQ_NWT+
                        //kyzFromfcNEQ_NET+
                        //kyzFromfcNEQ_NEB)*c1o8-(bz+cy);
-   kxzAverage       =0;//(kxzFromfcNEQ_SWB+
+   kxzAverage       = c0o1;//(kxzFromfcNEQ_SWB+
                        //kxzFromfcNEQ_SWT+
                        //kxzFromfcNEQ_SET+
                        //kxzFromfcNEQ_SEB+
@@ -375,7 +380,7 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
                        //kxzFromfcNEQ_NWT+
                        //kxzFromfcNEQ_NET+
                        //kxzFromfcNEQ_NEB)*c1o8-(az+cx);
-   kxxMyyAverage    =0;//(kxxMyyFromfcNEQ_SWB+
+   kxxMyyAverage    = c0o1;//(kxxMyyFromfcNEQ_SWB+
                        //kxxMyyFromfcNEQ_SWT+
                        //kxxMyyFromfcNEQ_SET+
                        //kxxMyyFromfcNEQ_SEB+
@@ -383,7 +388,7 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
                        //kxxMyyFromfcNEQ_NWT+
                        //kxxMyyFromfcNEQ_NET+
                        //kxxMyyFromfcNEQ_NEB)*c1o8-(ax-by);
-   kxxMzzAverage    =0;//(kxxMzzFromfcNEQ_SWB+
+   kxxMzzAverage    = c0o1;//(kxxMzzFromfcNEQ_SWB+
                        //kxxMzzFromfcNEQ_SWT+
                        //kxxMzzFromfcNEQ_SET+
                        //kxxMzzFromfcNEQ_SEB+
@@ -397,17 +402,17 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
    //
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    a0 = a0 + xoff * ax + yoff * ay + zoff * az + xoff_sq * axx + yoff_sq * ayy + zoff_sq * azz + xoff*yoff*axy + xoff*zoff*axz + yoff*zoff*ayz + xoff*yoff*zoff*axyz ;
-   ax = ax + 2. * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
-   ay = ay + 2. * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
-   az = az + 2. * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
+   ax = ax + c2o1 * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz;
+   ay = ay + c2o1 * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz;
+   az = az + c2o1 * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz;
    b0 = b0 + xoff * bx + yoff * by + zoff * bz + xoff_sq * bxx + yoff_sq * byy + zoff_sq * bzz + xoff*yoff*bxy + xoff*zoff*bxz + yoff*zoff*byz + xoff*yoff*zoff*bxyz;
-   bx = bx + 2. * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
-   by = by + 2. * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
-   bz = bz + 2. * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
+   bx = bx + c2o1 * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz;
+   by = by + c2o1 * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz;
+   bz = bz + c2o1 * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz;
    c0 = c0 + xoff * cx + yoff * cy + zoff * cz + xoff_sq * cxx + yoff_sq * cyy + zoff_sq * czz + xoff*yoff*cxy + xoff*zoff*cxz + yoff*zoff*cyz + xoff*yoff*zoff*cxyz;
-   cx = cx + 2. * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
-   cy = cy + 2. * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
-   cz = cz + 2. * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
+   cx = cx + c2o1 * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz;
+   cy = cy + c2o1 * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz;
+   cz = cz + c2o1 * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz;
    axy= axy + zoff*axyz;
    axz= axz + yoff*axyz;
    ayz= ayz + xoff*axyz;
@@ -421,121 +426,122 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(con
 
    const real o = omega;
 
-   f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o));
-   f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o));
-   f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o));
-   f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o));
-   f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o));
-   f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o));
-   f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o));
-   f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o));
-   f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o));
+   f_E = eps_new*((c2o1*(-c2o1*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(c27o1*o));
+   f_N = eps_new*((c2o1*(ax - c2o1*by + cz+c2o1*kxxMyyAverage-kxxMzzAverage))/(c27o1*o));
+   f_T = eps_new*((c2o1*(ax + by - c2o1*cz-kxxMyyAverage+c2o1*kxxMzzAverage))/(c27o1*o));
+   f_NE = eps_new*(-(ax + c3o1*ay + c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage+c3o1*kxyAverage)/(c54o1*o));
+   f_SE = eps_new*(-(ax - c3o1*ay - c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage-c3o1*kxyAverage)/(c54o1*o));
+   f_TE = eps_new*(-(ax + c3o1*az - c2o1*by + c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage+c3o1*kxzAverage)/(c54o1*o));
+   f_BE = eps_new*(-(ax - c3o1*az - c2o1*by - c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage-c3o1*kxzAverage)/(c54o1*o));
+   f_TN = eps_new*(-(-c2o1*ax + by + c3o1*bz + c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage+c3o1*kyzAverage)/(c54o1*o));
+   f_BN = eps_new*(-(-c2o1*ax + by - c3o1*bz - c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage-c3o1*kyzAverage)/(c54o1*o));
    f_ZERO = 0.;
-   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
-   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
-
-   x_E = 0.25*eps_new*((2*(-4*axx + bxy + cxz))/(27.*o));
-   x_N = 0.25*eps_new*((2*(2*axx - 2*bxy + cxz))/(27.*o));
-   x_T = 0.25*eps_new*((2*(2*axx + bxy - 2*cxz))/(27.*o));
-   x_NE = 0.25*eps_new*(-((2*axx + 3*axy + 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_SE = 0.25*eps_new*(-((2*axx - 3*axy - 6*bxx + bxy - 2*cxz))/(54.*o));
-   x_TE = 0.25*eps_new*(-((2*axx + 3*axz - 2*bxy + 6*cxx + cxz))/(54.*o));
-   x_BE = 0.25*eps_new*(-((2*axx - 3*axz - 2*bxy - 6*cxx + cxz))/(54.*o));
-   x_TN = 0.25*eps_new*(-((-4*axx + bxy + 3*bxz + 3*cxy + cxz))/(54.*o));
-   x_BN = 0.25*eps_new*(-((-4*axx + bxy - 3*bxz - 3*cxy + cxz))/(54.*o));
+   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(c72o1*o));
+   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(c72o1*o));
+
+   x_E = 0.25*eps_new*((c2o1*(-c4o1*axx + bxy + cxz))/(c27o1*o));
+   x_N = 0.25*eps_new*((c2o1*(c2o1*axx - c2o1*bxy + cxz))/(c27o1*o));
+   x_T = 0.25*eps_new*((c2o1*(c2o1*axx + bxy - c2o1*cxz))/(c27o1*o));
+   x_NE = 0.25*eps_new*(-((c2o1*axx + c3o1*axy + c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_SE = 0.25*eps_new*(-((c2o1*axx - c3o1*axy - c6o1*bxx + bxy - c2o1*cxz))/(c54o1*o));
+   x_TE = 0.25*eps_new*(-((c2o1*axx + c3o1*axz - c2o1*bxy + c6o1*cxx + cxz))/(c54o1*o));
+   x_BE = 0.25*eps_new*(-((c2o1*axx - c3o1*axz - c2o1*bxy - c6o1*cxx + cxz))/(c54o1*o));
+   x_TN = 0.25*eps_new*(-((-c4o1*axx + bxy + c3o1*bxz + c3o1*cxy + cxz))/(c54o1*o));
+   x_BN = 0.25*eps_new*(-((-c4o1*axx + bxy - c3o1*bxz - c3o1*cxy + cxz))/(c54o1*o));
    x_ZERO = 0.;
-   x_TNE = 0.25*eps_new*(-((axy + axz + 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSW = 0.25*eps_new*(((-axy + axz - 2*bxx + bxz + 2*cxx + cxy))/(72.*o));
-   x_TSE = 0.25*eps_new*(((axy - axz + 2*bxx + bxz - 2*cxx + cxy))/(72.*o));
-   x_TNW = 0.25*eps_new*(((axy + axz + 2*bxx - bxz + 2*cxx - cxy))/(72.*o));
-
-   y_E = 0.25*eps_new*(2*(-2*axy + 2*byy + cyz))/(27.*o);
-   y_N = 0.25*eps_new*(2*(axy - 4*byy + cyz))/(27.*o);
-   y_T = 0.25*eps_new*(2*(axy + 2*byy - 2*cyz))/(27.*o);
-   y_NE = 0.25*eps_new*(-((axy + 6*ayy + 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_SE = 0.25*eps_new*(-((axy - 6*ayy - 3*bxy + 2*byy - 2*cyz))/(54.*o));
-   y_TE = 0.25*eps_new*(-((axy + 3*ayz - 4*byy + 3*cxy + cyz))/(54.*o));
-   y_BE = 0.25*eps_new*(-((axy - 3*ayz - 4*byy - 3*cxy + cyz))/(54.*o));
-   y_TN = 0.25*eps_new*(-((-2*axy + 2*byy + 3*byz + 6*cyy + cyz))/(54.*o));
-   y_BN = 0.25*eps_new*(-((-2*axy + 2*byy - 3*byz - 6*cyy + cyz))/(54.*o));
+   x_TNE = 0.25*eps_new*(-((axy + axz + c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSW = 0.25*eps_new*(((-axy + axz - c2o1*bxx + bxz + c2o1*cxx + cxy))/(c72o1*o));
+   x_TSE = 0.25*eps_new*(((axy - axz + c2o1*bxx + bxz - c2o1*cxx + cxy))/(c72o1*o));
+   x_TNW = 0.25*eps_new*(((axy + axz + c2o1*bxx - bxz + c2o1*cxx - cxy))/(c72o1*o));
+
+   y_E = 0.25*eps_new*(c2o1*(-c2o1*axy + c2o1*byy + cyz))/(c27o1*o);
+   y_N = 0.25*eps_new*(c2o1*(axy - c4o1*byy + cyz))/(c27o1*o);
+   y_T = 0.25*eps_new*(c2o1*(axy + c2o1*byy - c2o1*cyz))/(c27o1*o);
+   y_NE = 0.25*eps_new*(-((axy + c6o1*ayy + c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_SE = 0.25*eps_new*(-((axy - c6o1*ayy - c3o1*bxy + c2o1*byy - c2o1*cyz))/(c54o1*o));
+   y_TE = 0.25*eps_new*(-((axy + c3o1*ayz - c4o1*byy + c3o1*cxy + cyz))/(c54o1*o));
+   y_BE = 0.25*eps_new*(-((axy - c3o1*ayz - c4o1*byy - c3o1*cxy + cyz))/(c54o1*o));
+   y_TN = 0.25*eps_new*(-((-c2o1*axy + c2o1*byy + c3o1*byz + c6o1*cyy + cyz))/(c54o1*o));
+   y_BN = 0.25*eps_new*(-((-c2o1*axy + c2o1*byy - c3o1*byz - c6o1*cyy + cyz))/(c54o1*o));
    y_ZERO = 0.;
-   y_TNE = 0.25*eps_new*(-((2*ayy + ayz + bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSW = 0.25*eps_new*(((-2*ayy + ayz - bxy + byz + cxy + 2*cyy))/(72.*o));
-   y_TSE = 0.25*eps_new*(((2*ayy - ayz + bxy + byz - cxy + 2*cyy))/(72.*o));
-   y_TNW = 0.25*eps_new*(((2*ayy + ayz + bxy - byz + cxy - 2*cyy))/(72.*o));
-
-   z_E = 0.25*eps_new*((2*(-2*axz + byz + 2*czz))/(27.*o));
-   z_N = 0.25*eps_new*((2*(axz - 2*byz + 2*czz))/(27.*o));
-   z_T = 0.25*eps_new*((2*(axz + byz - 4*czz))/(27.*o));
-   z_NE = 0.25*eps_new*(-((axz + 3*ayz + 3*bxz + byz - 4*czz))/(54.*o));
-   z_SE = 0.25*eps_new*(-((axz - 3*ayz - 3*bxz + byz - 4*czz))/(54.*o));
-   z_TE = 0.25*eps_new*(-((axz + 6*azz - 2*byz + 3*cxz + 2*czz))/(54.*o));
-   z_BE = 0.25*eps_new*(-((axz - 6*azz - 2*byz - 3*cxz + 2*czz))/(54.*o));
-   z_TN = 0.25*eps_new*(-((-2*axz + byz + 6*bzz + 3*cyz + 2*czz))/(54.*o));
-   z_BN = 0.25*eps_new*(-((-2*axz + byz - 6*bzz - 3*cyz + 2*czz))/(54.*o));
+   y_TNE = 0.25*eps_new*(-((c2o1*ayy + ayz + bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSW = 0.25*eps_new*(((-c2o1*ayy + ayz - bxy + byz + cxy + c2o1*cyy))/(c72o1*o));
+   y_TSE = 0.25*eps_new*(((c2o1*ayy - ayz + bxy + byz - cxy + c2o1*cyy))/(c72o1*o));
+   y_TNW = 0.25*eps_new*(((c2o1*ayy + ayz + bxy - byz + cxy - c2o1*cyy))/(c72o1*o));
+
+   z_E = 0.25*eps_new*((c2o1*(-c2o1*axz + byz + c2o1*czz))/(c27o1*o));
+   z_N = 0.25*eps_new*((c2o1*(axz - c2o1*byz + c2o1*czz))/(c27o1*o));
+   z_T = 0.25*eps_new*((c2o1*(axz + byz - c4o1*czz))/(c27o1*o));
+   z_NE = 0.25*eps_new*(-((axz + c3o1*ayz + c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_SE = 0.25*eps_new*(-((axz - c3o1*ayz - c3o1*bxz + byz - c4o1*czz))/(c54o1*o));
+   z_TE = 0.25*eps_new*(-((axz + c6o1*azz - c2o1*byz + c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_BE = 0.25*eps_new*(-((axz - c6o1*azz - c2o1*byz - c3o1*cxz + c2o1*czz))/(c54o1*o));
+   z_TN = 0.25*eps_new*(-((-c2o1*axz + byz + c6o1*bzz + c3o1*cyz + c2o1*czz))/(c54o1*o));
+   z_BN = 0.25*eps_new*(-((-c2o1*axz + byz - c6o1*bzz - c3o1*cyz + c2o1*czz))/(c54o1*o));
    z_ZERO = 0.;
-   z_TNE = 0.25*eps_new*(-((ayz + 2*azz + bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSW = 0.25*eps_new*(((-ayz + 2*azz - bxz + 2*bzz + cxz + cyz))/(72.*o));
-   z_TSE = 0.25*eps_new*(((ayz - 2*azz + bxz + 2*bzz - cxz + cyz))/(72.*o));
-   z_TNW = 0.25*eps_new*(((ayz + 2*azz + bxz - 2*bzz + cxz - cyz))/(72.*o));
-
-   xy_E   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_N   =   0.0625*eps_new *((                       2.*cxyz)/(27.*o));
-   xy_T   = -(0.0625*eps_new *((                       4.*cxyz)/(27.*o)));
-   xy_NE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_SE  =   0.0625*eps_new *(                            cxyz /(27.*o));
-   xy_TE  = -(0.0625*eps_new *(( 3.*axyz            +     cxyz)/(54.*o)));
-   xy_BE  = -(0.0625*eps_new *((-3.*axyz            +     cxyz)/(54.*o)));
-   xy_TN  = -(0.0625*eps_new *((            3.*bxyz +     cxyz)/(54.*o)));
-   xy_BN  = -(0.0625*eps_new *((          - 3.*bxyz +     cxyz)/(54.*o)));
-   //xy_ZERO=   0.0625*eps_new;
-   xy_TNE = -(0.0625*eps_new *((     axyz +     bxyz           )/(72.*o)));
-   xy_TSW =   0.0625*eps_new *((     axyz +     bxyz           )/(72.*o));
-   xy_TSE =   0.0625*eps_new *((-    axyz +     bxyz           )/(72.*o));
-   xy_TNW =   0.0625*eps_new *((     axyz -     bxyz           )/(72.*o));
-
-   xz_E   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_N   = -(0.0625*eps_new *((            4.*bxyz           )/(27.*o)));
-   xz_T   =   0.0625*eps_new *((            2.*bxyz           )/(27.*o));
-   xz_NE  = -(0.0625*eps_new *(( 3.*axyz +     bxyz           )/(54.*o)));
-   xz_SE  = -(0.0625*eps_new *((-3.*axyz +     bxyz           )/(54.*o)));
-   xz_TE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_BE  =   0.0625*eps_new *((                bxyz           )/(27.*o));
-   xz_TN  = -(0.0625*eps_new *((                bxyz + 3.*cxyz)/(54.*o)));
-   xz_BN  = -(0.0625*eps_new *((                bxyz - 3.*cxyz)/(54.*o)));
-   //xz_ZERO=   0.0625*eps_new;
-   xz_TNE = -(0.0625*eps_new *((     axyz            +     cxyz)/(72.*o)));
-   xz_TSW =   0.0625*eps_new *((-    axyz            +     cxyz)/(72.*o));
-   xz_TSE =   0.0625*eps_new *((     axyz            +     cxyz)/(72.*o));
-   xz_TNW =   0.0625*eps_new *((     axyz            -     cxyz)/(72.*o));
-
-   yz_E   = -(0.0625*eps_new *(( 4.*axyz                      )/(27.*o)));
-   yz_N   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_T   =   0.0625*eps_new *(( 2.*axyz                      )/(27.*o));
-   yz_NE  = -(0.0625*eps_new *((     axyz + 3.*bxyz           )/(54.*o)));
-   yz_SE  = -(0.0625*eps_new *((     axyz - 3.*bxyz           )/(54.*o)));
-   yz_TE  = -(0.0625*eps_new *((     axyz            + 3.*cxyz)/(54.*o)));
-   yz_BE  = -(0.0625*eps_new *((     axyz            - 3.*cxyz)/(54.*o)));
-   yz_TN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   yz_BN  =   0.0625*eps_new *((     axyz                      )/(27.*o));
-   //yz_ZERO=   0.0625*eps_new;
-   yz_TNE = -(0.0625*eps_new *((                bxyz +     cxyz)/(72.*o)));
-   yz_TSW =   0.0625*eps_new *((          -     bxyz +     cxyz)/(72.*o));
-   yz_TSE =   0.0625*eps_new *((                bxyz -     cxyz)/(72.*o));
-   yz_TNW =   0.0625*eps_new *((                bxyz +     cxyz)/(72.*o));
+   z_TNE = 0.25*eps_new*(-((ayz + c2o1*azz + bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSW = 0.25*eps_new*(((-ayz + c2o1*azz - bxz + c2o1*bzz + cxz + cyz))/(c72o1*o));
+   z_TSE = 0.25*eps_new*(((ayz - c2o1*azz + bxz + c2o1*bzz - cxz + cyz))/(c72o1*o));
+   z_TNW = 0.25*eps_new*(((ayz + c2o1*azz + bxz - c2o1*bzz + cxz - cyz))/(c72o1*o));
+
+   xy_E   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_N   =   c1o16*eps_new *((                       c2o1*cxyz)/(c27o1*o));
+   xy_T   = -(c1o16*eps_new *((                       c4o1*cxyz)/(c27o1*o)));
+   xy_NE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_SE  =   c1o16*eps_new *(                            cxyz /(c27o1*o));
+   xy_TE  = -(c1o16*eps_new *(( c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_BE  = -(c1o16*eps_new *((-c3o1*axyz            +     cxyz)/(c54o1*o)));
+   xy_TN  = -(c1o16*eps_new *((            c3o1*bxyz +     cxyz)/(c54o1*o)));
+   xy_BN  = -(c1o16*eps_new *((          - c3o1*bxyz +     cxyz)/(c54o1*o)));
+   //xy_ZERO=   c1o16*eps_new;
+   xy_TNE = -(c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o)));
+   xy_TSW =   c1o16*eps_new *((     axyz +     bxyz           )/(c72o1*o));
+   xy_TSE =   c1o16*eps_new *((-    axyz +     bxyz           )/(c72o1*o));
+   xy_TNW =   c1o16*eps_new *((     axyz -     bxyz           )/(c72o1*o));
+
+   xz_E   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_N   = -(c1o16*eps_new *((            c4o1*bxyz           )/(c27o1*o)));
+   xz_T   =   c1o16*eps_new *((            c2o1*bxyz           )/(c27o1*o));
+   xz_NE  = -(c1o16*eps_new *(( c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_SE  = -(c1o16*eps_new *((-c3o1*axyz +     bxyz           )/(c54o1*o)));
+   xz_TE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_BE  =   c1o16*eps_new *((                bxyz           )/(c27o1*o));
+   xz_TN  = -(c1o16*eps_new *((                bxyz + c3o1*cxyz)/(c54o1*o)));
+   xz_BN  = -(c1o16*eps_new *((                bxyz - c3o1*cxyz)/(c54o1*o)));
+   //xz_ZERO=   c1o16*eps_new;
+   xz_TNE = -(c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o)));
+   xz_TSW =   c1o16*eps_new *((-    axyz            +     cxyz)/(c72o1*o));
+   xz_TSE =   c1o16*eps_new *((     axyz            +     cxyz)/(c72o1*o));
+   xz_TNW =   c1o16*eps_new *((     axyz            -     cxyz)/(c72o1*o));
+
+   yz_E   = -(c1o16*eps_new *(( c4o1*axyz                      )/(c27o1*o)));
+   yz_N   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_T   =   c1o16*eps_new *(( c2o1*axyz                      )/(c27o1*o));
+   yz_NE  = -(c1o16*eps_new *((     axyz + c3o1*bxyz           )/(c54o1*o)));
+   yz_SE  = -(c1o16*eps_new *((     axyz - c3o1*bxyz           )/(c54o1*o)));
+   yz_TE  = -(c1o16*eps_new *((     axyz            + c3o1*cxyz)/(c54o1*o)));
+   yz_BE  = -(c1o16*eps_new *((     axyz            - c3o1*cxyz)/(c54o1*o)));
+   yz_TN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   yz_BN  =   c1o16*eps_new *((     axyz                      )/(c27o1*o));
+   //yz_ZERO=   c1o16*eps_new;
+   yz_TNE = -(c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o)));
+   yz_TSW =   c1o16*eps_new *((          -     bxyz +     cxyz)/(c72o1*o));
+   yz_TSE =   c1o16*eps_new *((                bxyz -     cxyz)/(c72o1*o));
+   yz_TNW =   c1o16*eps_new *((                bxyz +     cxyz)/(c72o1*o));
 }
 //////////////////////////////////////////////////////////////////////////
 void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNode(real* f, real  /*omega*/, real  /*x*/, real  /*y*/, real  /*z*/, real press, real xs, real ys, real zs)
 {
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
+   using namespace vf::lbm::constant;
 
    real rho  = press ;//+ (2.*axx*x+axy*y+axz*z+axyz*y*z+ax + 2.*byy*y+bxy*x+byz*z+bxyz*x*z+by + 2.*czz*z+cxz*x+cyz*y+cxyz*x*y+cz)/3.;
-   real vx1  = a0 + 0.25*( xs*ax + ys*ay + zs*az) + 0.0625*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + 0.015625*(xs*ys*zs*axyz);
-   real vx2  = b0 + 0.25*( xs*bx + ys*by + zs*bz) + 0.0625*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + 0.015625*(xs*ys*zs*bxyz);
-   real vx3  = c0 + 0.25*( xs*cx + ys*cy + zs*cz) + 0.0625*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + 0.015625*(xs*ys*zs*cxyz);
+   real vx1  = a0 + c1o4*( xs*ax + ys*ay + zs*az) + c1o16*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + c1o64*(xs*ys*zs*axyz);
+   real vx2  = b0 + c1o4*( xs*bx + ys*by + zs*bz) + c1o16*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + c1o64*(xs*ys*zs*bxyz);
+   real vx3  = c0 + c1o4*( xs*cx + ys*cy + zs*cz) + c1o16*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + c1o64*(xs*ys*zs*cxyz);
 
    //////////////////////////////////////////////////////////////////////////
    //DRAFT
@@ -577,105 +583,121 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNode(real* f, r
 //Position SWB -0.25, -0.25, -0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressBSW()
 {
-   return   press_SWT * (0.140625 + 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NET * (0.015625 - 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.421875 + 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_SWT * (c9o64 + c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NET * (c1o64 - c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c27o64 + c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWT -0.25, -0.25, 0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressTSW()
 {
-   return   press_SWT * (0.421875 + 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NEB * (0.015625 - 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_SWT * (c27o64 + c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NEB * (c1o64 - c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SET 0.25, -0.25, 0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressTSE()
 {
-   return   press_SET * (0.421875 - 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.015625 + 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_SET * (c27o64 - c9o16 * xoff + c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c3o16 * xoff - c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c9o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c3o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c1o64 + c1o16 * xoff - c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c1o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SEB 0.25, -0.25, -0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressBSE()
 {
-   return   press_SET * (0.140625 - 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) +
-      press_NWT * (0.015625 + 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.421875 - 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_SET * (c9o64 - c3o16 * xoff + c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c1o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c1o16 * yoff - c3o16 * zoff) +
+      press_NWT * (c1o64 + c1o16 * xoff - c1o16 * yoff - c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c9o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c9o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c27o64 - c9o16 * xoff + c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWB -0.25, 0.25, -0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressBNW()
 {
-   return   press_NWT * (0.140625 + 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NET * (0.046875 - 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.015625 - 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.046875 - 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.140625 - 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.140625 + 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.421875 + 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_NWT * (c9o64 + c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NET * (c3o64 - c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c1o64 - c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c3o64 - c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c9o64 - c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c9o64 + c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c27o64 + c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NWT -0.25, 0.25, 0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressTNW()
 {
-   return   press_NWT * (0.421875 + 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NET * (0.140625 - 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.140625 + 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SEB * (0.015625 - 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NEB * (0.046875 - 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SWB * (0.046875 + 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NWB * (0.140625 + 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_NWT * (c27o64 + c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NET * (c9o64 - c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c9o64 + c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SEB * (c1o64 - c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NEB * (c3o64 - c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SWB * (c3o64 + c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NWB * (c9o64 + c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NET 0.25, 0.25, 0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressTNE()
 {
-   return   press_NET * (0.421875 - 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.140625 + 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) +
-      press_SET * (0.140625 - 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.046875 + 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.015625 + 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.046875 + 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.046875 - 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.140625 - 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_NET * (c27o64 - c9o16 * xoff - c9o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c9o64 + c9o16 * xoff - c3o16 * yoff - c3o16 * zoff) +
+      press_SET * (c9o64 - c3o16 * xoff + c9o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c3o64 + c3o16 * xoff + c3o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c1o64 + c1o16 * xoff + c1o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c3o64 + c3o16 * xoff - c1o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c3o64 - c1o16 * xoff + c3o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c9o64 - c3o16 * xoff - c3o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position NEB 0.25, 0.25, -0.25
 real IncompressibleOffsetInterpolationProcessor::calcPressBNE()
 {
-   return   press_NET * (0.140625 - 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) +
-      press_NWT * (0.046875 + 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) +
-      press_SET * (0.046875 - 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) +
-      press_SWT * (0.015625 + 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) +
-      press_SWB * (0.046875 + 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) +
-      press_NWB * (0.140625 + 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) +
-      press_SEB * (0.140625 - 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) +
-      press_NEB * (0.421875 - 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff);
+    using namespace vf::lbm::constant;
+
+   return   press_NET * (c9o64 - c3o16 * xoff - c3o16 * yoff - c9o16 * zoff) +
+      press_NWT * (c3o64 + c3o16 * xoff - c1o16 * yoff - c3o16 * zoff) +
+      press_SET * (c3o64 - c1o16 * xoff + c3o16 * yoff - c3o16 * zoff) +
+      press_SWT * (c1o64 + c1o16 * xoff + c1o16 * yoff - c1o16 * zoff) +
+      press_SWB * (c3o64 + c3o16 * xoff + c3o16 * yoff + c1o16 * zoff) +
+      press_NWB * (c9o64 + c9o16 * xoff - c3o16 * yoff + c3o16 * zoff) +
+      press_SEB * (c9o64 - c3o16 * xoff + c9o16 * yoff + c3o16 * zoff) +
+      press_NEB * (c27o64 - c9o16 * xoff - c9o16 * yoff + c9o16 * zoff);
 }
 //////////////////////////////////////////////////////////////////////////
 //Position C 0.0, 0.0, 0.0
@@ -683,15 +705,16 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(real* f,
 {
    using namespace D3Q27System;
    using namespace vf::lbm::dir;
-
-   real press  =  press_NET * (0.125 - 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_NWT * (0.125 + 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) +
-      press_SET * (0.125 - 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_SWT * (0.125 + 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) +
-      press_NEB * (0.125 - 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_NWB * (0.125 + 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) +
-      press_SEB * (0.125 - 0.25 * xoff + 0.25 * yoff + 0.25 * zoff) +
-      press_SWB * (0.125 + 0.25 * xoff + 0.25 * yoff + 0.25 * zoff);
+   using namespace vf::lbm::constant;
+
+   real press  =  press_NET * (c4o32 - c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_NWT * (c4o32 + c1o4 * xoff - c1o4 * yoff - c1o4 * zoff) +
+      press_SET * (c4o32 - c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_SWT * (c4o32 + c1o4 * xoff + c1o4 * yoff - c1o4 * zoff) +
+      press_NEB * (c4o32 - c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_NWB * (c4o32 + c1o4 * xoff - c1o4 * yoff + c1o4 * zoff) +
+      press_SEB * (c4o32 - c1o4 * xoff + c1o4 * yoff + c1o4 * zoff) +
+      press_SWB * (c4o32 + c1o4 * xoff + c1o4 * yoff + c1o4 * zoff);
    real vx1  = a0;
    real vx2  = b0;
    real vx3  = c0;
@@ -706,7 +729,7 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(real* f,
    real feq[ENDF+1];
    D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3);
 
-   real eps_new = 2.;
+   real eps_new = c2o1;
    real o  = omega;
 //   LBMReal op = 1.;
 
@@ -725,20 +748,20 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(real* f,
    //f_TSE  = - eps_new *((az + cx)/(36.*o)) - f_TNE;
    //f_TNW  = - eps_new *((bz + cy)/(36.*o)) - f_TNE;
 
-   f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o));
-   f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o));
-   f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o));
-   f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o));
-   f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o));
-   f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o));
-   f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o));
-   f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o));
-   f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o));
-   f_ZERO = 0.;
-   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o));
-   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
-   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
+   f_E = eps_new*((c2o1*(-c2o1*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(c27o1*o));
+   f_N = eps_new*((c2o1*(ax - c2o1*by + cz+c2o1*kxxMyyAverage-kxxMzzAverage))/(c27o1*o));
+   f_T = eps_new*((c2o1*(ax + by - c2o1*cz-kxxMyyAverage+c2o1*kxxMzzAverage))/(c27o1*o));
+   f_NE = eps_new*(-(ax + c3o1*ay + c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage+c3o1*kxyAverage)/(c54o1*o));
+   f_SE = eps_new*(-(ax - c3o1*ay - c3o1*bx + by - c2o1*cz+c2o1*kxxMyyAverage-kxxMyyAverage-c3o1*kxyAverage)/(c54o1*o));
+   f_TE = eps_new*(-(ax + c3o1*az - c2o1*by + c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage+c3o1*kxzAverage)/(c54o1*o));
+   f_BE = eps_new*(-(ax - c3o1*az - c2o1*by - c3o1*cx + cz+c2o1*kxxMyyAverage-kxxMzzAverage-c3o1*kxzAverage)/(c54o1*o));
+   f_TN = eps_new*(-(-c2o1*ax + by + c3o1*bz + c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage+c3o1*kyzAverage)/(c54o1*o));
+   f_BN = eps_new*(-(-c2o1*ax + by - c3o1*bz - c3o1*cy + cz-kxxMyyAverage-kxxMzzAverage-c3o1*kyzAverage)/(c54o1*o));
+   f_ZERO = c0o1;
+   f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(c72o1*o));
+   f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(c72o1*o));
+   f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(c72o1*o));
 
    f[DIR_P00]    = f_E    + feq[DIR_P00];
    f[DIR_M00]    = f_E    + feq[DIR_M00];
@@ -778,10 +801,12 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedVelocity(real x
 //////////////////////////////////////////////////////////////////////////
 void IncompressibleOffsetInterpolationProcessor::calcInterpolatedShearStress(real x, real y, real z,real& tauxx, real& tauyy, real& tauzz,real& tauxy, real& tauxz, real& tauyz)
 {
-	tauxx=ax+2*axx*x+axy*y+axz*z+axyz*y*z;
-	tauyy=by+2*byy*y+bxy*x+byz*z+bxyz*x*z;
-	tauzz=cz+2*czz*z+cxz*x+cyz*y+cxyz*x*y;
-	tauxy=0.5*((ay+2.0*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+2.0*bxx*x+bxy*y+bxz*z+bxyz*y*z));
-	tauxz=0.5*((az+2.0*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+2.0*cxx*x+cxy*y+cxz*z+cxyz*y*z));
-	tauyz=0.5*((bz+2.0*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+2.0*cyy*y+cxy*x+cyz*z+cxyz*x*z));
+    using namespace vf::lbm::constant;
+
+	tauxx=ax+c2o1*axx*x+axy*y+axz*z+axyz*y*z;
+	tauyy=by+c2o1*byy*y+bxy*x+byz*z+bxyz*x*z;
+	tauzz=cz+c2o1*czz*z+cxz*x+cyz*y+cxyz*x*y;
+	tauxy=c1o2*((ay+c2o1*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+c2o1*bxx*x+bxy*y+bxz*z+bxyz*y*z));
+	tauxz=c1o2*((az+c2o1*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+c2o1*cxx*x+cxy*y+cxz*z+cxyz*y*z));
+	tauyz=c1o2*((bz+c2o1*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+c2o1*cyy*y+cxy*x+cyz*z+cxyz*x*z));
 }
diff --git a/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp
index 6c1c550fdce46eb91b7e33bedf5854c2d0ffe7b5..49d66b39ccd887516f2be1caa78df0349b01b883 100644
--- a/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp
@@ -1,6 +1,6 @@
 #include "InitDensityLBMKernel.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "DataSet3D.h"
 #include "BCArray3D.h"
 #include "lbm/constants/NumericConstants.h"
@@ -30,7 +30,7 @@ SPtr<LBMKernel> InitDensityLBMKernel::clone()
    kernel->setNX(nx);
    dynamicPointerCast<InitDensityLBMKernel>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -61,7 +61,7 @@ real InitDensityLBMKernel::getCalculationTime()
 //   nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
 //   zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 //
-//   BCArray3D<D3Q27BoundaryCondition>& bcArray = dynamicPointerCast<D3Q27ETBCProcessor>(this->getBCProcessor())->getBCArray();
+//   BCArray3D<D3Q27BoundaryCondition>& bcArray = dynamicPointerCast<D3Q27ETBCSet>(this->getBCSet())->getBCArray();
 //
 //   const int bcArrayMaxX1 = (int)bcArray->getNX1();
 //   const int bcArrayMaxX2 = (int)bcArray->getNX2();
@@ -864,7 +864,7 @@ void InitDensityLBMKernel::calculate(int  /*step*/)
    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
    SPtr<BoundaryConditions> bcPtr;
    real f[D3Q27System::ENDF+1];
    real feq[D3Q27System::ENDF+1];
@@ -960,32 +960,32 @@ void InitDensityLBMKernel::calculate(int  /*step*/)
                real cu_sq = 1.5*(vx1*vx1+vx2*vx2+vx3*vx3);
 
                feq[DIR_000] = c8o27*(drho-cu_sq);
-               feq[DIR_P00] = c2o27*(drho+3.0*(vx1)+c9o2*(vx1)*(vx1)-cu_sq);
-               feq[DIR_M00] = c2o27*(drho+3.0*(-vx1)+c9o2*(-vx1)*(-vx1)-cu_sq);
-               feq[DIR_0P0] = c2o27*(drho+3.0*(vx2)+c9o2*(vx2)*(vx2)-cu_sq);
-               feq[DIR_0M0] = c2o27*(drho+3.0*(-vx2)+c9o2*(-vx2)*(-vx2)-cu_sq);
-               feq[DIR_00P] = c2o27*(drho+3.0*(vx3)+c9o2*(vx3)*(vx3)-cu_sq);
-               feq[DIR_00M] = c2o27*(drho+3.0*(-vx3)+c9o2*(-vx3)*(-vx3)-cu_sq);
-               feq[DIR_PP0] = c1o54*(drho+3.0*(vx1+vx2)+c9o2*(vx1+vx2)*(vx1+vx2)-cu_sq);
-               feq[DIR_MM0] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
-               feq[DIR_PM0] = c1o54*(drho+3.0*(vx1-vx2)+c9o2*(vx1-vx2)*(vx1-vx2)-cu_sq);
-               feq[DIR_MP0] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
-               feq[DIR_P0P] = c1o54*(drho+3.0*(vx1+vx3)+c9o2*(vx1+vx3)*(vx1+vx3)-cu_sq);
-               feq[DIR_M0M] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
-               feq[DIR_P0M] = c1o54*(drho+3.0*(vx1-vx3)+c9o2*(vx1-vx3)*(vx1-vx3)-cu_sq);
-               feq[DIR_M0P] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
-               feq[DIR_0PP] = c1o54*(drho+3.0*(vx2+vx3)+c9o2*(vx2+vx3)*(vx2+vx3)-cu_sq);
-               feq[DIR_0MM] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
-               feq[DIR_0PM] = c1o54*(drho+3.0*(vx2-vx3)+c9o2*(vx2-vx3)*(vx2-vx3)-cu_sq);
-               feq[DIR_0MP] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
-               feq[DIR_PPP] = c1o216*(drho+3.0*(vx1+vx2+vx3)+c9o2*(vx1+vx2+vx3)*(vx1+vx2+vx3)-cu_sq);
-               feq[DIR_MMM] = c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-               feq[DIR_PPM] = c1o216*(drho+3.0*(vx1+vx2-vx3)+c9o2*(vx1+vx2-vx3)*(vx1+vx2-vx3)-cu_sq);
-               feq[DIR_MMP] = c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-               feq[DIR_PMP] = c1o216*(drho+3.0*(vx1-vx2+vx3)+c9o2*(vx1-vx2+vx3)*(vx1-vx2+vx3)-cu_sq);
-               feq[DIR_MPM] = c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-               feq[DIR_PMM] = c1o216*(drho+3.0*(vx1-vx2-vx3)+c9o2*(vx1-vx2-vx3)*(vx1-vx2-vx3)-cu_sq);
-               feq[DIR_MPP] = c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+               feq[DIR_P00] = c2o27*(drho+c3o1*(vx1)+c9o2*(vx1)*(vx1)-cu_sq);
+               feq[DIR_M00] = c2o27*(drho+c3o1*(-vx1)+c9o2*(-vx1)*(-vx1)-cu_sq);
+               feq[DIR_0P0] = c2o27*(drho+c3o1*(vx2)+c9o2*(vx2)*(vx2)-cu_sq);
+               feq[DIR_0M0] = c2o27*(drho+c3o1*(-vx2)+c9o2*(-vx2)*(-vx2)-cu_sq);
+               feq[DIR_00P] = c2o27*(drho+c3o1*(vx3)+c9o2*(vx3)*(vx3)-cu_sq);
+               feq[DIR_00M] = c2o27*(drho+c3o1*(-vx3)+c9o2*(-vx3)*(-vx3)-cu_sq);
+               feq[DIR_PP0] = c1o54*(drho+c3o1*(vx1+vx2)+c9o2*(vx1+vx2)*(vx1+vx2)-cu_sq);
+               feq[DIR_MM0] = c1o54*(drho+c3o1*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
+               feq[DIR_PM0] = c1o54*(drho+c3o1*(vx1-vx2)+c9o2*(vx1-vx2)*(vx1-vx2)-cu_sq);
+               feq[DIR_MP0] = c1o54*(drho+c3o1*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
+               feq[DIR_P0P] = c1o54*(drho+c3o1*(vx1+vx3)+c9o2*(vx1+vx3)*(vx1+vx3)-cu_sq);
+               feq[DIR_M0M] = c1o54*(drho+c3o1*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
+               feq[DIR_P0M] = c1o54*(drho+c3o1*(vx1-vx3)+c9o2*(vx1-vx3)*(vx1-vx3)-cu_sq);
+               feq[DIR_M0P] = c1o54*(drho+c3o1*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
+               feq[DIR_0PP] = c1o54*(drho+c3o1*(vx2+vx3)+c9o2*(vx2+vx3)*(vx2+vx3)-cu_sq);
+               feq[DIR_0MM] = c1o54*(drho+c3o1*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
+               feq[DIR_0PM] = c1o54*(drho+c3o1*(vx2-vx3)+c9o2*(vx2-vx3)*(vx2-vx3)-cu_sq);
+               feq[DIR_0MP] = c1o54*(drho+c3o1*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
+               feq[DIR_PPP] = c1o216*(drho+c3o1*(vx1+vx2+vx3)+c9o2*(vx1+vx2+vx3)*(vx1+vx2+vx3)-cu_sq);
+               feq[DIR_MMM] = c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+               feq[DIR_PPM] = c1o216*(drho+c3o1*(vx1+vx2-vx3)+c9o2*(vx1+vx2-vx3)*(vx1+vx2-vx3)-cu_sq);
+               feq[DIR_MMP] = c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+               feq[DIR_PMP] = c1o216*(drho+c3o1*(vx1-vx2+vx3)+c9o2*(vx1-vx2+vx3)*(vx1-vx2+vx3)-cu_sq);
+               feq[DIR_MPM] = c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+               feq[DIR_PMM] = c1o216*(drho+c3o1*(vx1-vx2-vx3)+c9o2*(vx1-vx2-vx3)*(vx1-vx2-vx3)-cu_sq);
+               feq[DIR_MPP] = c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 
                //Relaxation
                f[DIR_000] += (feq[DIR_000]-f[DIR_000])*collFactor;
diff --git a/src/cpu/VirtualFluidsCore/LBM/InterpolationHelper.cpp b/src/cpu/VirtualFluidsCore/LBM/InterpolationHelper.cpp
index 33bf1e623ce943d4edf3b11c3f51ad585adf4262..01aeb9bd6e74f18796832c128f67e37320b364d6 100644
--- a/src/cpu/VirtualFluidsCore/LBM/InterpolationHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/InterpolationHelper.cpp
@@ -7,15 +7,15 @@ InterpolationHelper::~InterpolationHelper() = default;
 void InterpolationHelper::interpolate8to1(D3Q27ICell &icellF, real *icellC, real /*x1*/, real /*x2*/,
                                           real /*x3*/, real omega)
 {
-    iProcessor->calcInterpolatedCoefficiets(icellF, omega, 1.0);
+    iProcessor->calcInterpolatedCoefficiets(icellF, omega, vf::lbm::constant::c1o1);
     iProcessor->calcInterpolatedNodeFC(icellC, omega);
 }
 //////////////////////////////////////////////////////////////////////////
 void InterpolationHelper::interpolate8to1WithVelocity(D3Q27ICell &icellF, real x1, real x2, real x3,
                                                       real omega, real &vx1, real &vx2, real &vx3)
 {
-    iProcessor->setOffsets(0.0, 0.0, 0.0);
-    iProcessor->calcInterpolatedCoefficiets(icellF, omega, 0.0);
+    iProcessor->setOffsets(vf::lbm::constant::c0o1, vf::lbm::constant::c0o1, vf::lbm::constant::c0o1);
+    iProcessor->calcInterpolatedCoefficiets(icellF, omega, vf::lbm::constant::c0o1);
     iProcessor->calcInterpolatedVelocity(x1, x2, x3, vx1, vx2, vx3);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -25,8 +25,8 @@ void InterpolationHelper::interpolate8to1WithVelocityWithShearStress(D3Q27ICell
                                                                      real &tauyy, real &tauzz, real &tauxy,
                                                                      real &tauxz, real &tauyz)
 {
-    iProcessor->setOffsets(0.0, 0.0, 0.0);
-    iProcessor->calcInterpolatedCoefficiets(icellF, omega, 0.0);
+    iProcessor->setOffsets(vf::lbm::constant::c0o1, vf::lbm::constant::c0o1, vf::lbm::constant::c0o1);
+    iProcessor->calcInterpolatedCoefficiets(icellF, omega, vf::lbm::constant::c0o1);
     iProcessor->calcInterpolatedVelocity(x1, x2, x3, vx1, vx2, vx3);
     iProcessor->calcInterpolatedShearStress(x1, x2, x3, tauxx, tauyy, tauzz, tauxy, tauxz, tauyz);
 }
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp
index 0f9a9a96586268c872562e4d2ddfab5ef8e6377c..d78bfc9c150ce8e4c97e5a9f20ae7c16edcf991d 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp
@@ -33,7 +33,7 @@
 
 #include "LBMKernel.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 
@@ -49,9 +49,9 @@ LBMKernel::LBMKernel()
     this->nx[2] = 0;
 }
 //////////////////////////////////////////////////////////////////////////
-void LBMKernel::setBCProcessor(SPtr<BCProcessor> bcp) { bcProcessor = bcp; }
+void LBMKernel::setBCSet(SPtr<BCSet> bcp) { bcSet = bcp; }
 //////////////////////////////////////////////////////////////////////////
-SPtr<BCProcessor> LBMKernel::getBCProcessor() const { return bcProcessor; }
+SPtr<BCSet> LBMKernel::getBCSet() const { return bcSet; }
 //////////////////////////////////////////////////////////////////////////
 void LBMKernel::setCollisionFactor(real collFactor) { this->collFactor = collFactor; }
 //////////////////////////////////////////////////////////////////////////
@@ -111,7 +111,9 @@ void LBMKernel::setForcingX3(const std::string &muParserString)
 //////////////////////////////////////////////////////////////////////////
 void LBMKernel::checkFunction(mu::Parser fct)
 {
-    real x1 = 1.0, x2 = 1.0, x3 = 1.0, dt = 1.0, nue = 1.0, rho = 1.0;
+    using namespace vf::lbm::constant;
+
+    real x1 = c1o1, x2 = c1o1, x3 = c1o1, dt = c1o1, nue = c1o1, rho = c1o1;
     fct.DefineVar("x1", &x1);
     fct.DefineVar("x2", &x2);
     fct.DefineVar("x3", &x3);
@@ -183,7 +185,7 @@ std::array<int, 3> LBMKernel::getNX() { return nx; }
 //////////////////////////////////////////////////////////////////////////
 bool LBMKernel::isInsideOfDomain(const int &x1, const int &x2, const int &x3) const
 {
-    const SPtr<BCArray3D> bcArray = this->bcProcessor->getBCArray();
+    const SPtr<BCArray3D> bcArray = this->bcSet->getBCArray();
     return bcArray->isInsideOfDomain(x1, x2, x3, ghostLayerWidth);
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
index bc12a1ed93ffc241f4e121207376e44533908259..94de596c262acd7a18ebbbc6b1128fb304469973 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
@@ -41,7 +41,7 @@
 #include <limits>
 #include <muParser.h>
 
-class BCProcessor;
+class BCSet;
 class DataSet3D;
 class Block3D;
 
@@ -59,8 +59,8 @@ public:
     void calculate(int step) override    = 0;
     real getCalculationTime() override = 0;
 
-    void setBCProcessor(SPtr<BCProcessor> bcp) override;
-    SPtr<BCProcessor> getBCProcessor() const override;
+    void setBCSet(SPtr<BCSet> bcp) override;
+    SPtr<BCSet> getBCSet() const override;
 
     void setCollisionFactor(real collFactor) override;
     real getCollisionFactor() const override;
@@ -132,7 +132,7 @@ public:
 
 protected:
     SPtr<DataSet3D> dataSet;
-    SPtr<BCProcessor> bcProcessor;
+    SPtr<BCSet> bcSet;
     real collFactor;
     int ghostLayerWidth{ 1 };
     bool compressible{ false };
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp b/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp
index 081e9fe8ecf850957dc49229379f4e112aa38c17..d0c914707688ebf7c2abd839f8e1c698d33d947c 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp
@@ -3,7 +3,7 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "D3Q27EsoTwist3DSoA.h"
 #include "DataSet3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "BCArray3D.h"
 #include "lbm/constants/NumericConstants.h"
 
@@ -33,7 +33,7 @@ SPtr<LBMKernel> LBMKernelETD3Q27BGK::clone()
    SPtr<LBMKernel> kernel(new LBMKernelETD3Q27BGK());
    std::dynamic_pointer_cast<LBMKernelETD3Q27BGK>(kernel)->initDataSet();
    kernel->setCollisionFactor(this->collFactor);
-   kernel->setBCProcessor(bcProcessor->clone(kernel));
+   kernel->setBCSet(bcSet->clone(kernel));
    kernel->setWithForcing(withForcing);
    kernel->setForcingX1(muForcingX1);
    kernel->setForcingX2(muForcingX2);
@@ -53,9 +53,9 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
       muForcingX1.DefineVar("x1",&muX1); muForcingX1.DefineVar("x2",&muX2); muForcingX1.DefineVar("x3",&muX3);
       muForcingX2.DefineVar("x1",&muX1); muForcingX2.DefineVar("x2",&muX2); muForcingX2.DefineVar("x3",&muX3);
       muForcingX3.DefineVar("x1",&muX1); muForcingX3.DefineVar("x2",&muX2); muForcingX3.DefineVar("x3",&muX3);
-      forcingX1 = 0;
-      forcingX2 = 0;
-      forcingX3 = 0;
+      forcingX1 = c0o1;
+      forcingX2 = c0o1;
+      forcingX3 = c0o1;
    }
    /////////////////////////////////////
 
@@ -63,7 +63,7 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
    nonLocalDistributions = std::dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
    zeroDistributions = std::dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
 
-   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+   SPtr<BCArray3D> bcArray = this->getBCSet()->getBCArray();
    real f[D3Q27System::ENDF+1];
    real feq[D3Q27System::ENDF+1];
    real drho,vx1,vx2,vx3;
@@ -140,35 +140,35 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
                + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] 
                - f[DIR_MPM];
 
-               real cu_sq=1.5*(vx1*vx1+vx2*vx2+vx3*vx3);
+               real cu_sq= c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
                feq[DIR_000] =  c8o27*(drho-cu_sq);
-               feq[DIR_P00] =  c2o27*(drho+3.0*( vx1   )+c9o2*( vx1   )*( vx1   )-cu_sq);
-               feq[DIR_M00] =  c2o27*(drho+3.0*(-vx1   )+c9o2*(-vx1   )*(-vx1   )-cu_sq);
-               feq[DIR_0P0] =  c2o27*(drho+3.0*(    vx2)+c9o2*(    vx2)*(    vx2)-cu_sq);
-               feq[DIR_0M0] =  c2o27*(drho+3.0*(   -vx2)+c9o2*(   -vx2)*(   -vx2)-cu_sq);
-               feq[DIR_00P] =  c2o27*(drho+3.0*( vx3   )+c9o2*(    vx3)*(    vx3)-cu_sq);
-               feq[DIR_00M] =  c2o27*(drho+3.0*(   -vx3)+c9o2*(   -vx3)*(   -vx3)-cu_sq);
-               feq[DIR_PP0] = c1o54*(drho+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq);
-               feq[DIR_MM0] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
-               feq[DIR_PM0] = c1o54*(drho+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq);
-               feq[DIR_MP0] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
-               feq[DIR_P0P] = c1o54*(drho+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq);
-               feq[DIR_M0M] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
-               feq[DIR_P0M] = c1o54*(drho+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq);
-               feq[DIR_M0P] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
-               feq[DIR_0PP] = c1o54*(drho+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq);
-               feq[DIR_0MM] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
-               feq[DIR_0PM] = c1o54*(drho+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq);
-               feq[DIR_0MP] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
-               feq[DIR_PPP]= c1o216*(drho+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-               feq[DIR_MMM]= c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-               feq[DIR_PPM]= c1o216*(drho+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-               feq[DIR_MMP]= c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-               feq[DIR_PMP]= c1o216*(drho+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-               feq[DIR_MPM]= c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-               feq[DIR_PMM]= c1o216*(drho+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-               feq[DIR_MPP]= c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+               feq[DIR_P00] =  c2o27*(drho+c3o1*( vx1   )+c9o2*( vx1   )*( vx1   )-cu_sq);
+               feq[DIR_M00] =  c2o27*(drho+c3o1*(-vx1   )+c9o2*(-vx1   )*(-vx1   )-cu_sq);
+               feq[DIR_0P0] =  c2o27*(drho+c3o1*(    vx2)+c9o2*(    vx2)*(    vx2)-cu_sq);
+               feq[DIR_0M0] =  c2o27*(drho+c3o1*(   -vx2)+c9o2*(   -vx2)*(   -vx2)-cu_sq);
+               feq[DIR_00P] =  c2o27*(drho+c3o1*( vx3   )+c9o2*(    vx3)*(    vx3)-cu_sq);
+               feq[DIR_00M] =  c2o27*(drho+c3o1*(   -vx3)+c9o2*(   -vx3)*(   -vx3)-cu_sq);
+               feq[DIR_PP0] = c1o54*(drho+c3o1*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq);
+               feq[DIR_MM0] = c1o54*(drho+c3o1*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
+               feq[DIR_PM0] = c1o54*(drho+c3o1*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq);
+               feq[DIR_MP0] = c1o54*(drho+c3o1*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
+               feq[DIR_P0P] = c1o54*(drho+c3o1*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq);
+               feq[DIR_M0M] = c1o54*(drho+c3o1*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
+               feq[DIR_P0M] = c1o54*(drho+c3o1*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq);
+               feq[DIR_M0P] = c1o54*(drho+c3o1*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
+               feq[DIR_0PP] = c1o54*(drho+c3o1*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq);
+               feq[DIR_0MM] = c1o54*(drho+c3o1*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
+               feq[DIR_0PM] = c1o54*(drho+c3o1*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq);
+               feq[DIR_0MP] = c1o54*(drho+c3o1*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
+               feq[DIR_PPP]= c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+               feq[DIR_MMM]= c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+               feq[DIR_PPM]= c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+               feq[DIR_MMP]= c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+               feq[DIR_PMP]= c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+               feq[DIR_MPM]= c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+               feq[DIR_PMM]= c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+               feq[DIR_MPP]= c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 
                //Relaxation
                f[DIR_000] += (feq[DIR_000]-f[DIR_000])*collFactor;
@@ -212,33 +212,33 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
                   forcingX2 = muForcingX2.Eval();
                   forcingX3 = muForcingX3.Eval();
 
-                  f[DIR_000] +=                   0.0                        ;
-                  f[DIR_P00] +=  3.0*c2o27  *  (forcingX1)                    ;
-                  f[DIR_M00] +=  3.0*c2o27  *  (-forcingX1)                   ;
-                  f[DIR_0P0] +=  3.0*c2o27  *             (forcingX2)         ;
-                  f[DIR_0M0] +=  3.0*c2o27  *             (-forcingX2)        ;
-                  f[DIR_00P] +=  3.0*c2o27  *                     (forcingX3) ;
-                  f[DIR_00M] +=  3.0*c2o27  *                     (-forcingX3);
-                  f[DIR_PP0] +=  3.0*c1o54 * ( forcingX1+forcingX2          ) ;
-                  f[DIR_MM0 ] +=  3.0*c1o54 * (-forcingX1-forcingX2          ) ;
-                  f[DIR_PM0 ] +=  3.0*c1o54 * ( forcingX1-forcingX2          ) ;
-                  f[DIR_MP0 ] +=  3.0*c1o54 * (-forcingX1+forcingX2          ) ;
-                  f[DIR_P0P ] +=  3.0*c1o54 * ( forcingX1          +forcingX3) ;
-                  f[DIR_M0M ] +=  3.0*c1o54 * (-forcingX1          -forcingX3) ;
-                  f[DIR_P0M ] +=  3.0*c1o54 * ( forcingX1          -forcingX3) ;
-                  f[DIR_M0P ] +=  3.0*c1o54 * (-forcingX1          +forcingX3) ;
-                  f[DIR_0PP ] +=  3.0*c1o54 * (           forcingX2+forcingX3) ;
-                  f[DIR_0MM ] +=  3.0*c1o54 * (          -forcingX2-forcingX3) ;
-                  f[DIR_0PM ] +=  3.0*c1o54 * (           forcingX2-forcingX3) ;
-                  f[DIR_0MP ] +=  3.0*c1o54 * (          -forcingX2+forcingX3) ;
-                  f[DIR_PPP] +=  3.0*c1o216* ( forcingX1+forcingX2+forcingX3) ;
-                  f[DIR_MMM] +=  3.0*c1o216* (-forcingX1-forcingX2-forcingX3) ;
-                  f[DIR_PPM] +=  3.0*c1o216* ( forcingX1+forcingX2-forcingX3) ;
-                  f[DIR_MMP] +=  3.0*c1o216* (-forcingX1-forcingX2+forcingX3) ;
-                  f[DIR_PMP] +=  3.0*c1o216* ( forcingX1-forcingX2+forcingX3) ;
-                  f[DIR_MPM] +=  3.0*c1o216* (-forcingX1+forcingX2-forcingX3) ;
-                  f[DIR_PMM] +=  3.0*c1o216* ( forcingX1-forcingX2-forcingX3) ;
-                  f[DIR_MPP] +=  3.0*c1o216* (-forcingX1+forcingX2+forcingX3) ;
+                  f[DIR_000] += c0o1;
+                  f[DIR_P00] +=  c3o1*c2o27  *  (forcingX1)                    ;
+                  f[DIR_M00] +=  c3o1*c2o27  *  (-forcingX1)                   ;
+                  f[DIR_0P0] +=  c3o1*c2o27  *             (forcingX2)         ;
+                  f[DIR_0M0] +=  c3o1*c2o27  *             (-forcingX2)        ;
+                  f[DIR_00P] +=  c3o1*c2o27  *                     (forcingX3) ;
+                  f[DIR_00M] +=  c3o1*c2o27  *                     (-forcingX3);
+                  f[DIR_PP0] +=  c3o1*c1o54 * ( forcingX1+forcingX2          ) ;
+                  f[DIR_MM0 ] +=  c3o1*c1o54 * (-forcingX1-forcingX2          ) ;
+                  f[DIR_PM0 ] +=  c3o1*c1o54 * ( forcingX1-forcingX2          ) ;
+                  f[DIR_MP0 ] +=  c3o1*c1o54 * (-forcingX1+forcingX2          ) ;
+                  f[DIR_P0P ] +=  c3o1*c1o54 * ( forcingX1          +forcingX3) ;
+                  f[DIR_M0M ] +=  c3o1*c1o54 * (-forcingX1          -forcingX3) ;
+                  f[DIR_P0M ] +=  c3o1*c1o54 * ( forcingX1          -forcingX3) ;
+                  f[DIR_M0P ] +=  c3o1*c1o54 * (-forcingX1          +forcingX3) ;
+                  f[DIR_0PP ] +=  c3o1*c1o54 * (           forcingX2+forcingX3) ;
+                  f[DIR_0MM ] +=  c3o1*c1o54 * (          -forcingX2-forcingX3) ;
+                  f[DIR_0PM ] +=  c3o1*c1o54 * (           forcingX2-forcingX3) ;
+                  f[DIR_0MP ] +=  c3o1*c1o54 * (          -forcingX2+forcingX3) ;
+                  f[DIR_PPP] +=  c3o1*c1o216* ( forcingX1+forcingX2+forcingX3) ;
+                  f[DIR_MMM] +=  c3o1*c1o216* (-forcingX1-forcingX2-forcingX3) ;
+                  f[DIR_PPM] +=  c3o1*c1o216* ( forcingX1+forcingX2-forcingX3) ;
+                  f[DIR_MMP] +=  c3o1*c1o216* (-forcingX1-forcingX2+forcingX3) ;
+                  f[DIR_PMP] +=  c3o1*c1o216* ( forcingX1-forcingX2+forcingX3) ;
+                  f[DIR_MPM] +=  c3o1*c1o216* (-forcingX1+forcingX2-forcingX3) ;
+                  f[DIR_PMM] +=  c3o1*c1o216* ( forcingX1-forcingX2-forcingX3) ;
+                  f[DIR_MPP] +=  c3o1*c1o216* (-forcingX1+forcingX2+forcingX3) ;
                }
                //////////////////////////////////////////////////////////////////////////
 #ifdef  PROOF_CORRECTNESS
@@ -299,5 +299,5 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
 //////////////////////////////////////////////////////////////////////////
 real LBMKernelETD3Q27BGK::getCalculationTime()
 {
-   return 0.0;
+   return c0o1;
 }
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old
deleted file mode 100644
index 2ab0e9df73c83b4de2b8824667452414f42dfa1d..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old
+++ /dev/null
@@ -1,3024 +0,0 @@
-////=======================================================================================
-//// ____          ____    __    ______     __________   __      __       __        __
-//// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-////  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-////   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-////    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-////     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-////      \    \  |    |   ________________________________________________________________
-////       \    \ |    |  |  ______________________________________________________________|
-////        \    \|    |  |  |         __          __     __     __     ______      _______
-////         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-////          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-////           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-////            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-////
-////  This file is part of VirtualFluids. VirtualFluids is free software: you can
-////  redistribute it and/or modify it under the terms of the GNU General Public
-////  License as published by the Free Software Foundation, either version 3 of
-////  the License, or (at your option) any later version.
-////
-////  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-////  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-////  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-////  for more details.
-////
-////  You should have received a copy of the GNU General Public License along
-////  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-////
-////! \file MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
-////! \ingroup LBMKernel
-////! \author M. Geier, K. Kutscher, Hesameddin Safari
-////=======================================================================================
-//
-//#include "MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h"
-//#include "BCArray3D.h"
-//#include "Block3D.h"
-//#include "D3Q27EsoTwist3DSplittedVector.h"
-//#include "D3Q27System.h"
-//#include "DataSet3D.h"
-//#include "LBMKernel.h"
-//#include <cmath>
-//#include <iostream>
-//#include <string>
-//
-//#define PROOF_CORRECTNESS
-//
-////////////////////////////////////////////////////////////////////////////
-//MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::MultiphaseSimpleVelocityBaseExternalPressureLBMKernel() { this->compressible = false; }
-////////////////////////////////////////////////////////////////////////////
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initDataSet()
-//{
-//	SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
-//	SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
-//	SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
-//	SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
-//	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
-//	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
-//	p1Old = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
-//	dataSet->setFdistributions(f);
-//	dataSet->setHdistributions(h); // For phase-field
-//	dataSet->setH2distributions(h2);
-//	dataSet->setPhaseField(divU1);
-//	dataSet->setPressureField(pressure);
-//
-//	phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0));
-//	phaseFieldOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 999.0));
-//
-//	divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
-//}
-////////////////////////////////////////////////////////////////////////////
-//SPtr<LBMKernel> MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::clone()
-//{
-//	SPtr<LBMKernel> kernel(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel());
-//	kernel->setNX(nx);
-//	dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initDataSet();
-//	kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
-//	kernel->setDensityRatio(this->densityRatio);
-//	kernel->setMultiphaseModelParameters(this->beta, this->kappa);
-//	kernel->setContactAngle(this->contactAngle);
-//	kernel->setPhiL(this->phiL);
-//	kernel->setPhiH(this->phiH);
-//	kernel->setPhaseFieldRelaxation(this->tauH);
-//	kernel->setMobility(this->mob);
-//	kernel->setInterfaceWidth(this->interfaceWidth);
-//
-//	kernel->setBCProcessor(bcProcessor->clone(kernel));
-//	kernel->setWithForcing(withForcing);
-//	kernel->setForcingX1(muForcingX1);
-//	kernel->setForcingX2(muForcingX2);
-//	kernel->setForcingX3(muForcingX3);
-//	kernel->setIndex(ix1, ix2, ix3);
-//	kernel->setDeltaT(deltaT);
-//	kernel->setGhostLayerWidth(2);
-//	dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initForcing();
-//
-//	return kernel;
-//}
-////////////////////////////////////////////////////////////////////////////
-//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
-//	using namespace UbMath;
-//	LBMReal m2 = mfa + mfc;
-//	LBMReal m1 = mfc - mfa;
-//	LBMReal m0 = m2 + mfb;
-//	mfa = m0;
-//	m0 *= Kinverse;
-//	m0 += oneMinusRho;
-//	mfb = (m1 * Kinverse - m0 * vv) * K;
-//	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
-//}
-//
-//////////////////////////////////////////////////////////////////////////////////
-//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
-//	using namespace UbMath;
-//	LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
-//	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
-//	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
-//	mfa = m0;
-//	mfb = m1;
-//}
-//
-//
-//////////////////////////////////////////////////////////////////////////////////
-//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
-//	using namespace UbMath;
-//	LBMReal m1 = (mfa + mfc) + mfb;
-//	LBMReal m2 = mfc - mfa;
-//	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
-//	mfb = m2 - vv * m1;
-//	mfa = m1;
-//}
-//
-//
-//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
-//	using namespace UbMath;
-//	LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
-//	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
-//	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
-//	mfb = mb;
-//	mfa = ma;
-//}
-//
-//
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::calculate(int step)
-//{
-//	using namespace D3Q27System;
-//	using namespace UbMath;
-//
-//	forcingX1 = 0.0;
-//	forcingX2 = 0.0;
-//	forcingX3 = 0.0;
-//
-//	LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5;
-//														 /////////////////////////////////////
-//
-//	localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
-//	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
-//	zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
-//
-//	localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
-//	nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
-//	zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
-//
-//	localDistributionsH2    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions();
-//	nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
-//	zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
-//
-//
-//	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
-//
-//	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
-//
-//	const int bcArrayMaxX1 = (int)bcArray->getNX1();
-//	const int bcArrayMaxX2 = (int)bcArray->getNX2();
-//	const int bcArrayMaxX3 = (int)bcArray->getNX3();
-//
-//	int minX1 = ghostLayerWidth;
-//	int minX2 = ghostLayerWidth;
-//	int minX3 = ghostLayerWidth;
-//	int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
-//	int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
-//	int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
-//	LBMReal omegaDRho = 1.0;// 1.25;// 1.3;
-//
-//	for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
-//		for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
-//			for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
-//				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
-//					int x1p = x1 + 1;
-//					int x2p = x2 + 1;
-//					int x3p = x3 + 1;
-//
-//					LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
-//					LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
-//					LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
-//					LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
-//					LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
-//					LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
-//					LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
-//					LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
-//					LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
-//					LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
-//					LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
-//					LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
-//					LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
-//					LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
-//					LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
-//					LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
-//					LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
-//					LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
-//					LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
-//					LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
-//					LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
-//					LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
-//					LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-//					LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
-//					LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
-//					LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
-//
-//					LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
-//					(*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
-//						(((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
-//							((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
-//								(mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
-//					if ((*phaseField)(x1, x2, x3) > 1 ) {
-//						(*phaseField)(x1, x2, x3) = c1;
-//					}
-//
-//					if ((*phaseField)(x1, x2, x3) < 0) {
-//						(*phaseField)(x1, x2, x3) = 0;
-//					}
-//					////// read F-distributions for velocity formalism
-//
-//					mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
-//					mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
-//					mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
-//					mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
-//					mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
-//					mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
-//					mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
-//					mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
-//					mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
-//					mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
-//					mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
-//					mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
-//					mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
-//					mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
-//					mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
-//					mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
-//					mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
-//					mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
-//					mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
-//					mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
-//					mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
-//					mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
-//					mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-//					mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
-//					mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
-//					mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
-//
-//					mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
-//
-//					//LBMReal rhoH = 1.0;
-//					//LBMReal rhoL = 1.0 / densityRatio;
-//
-//					LBMReal rhoH = 1.0*densityRatio;
-//					LBMReal rhoL = 1.0;
-//
-//					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
-//
-//					LBMReal drho = (((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))   )
-//						+ (((mfaab + mfccb) + (mfacb + mfcab) ) + ((mfaba + mfcbc) + (mfabc + mfcba) ) + ((mfbaa + mfbcc) + (mfbac + mfbca) )))
-//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
-//				
-//					omegaDRho = 2.0;// 1.5;
-//					drho *= omegaDRho;
-//					LBMReal keepDrho = drho;
-//					drho = ((*p1Old)(x1, x2, x3) + drho) * c1o2;
-//				//	drho = ((*p1Old)(x1, x2, x3)*c2o3 + drho*c1o3) ;
-//					(*p1Old)(x1, x2, x3) = keepDrho;
-//					
-//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible
-/////Density correction
-//					//LBMReal dX1_phi = gradX1_phi();
-//					//LBMReal dX2_phi = gradX2_phi();
-//					//LBMReal dX3_phi = gradX3_phi();
-//					//LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
-//					//	(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
-//					//	(mfcbb - mfabb)) ;
-//					//LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
-//					//	(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
-//					//	(mfbcb - mfbab)) ;
-//					//LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
-//					//	(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
-//					//	(mfbbc - mfbba)) ;
-//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressure)(x1, x2, x3); //explicit Compressible
-//					//(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho-(rhoH-rhoL)*(vvx*dX1_phi+vvy*dX2_phi+vvz*dX3_phi)*c1o3)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
-//					
-//					//(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) - c1o3 * drho * ((*phaseField)(x1, x2, x3) * (rhoH - rhoL) + rhoL)) / (c1 - ((*phaseField)(x1, x2, x3) - c1) * drho);
-//					//LBMReal rho=rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3);
-//					//LBMReal tempDrho = drho;
-//					//drho = (drho*0.9 + (*pressureOld)(x1, x2, x3)*0.1) ;
-//					//(*pressureOld)(x1, x2, x3) = tempDrho;
-//
-//					//Mathematica
-//
-//					LBMReal rho = ((*pressure)(x1, x2, x3) - (*phaseField)(x1, x2, x3) * (*pressure)(x1, x2, x3) + c1o3 * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (c1o3 + c1o3 * drho * (-1 + (*phaseField)(x1, x2, x3)));
-//					(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) + c1o3 * drho * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (1 + drho * (-1 + (*phaseField)(x1, x2, x3)));
-///////Full Filter
-//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH)+(one- (*phaseField)(x1, x2, x3))*three* (*pressure)(x1, x2, x3); //explicit Compressible
-//					//(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
-////// reduced Filter
-//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); //explicit Compressible
-//					//(*pressure)(x1, x2, x3) = (((*pressureOld)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
-//
-//					//rho = (rho)/(one- (one - (*phaseField)(x1, x2, x3)) * drho); // now implicit Compressible
-//					
-//					//(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3;
-//					////!!!!!! relplace by pointer swap!
-//					//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3);
-//				}
-//			}
-//		}
-//	}
-//
-//	LBMReal collFactorM;
-//
-//	////Periodic Filter
-//	//for (int x3 = minX3-1; x3 <= maxX3; x3++) {
-//	//	for (int x2 = minX2-1; x2 <= maxX2; x2++) {
-//	//		for (int x1 = minX1-1; x1 <= maxX1; x1++) {
-//	//			if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
-//
-//	//				LBMReal sum = 0.;
-//
-//	//				///Version for boundaries
-//	//				for (int xx = -1; xx <= 1; xx++) {
-//	//					//int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
-//	//					int xxx = xx + x1;
-//
-//	//					for (int yy = -1; yy <= 1; yy++) {
-//	//						//int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0;
-//	//						int yyy = yy + x2;
-//
-//	//						for (int zz = -1; zz <= 1; zz++) {
-//	//							//int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
-//	//							int zzz = zz + x3;
-//
-//	//							if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
-//	//								sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz);
-//	//							}
-//	//							else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3);
-//	//							}
-//
-//
-//	//						}
-//	//					}
-//	//				}
-//	//				(*pressure)(x1, x2, x3) = sum;
-//	//			}
-//	//		}
-//	//	}
-//	//}
-//
-//	////!filter
-//
-//	for (int x3 = minX3; x3 < maxX3; x3++) {
-//		for (int x2 = minX2; x2 < maxX2; x2++) {
-//			for (int x1 = minX1; x1 < maxX1; x1++) {
-//				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
-//					int x1p = x1 + 1;
-//					int x2p = x2 + 1;
-//					int x3p = x3 + 1;
-//
-//					//////////////////////////////////////////////////////////////////////////
-//					// Read distributions and phase field
-//					////////////////////////////////////////////////////////////////////////////
-//					//////////////////////////////////////////////////////////////////////////
-//
-//					// E   N  T
-//					// c   c  c
-//					//////////
-//					// W   S  B
-//					// a   a  a
-//
-//					// Rest ist b
-//
-//					// mfxyz
-//					// a - negative
-//					// b - null
-//					// c - positive
-//
-//					// a b c
-//					//-1 0 1
-//
-//					findNeighbors(phaseField, x1, x2, x3);
-//
-//					LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
-//					LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
-//					LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
-//					LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
-//					LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
-//					LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
-//					LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
-//					LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
-//					LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
-//					LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
-//					LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
-//					LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
-//					LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
-//					LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
-//					LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
-//					LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
-//					LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
-//					LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
-//					LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
-//					LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
-//					LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
-//					LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
-//					LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-//					LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
-//					LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
-//					LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
-//
-//					LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
-//
-//
-//					LBMReal mfhcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
-//					LBMReal mfhbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
-//					LBMReal mfhbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
-//					LBMReal mfhccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
-//					LBMReal mfhacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
-//					LBMReal mfhcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
-//					LBMReal mfhabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
-//					LBMReal mfhbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
-//					LBMReal mfhbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
-//					LBMReal mfhccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
-//					LBMReal mfhacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
-//					LBMReal mfhcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
-//					LBMReal mfhaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
-//					LBMReal mfhabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
-//					LBMReal mfhbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
-//					LBMReal mfhbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
-//					LBMReal mfhaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
-//					LBMReal mfhcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
-//					LBMReal mfhaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
-//					LBMReal mfhcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
-//					LBMReal mfhbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
-//					LBMReal mfhbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
-//					LBMReal mfhaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-//					LBMReal mfhcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
-//					LBMReal mfhaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
-//					LBMReal mfhcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
-//
-//					LBMReal mfhbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
-//
-//					//LBMReal rhoH = 1.0;
-//					//LBMReal rhoL = 1.0 / densityRatio;
-//
-//					LBMReal rhoH = 1.0;
-//					LBMReal rhoL = 1.0/ densityRatio;
-//
-//					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
-//
-//					LBMReal dX1_phi = gradX1_phi();
-//					LBMReal dX2_phi = gradX2_phi();
-//					LBMReal dX3_phi = gradX3_phi();
-//
-//					LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9+1e-3;
-//					// 01.09.2022: unclear what value we have to add to the normal: lager values better cut of in gas phase?
-//					LBMReal normX1 = dX1_phi / denom;
-//					LBMReal normX2 = dX2_phi / denom;
-//					LBMReal normX3 = dX3_phi / denom;
-//
-//
-//
-//					collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL);
-//
-//
-//					LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi();
-//
-//					//----------- Calculating Macroscopic Values -------------
-//					LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH); //Incompressible
-//
-//																		///scaled phase field
-//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) / ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) + (c1 - (*phaseField)(x1, x2, x3)) * (c1 - (*phaseField)(x1, x2, x3))) - phiH);
-//					///!scaled phase field
-//					
-//					//LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH)+(one-phi[REST])* (*pressure)(x1, x2, x3)*three; //compressible
-//					//LBMReal rho = rhoL + (rhoH - rhoL) * phi[REST] + (one - phi[REST]) * (*pressure)(x1, x2, x3) * three; //compressible
-//
-//					LBMReal m0, m1, m2;
-//					LBMReal rhoRef=c1;
-//
-//					LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
-//						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
-//						(mfcbb - mfabb))/rhoRef;
-//					LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
-//						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
-//						(mfbcb - mfbab))/rhoRef;
-//					LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
-//						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
-//						(mfbbc - mfbba))/rhoRef;
-//					////Filter&Gradient merged
-//					LBMReal pressureHere = (*pressureOld)(x1, x2, x3);
-//					//LBMReal pressureHere = (*pressure)(x1, x2, x3);
-//
-//					LBMReal arrayP[3][3][3] = { {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}},
-//												{{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}},
-//												{ {pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}} };
-//					//LBMReal LaplaceP = 0.0;
-//					//LaplaceP += WEIGTH[TNE] * (((((*pressureOld)(x1+1,x2+1,x3+1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 + 1) - pressureHere)))
-//					//	+ ((((*pressureOld)(x1 + 1, x2 - 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 + 1) - pressureHere))));
-//					//LaplaceP += WEIGTH[TN] * (
-//					//	((((*pressureOld)(x1 + 1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3) - pressureHere)))
-//					//	+ ((((*pressureOld)(x1 + 1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 -1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 + 1) - pressureHere)))
-//					//	+ ((((*pressureOld)(x1, x2 + 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 + 1) - pressureHere)))
-//					//	);
-//					//LaplaceP += WEIGTH[T] * (
-//					//	(((*pressureOld)(x1 + 1, x2, x3) - pressureHere) + ((*pressureOld)(x1, x2-1, x3) - pressureHere))
-//					//	+ (((*pressureOld)(x1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3) - pressureHere))
-//					//	+ (((*pressureOld)(x1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2, x3 - 1) - pressureHere))
-//					//	);
-//
-//					//LaplaceP= 6.0 * LaplaceP;
-//					
-//					//LBMReal sum = 0.0;
-//
-//					for (int dir1 = -1; dir1 <= 1; dir1++) {
-//						for (int dir2 = -1; dir2 <= 1; dir2++) {
-//							for (int dir3 = -1; dir3 <= 1; dir3++){
-//								int xxx = x1 + dir1;
-//								int yyy = x2 + dir2;
-//								int zzz = x3 + dir3;
-//								if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressureOld)(xxx, yyy, zzz);
-//								//if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressure)(xxx, yyy, zzz);
-//							//	sum += 64.0 / (216.0 * (c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)) * (c1 + c3 * abs(dir3))) * arrayP[dir1 + 1][dir2 + 1][dir3 + 1];
-//							}
-//						}
-//					}
-////					(*pressure)(x1, x2, x3) = sum;// *0.1 + (1.0 - 0.1) * (*pressureOld)(x1, x2, x3);
-//
-//
-//					(*pressure)(x1, x2, x3) = (((((arrayP[0][0][0] + arrayP[2][2][2]) + (arrayP[0][2][0] + arrayP[2][0][2])) + ((arrayP[2][0][0] + arrayP[0][2][2]) + (arrayP[2][2][0] + arrayP[0][0][2]))) * c1o216
-//						+ (((arrayP[0][0][1] + arrayP[2][2][1]) + (arrayP[0][1][0] + arrayP[2][1][2])) + ((arrayP[1][0][0] + arrayP[1][2][2]) + (arrayP[0][1][2] + arrayP[2][1][0])) + ((arrayP[1][0][2] + arrayP[1][2][0]) + (arrayP[0][2][1] + arrayP[2][0][1]))) * c1o54)
-//						+ ((arrayP[0][1][1] + arrayP[2][1][1]) + (arrayP[1][0][1] + arrayP[1][2][1]) + (arrayP[1][1][0] + arrayP[1][1][2])) * c2o27)
-//						+ arrayP[1][1][1] * c8o27;
-//					//LBMReal gradPx = 0.0;
-//					//LBMReal gradPy = 0.0;
-//					//LBMReal gradPz = 0.0;
-//					//for (int dir1 = -1; dir1 <= 1; dir1++) {
-//					//	for (int dir2 = -1; dir2 <= 1; dir2++) {
-//					//		gradPx -= arrayP[0][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		gradPx += arrayP[2][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//
-//
-//
-//					//		gradPy -= arrayP[dir1+1][0][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		gradPy += arrayP[dir1+1][2][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		
-//
-//					//		gradPz -= arrayP[dir1+1][dir2+1][0] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		gradPz += arrayP[dir1+1][dir2+1][2] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//	}
-//					//}
-//
-//					LBMReal gradPx = ((((arrayP[2][0][0] - arrayP[0][2][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72
-//						+ (((arrayP[2][1][0] - arrayP[0][1][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[2][0][1] - arrayP[0][2][1]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18)
-//						+ (arrayP[2][1][1] - arrayP[0][1][1]) * c2o9;
-//					LBMReal gradPy = ((((arrayP[0][2][0] - arrayP[2][0][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[0][2][2] - arrayP[2][0][0]))) * c1o72
-//						+ (((arrayP[1][2][0] - arrayP[1][0][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[0][2][1] - arrayP[2][0][1]) + (arrayP[1][2][2] - arrayP[1][0][0]))) * c1o18)
-//						+ (arrayP[1][2][1] - arrayP[1][0][1]) * c2o9;
-//					LBMReal gradPz = ((((arrayP[0][0][2] - arrayP[2][2][0]) + (arrayP[0][2][2] - arrayP[2][0][0])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72
-//						+ (((arrayP[0][1][2] - arrayP[2][1][0]) + (arrayP[1][2][2] - arrayP[1][0][0])) + ((arrayP[1][0][2] - arrayP[1][2][0]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18)
-//						+ (arrayP[1][1][2] - arrayP[1][1][0]) * c2o9;
-//
-//					//gradPx *=c1 - (*pressure)(x1, x2, x3)+pressureHere;
-//					//gradPy *=c1 - (*pressure)(x1, x2, x3) + pressureHere;
-//					//gradPz *=c1 - (*pressure)(x1, x2, x3) + pressureHere;
-//
-//					////!Filter&Gradient merged
-//					//LBMReal gradPx = 0.0;
-//					//LBMReal gradPy = 0.0;
-//					//LBMReal gradPz = 0.0;
-//					//for (int dir1 = -1; dir1 <= 1; dir1++) {
-//					//	for (int dir2 = -1; dir2 <= 1; dir2++) {
-//					//		int yyy = x2 + dir1;
-//					//		int zzz = x3 + dir2;
-//					//		if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
-//					//			gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		else {
-//					//			gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) {
-//					//			gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		else {
-//					//			gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//
-//					//		int xxx = x1 + dir1;
-//					//		if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
-//					//			gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		else {
-//					//			gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) {
-//					//			gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		else {
-//					//			gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//
-//					//		yyy = x2 + dir2;
-//					//		if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
-//					//			gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		else {
-//					//			gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
-//					//			gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//					//		else {
-//					//			gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
-//					//		}
-//
-//					//	}
-//					//}
-//
-//					//Viscosity increase by phase field residuum
-//					//LBMReal errPhi = (((1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale)- denom);
-//					//LBMReal limVis = 0.01;// 0.0000001 * 10;//0.01;
-//					// collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM);
-//					// collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM;
-//					//errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi;
-//					//collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis);
-//
-//					//3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
-//					//+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
-//					//+WEIGTH[N] * (phi2[T] - phi2[B]));
-//
-//					muRho = rho;
-//
-//					////external pressure
-//					//forcingX1 =/* muForcingX1.Eval()/rho */- gradPx/rho;
-//					//forcingX2 =/* muForcingX2.Eval()/rho */- gradPy/rho;
-//					//forcingX3 =/* muForcingX3.Eval()/rho */- gradPz/rho;
-//
-//					///////////////////////////////////////////////
-//
-//					//LBMReal pBefore = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
-//					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
-//					//pBefore = -c1o3 * (-1.0e-10)/((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) );
-//					////if (vvx * vvx + vvy * vvy + vvz * vvz > 1.0e-100) {
-//					//	mfabb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[E] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbab -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[N] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbba -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[T] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfaab -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[NE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcab -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[NW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfaba -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcba -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbaa -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TN] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbca -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TS] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfaaa -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TNE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcaa -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TNW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfaca -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TSE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcca -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TSW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcbb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[W] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbcb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[S] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbbc -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[B] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfccb -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[SW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfacb -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[SE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcbc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfabc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbcc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BS] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbac -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BN] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfccc -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BSW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfacc -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BSE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfcac -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BNW] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfaac -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BNE] * (rhoH - rhoL) / (phiH - phiL)));
-//					//	mfbbb -= pBefore * 8.0 / 9.0;
-//					//}
-//
-//					///////////////////////////////////////////////
-//
-//					LBMReal pStarStart = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
-//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
-//
-//					/////////////////////
-//					//LBMReal vvxh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) +
-//					//	(((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) +
-//					//	(mfhcbb - mfhabb)) / rhoRef;
-//					//LBMReal vvyh = ((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) +
-//					//	(((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) +
-//					//	(mfhbcb - mfhbab)) / rhoRef;
-//					//LBMReal vvzh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) +
-//					//	(((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) +
-//					//	(mfhbbc - mfhbba)) / rhoRef;
-//
-//					//LBMReal deltaPP = 0*(vvxh * dX1_phi + vvyh * dX2_phi + vvzh * dX3_phi) * rhoToPhi / (rho);
-//					//mfhbcb += c1o6* c2o9  * deltaPP;
-//					//mfhbbc += c1o6* c2o9  * deltaPP;
-//					//mfhcbb += c1o6* c2o9  * deltaPP;
-//					//mfhccb += c1o6* c1o18 * deltaPP;
-//					//mfhacb += c1o6* c1o18 * deltaPP;
-//					//mfhcbc += c1o6* c1o18 * deltaPP;
-//					//mfhabc += c1o6* c1o18 * deltaPP;
-//					//mfhbcc += c1o6* c1o18 * deltaPP;
-//					//mfhbac += c1o6* c1o18 * deltaPP;
-//					//mfhccc += c1o6* c1o72 * deltaPP;
-//					//mfhacc += c1o6* c1o72 * deltaPP;
-//					//mfhcac += c1o6* c1o72 * deltaPP;
-//					//mfhaac += c1o6* c1o72 * deltaPP;
-//					//mfhabb += c1o6* c2o9  * deltaPP;
-//					//mfhbab += c1o6* c2o9  * deltaPP;
-//					//mfhbba += c1o6* c2o9  * deltaPP;
-//					//mfhaab += c1o6* c1o18 * deltaPP;
-//					//mfhcab += c1o6* c1o18 * deltaPP;
-//					//mfhaba += c1o6* c1o18 * deltaPP;
-//					//mfhcba += c1o6* c1o18 * deltaPP;
-//					//mfhbaa += c1o6* c1o18 * deltaPP;
-//					//mfhbca += c1o6* c1o18 * deltaPP;
-//					//mfhaaa += c1o6* c1o72 * deltaPP;
-//					//mfhcaa += c1o6* c1o72 * deltaPP;
-//					//mfhaca += c1o6* c1o72 * deltaPP;
-//					//mfhcca += c1o6* c1o72 * deltaPP;
-//					//mfhbbb += c1o6* c4 * c2o9 * deltaPP;
-//
-//					//////////////////////
-//
-//					/////Recovering the origin distributions
-//					//LBMReal mfStartcbb = mfcbb ;
-//					//LBMReal mfStartbcb = mfbcb ;
-//					//LBMReal mfStartbbc = mfbbc ;
-//					//LBMReal mfStartccb = mfccb ;
-//					//LBMReal mfStartacb = mfacb ;
-//					//LBMReal mfStartcbc = mfcbc ;
-//					//LBMReal mfStartabc = mfabc ;
-//					//LBMReal mfStartbcc = mfbcc ;
-//					//LBMReal mfStartbac = mfbac ;
-//					//LBMReal mfStartccc = mfccc ;
-//					//LBMReal mfStartacc = mfacc ;
-//					//LBMReal mfStartcac = mfcac ;
-//					//LBMReal mfStartaac = mfaac ;
-//					//LBMReal mfStartabb = mfabb ;
-//					//LBMReal mfStartbab = mfbab ;
-//					//LBMReal mfStartbba = mfbba ;
-//					//LBMReal mfStartaab = mfaab ;
-//					//LBMReal mfStartcab = mfcab ;
-//					//LBMReal mfStartaba = mfaba ;
-//					//LBMReal mfStartcba = mfcba ;
-//					//LBMReal mfStartbaa = mfbaa ;
-//					//LBMReal mfStartbca = mfbca ;
-//					//LBMReal mfStartaaa = mfaaa ;
-//					//LBMReal mfStartcaa = mfcaa ;
-//					//LBMReal mfStartaca = mfaca ;
-//					//LBMReal mfStartcca = mfcca ;
-//					//LBMReal mfStartbbb = mfbbb ;
-//
-//
-//						mfcbb += mfhcbb /rho;
-//						mfbcb += mfhbcb /rho;
-//						mfbbc += mfhbbc /rho;
-//						mfccb += mfhccb /rho;
-//						mfacb += mfhacb /rho;
-//						mfcbc += mfhcbc /rho;
-//						mfabc += mfhabc /rho;
-//						mfbcc += mfhbcc /rho;
-//						mfbac += mfhbac /rho;
-//						mfccc += mfhccc /rho;
-//						mfacc += mfhacc /rho;
-//						mfcac += mfhcac /rho;
-//						mfaac += mfhaac /rho;
-//						mfabb += mfhabb /rho;
-//						mfbab += mfhbab /rho;
-//						mfbba += mfhbba /rho;
-//						mfaab += mfhaab /rho;
-//						mfcab += mfhcab /rho;
-//						mfaba += mfhaba /rho;
-//						mfcba += mfhcba /rho;
-//						mfbaa += mfhbaa /rho;
-//						mfbca += mfhbca /rho;
-//						mfaaa += mfhaaa /rho;
-//						mfcaa += mfhcaa /rho;
-//						mfaca += mfhaca /rho;
-//						mfcca += mfhcca /rho;
-//						mfbbb += mfhbbb /rho;
-//
-//
-//
-//					//Abbas
-//					LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
-//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
-//					//22.09.22 not yet in balance, repaire here
-//					LBMReal ppStar = ((((((mfhaaa + mfhccc) + (mfhaac + mfhcca)) + ((mfhcac + mfhaca) + (mfhcaa + mfhacc)))*c3
-//						+ (((mfhaab + mfhccb) + (mfhacb + mfhcab)) + ((mfhaba + mfhcbc) + (mfhabc + mfhcba)) + ((mfhbaa + mfhbcc) + (mfhbac + mfhbca))))*c2
-//						+ ((mfhabb + mfhcbb) + (mfhbab + mfhbcb) + (mfhbba + mfhbbc))) ) * c1o3/rho;
-//	
-//					ppStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) * c3
-//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) * c2
-//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)))) * c1o3 ;
-//
-//					//(*phaseFieldOld)(x1, x2, x3) = ((*phaseFieldOld)(x1, x2, x3) > 99.0) ? phi[REST] : (*phaseFieldOld)(x1, x2, x3);
-//					//LBMReal dtPhi = phi[REST] - (*phaseFieldOld)(x1, x2, x3);
-//					//LBMReal deltaP = -pStar * (c1 - rho / (rho + c1o2 * rhoToPhi * dtPhi));// -pStar * pStar * pStar * 1.0e-4 * rho * rho * rho;
-//					//LBMReal deltaP = pStar * (c1 - mfhbbb*rho) * c1o2;//Explicit
-//					//LBMReal deltaP = pStar * (c1 - mfhbbb * rho) / (c1 + mfhbbb * rho);//Semi-Implicit
-//					//(*phaseFieldOld)(x1, x2, x3) = phi[REST];
-//
-//					//mfabb += c2o9 *deltaP;
-//					//mfbab += c2o9 *deltaP;
-//					//mfbba += c2o9 *deltaP;
-//					//mfaab += c1o18*deltaP;
-//					//mfcab += c1o18*deltaP;
-//					//mfaba += c1o18*deltaP;
-//					//mfcba += c1o18*deltaP;
-//					//mfbaa += c1o18*deltaP;
-//					//mfbca += c1o18*deltaP;
-//					//mfaaa += c1o72*deltaP;
-//					//mfcaa += c1o72*deltaP;
-//					//mfaca += c1o72*deltaP;
-//					//mfcca += c1o72*deltaP;
-//					//mfcbb += c2o9 *deltaP;
-//					//mfbcb += c2o9 *deltaP;
-//					//mfbbc += c2o9 *deltaP;
-//					//mfccb += c1o18*deltaP;
-//					//mfacb += c1o18*deltaP;
-//					//mfcbc += c1o18*deltaP;
-//					//mfabc += c1o18*deltaP;
-//					//mfbcc += c1o18*deltaP;
-//					//mfbac += c1o18*deltaP;
-//					//mfccc += c1o72*deltaP;
-//					//mfacc += c1o72*deltaP;
-//					//mfcac += c1o72*deltaP;
-//					//mfaac += c1o72*deltaP;
-//
-//					//pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
-//					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
-//
-//
-//
-//
-//					//mfabb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[E  ])*rhoToPhi/rho;
-//					//mfbab -= c1o2 * c2o9 *pStar*(phi[REST]-phi[N  ])*rhoToPhi/rho;
-//					//mfbba -= c1o2 * c2o9 *pStar*(phi[REST]-phi[T  ])*rhoToPhi/rho;
-//					//mfaab -= c1o2 * c1o18*pStar*(phi[REST]-phi[NE ])*rhoToPhi/rho;
-//					//mfcab -= c1o2 * c1o18*pStar*(phi[REST]-phi[NW ])*rhoToPhi/rho;
-//					//mfaba -= c1o2 * c1o18*pStar*(phi[REST]-phi[TE ])*rhoToPhi/rho;
-//					//mfcba -= c1o2 * c1o18*pStar*(phi[REST]-phi[TW ])*rhoToPhi/rho;
-//					//mfbaa -= c1o2 * c1o18*pStar*(phi[REST]-phi[TN ])*rhoToPhi/rho;
-//					//mfbca -= c1o2 * c1o18*pStar*(phi[REST]-phi[TS ])*rhoToPhi/rho;
-//					//mfaaa -= c1o2 * c1o72*pStar*(phi[REST]-phi[TNE])*rhoToPhi/rho;
-//					//mfcaa -= c1o2 * c1o72*pStar*(phi[REST]-phi[TNW])*rhoToPhi/rho;
-//					//mfaca -= c1o2 * c1o72*pStar*(phi[REST]-phi[TSE])*rhoToPhi/rho;
-//					//mfcca -= c1o2 * c1o72*pStar*(phi[REST]-phi[TSW])*rhoToPhi/rho;
-//					//mfcbb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[W  ])*rhoToPhi/rho;
-//					//mfbcb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[S  ])*rhoToPhi/rho;
-//					//mfbbc -= c1o2 * c2o9 *pStar*(phi[REST]-phi[B  ])*rhoToPhi/rho;
-//					//mfccb -= c1o2 * c1o18*pStar*(phi[REST]-phi[SW ])*rhoToPhi/rho;
-//					//mfacb -= c1o2 * c1o18*pStar*(phi[REST]-phi[SE ])*rhoToPhi/rho;
-//					//mfcbc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BW ])*rhoToPhi/rho;
-//					//mfabc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BE ])*rhoToPhi/rho;
-//					//mfbcc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BS ])*rhoToPhi/rho;
-//					//mfbac -= c1o2 * c1o18*pStar*(phi[REST]-phi[BN ])*rhoToPhi/rho;
-//					//mfccc -= c1o2 * c1o72*pStar*(phi[REST]-phi[BSW])*rhoToPhi/rho;
-//					//mfacc -= c1o2 * c1o72*pStar*(phi[REST]-phi[BSE])*rhoToPhi/rho;
-//					//mfcac -= c1o2 * c1o72*pStar*(phi[REST]-phi[BNW])*rhoToPhi/rho;
-//					//mfaac -= c1o2 * c1o72*pStar*(phi[REST]-phi[BNE])*rhoToPhi/rho;
-//
-//
-//					//forcingX1 =/* muForcingX1.Eval() / rho*/ - pStar * dX1_phi * rhoToPhi / rho;
-//					//forcingX2 =/* muForcingX2.Eval() / rho*/ - pStar * dX2_phi * rhoToPhi / rho;
-//					//forcingX3 =/* muForcingX3.Eval() / rho*/ - pStar * dX3_phi * rhoToPhi / rho;
-//
-//
-//					//mfabb += (-forcingX1) * c2o9;
-//					//mfbab += (-forcingX2) * c2o9;
-//					//mfbba += (-forcingX3) * c2o9;
-//					//mfaab += (-forcingX1 - forcingX2) * c1o16;
-//					//mfcab += (forcingX1 - forcingX2) * c1o16;
-//					//mfaba += (-forcingX1 - forcingX3) * c1o16;
-//					//mfcba += (forcingX1 - forcingX3) * c1o16;
-//					//mfbaa += (-forcingX2 - forcingX3) * c1o16;
-//					//mfbca += (forcingX2 - forcingX3) * c1o16;
-//					//mfaaa += (-forcingX1 - forcingX2 - forcingX3) * c1o72;
-//					//mfcaa += (forcingX1 - forcingX2 - forcingX3) * c1o72;
-//					//mfaca += (-forcingX1 + forcingX2 - forcingX3) * c1o72;
-//					//mfcca += (forcingX1 + forcingX2 - forcingX3) * c1o72;
-//					//mfcbb += (forcingX1)*c2o9;
-//					//mfbcb += (forcingX2)*c2o9;
-//					//mfbbc += (forcingX3)*c2o9;
-//					//mfccb += (forcingX1 + forcingX2) * c1o16;
-//					//mfacb += (-forcingX1 + forcingX2) * c1o16;
-//					//mfcbc += (forcingX1 + forcingX3) * c1o16;
-//					//mfabc += (-forcingX1 + forcingX3) * c1o16;
-//					//mfbcc += (forcingX2 + forcingX3) * c1o16;
-//					//mfbac += (-forcingX2 + forcingX3) * c1o16;
-//					//mfccc += (forcingX1 + forcingX2 + forcingX3) * c1o72;
-//					//mfacc += (-forcingX1 + forcingX2 + forcingX3) * c1o72;
-//					//mfcac += (forcingX1 - forcingX2 + forcingX3) * c1o72;
-//					//mfaac += (-forcingX1 - forcingX2 + forcingX3) * c1o72;
-//
-//					LBMReal saveForceX1 = forcingX1;
-//					LBMReal saveForceX2 = forcingX2;
-//					LBMReal saveForceX3 = forcingX3;
-//
-//					 vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
-//						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
-//						(mfcbb - mfabb)) / rhoRef;
-//					 vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
-//						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
-//						(mfbcb - mfbab)) / rhoRef;
-//					 vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
-//						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
-//						(mfbbc - mfbba)) / rhoRef;
-//
-//
-//					 LBMReal dRhoInvX = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) +
-//						 (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) +
-//						 (mfhcbb - mfhabb)));
-//					 LBMReal dRhoInvY = -(((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) +
-//						 (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) +
-//						 (mfhbcb - mfhbab)));
-//					 LBMReal dRhoInvZ = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) +
-//						 (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) +
-//						 (mfhbbc - mfhbba)));
-//
-//
-//					 forcingX1 = 0.0;
-//					 forcingX2 = 0.0;
-//					 forcingX3 = 0.0;
-//					//!Abbas
-//					//LBMReal dX1_rhoInv = gradX1_rhoInv(rhoL, rhoH - rhoL);
-//					//LBMReal dX2_rhoInv = gradX2_rhoInv(rhoL, rhoH - rhoL);
-//					//LBMReal dX3_rhoInv = gradX3_rhoInv(rhoL, rhoH - rhoL);
-//					//forcingX1 =/* muForcingX1.Eval() / rho*/ +pStar * dX1_rhoInv * rho;
-//					//forcingX2 =/* muForcingX2.Eval() / rho*/ +pStar * dX2_rhoInv * rho;
-//					//forcingX3 =/* muForcingX3.Eval() / rho*/ +pStar * dX3_rhoInv * rho;
-//
-//					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho + pStar * dX1_rhoInv * rho) *c1o2;
-//					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho + pStar * dX2_rhoInv * rho) *c1o2;
-//					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho + pStar * dX3_rhoInv * rho) *c1o2;
-//					 LBMReal FdX1_phi = normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
-//					 LBMReal FdX2_phi = normX2 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
-//					 LBMReal FdX3_phi = normX3 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
-//
-//
-//					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho ) ;
-//					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho ) ;
-//					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho ) ;
-//
-//					//forcingX1 = (pStar * dRhoInvX* rho *c3) ;
-//					//forcingX2 = (pStar * dRhoInvY* rho *c3) ;
-//					//forcingX3 = (pStar * dRhoInvZ* rho *c3) ;
-//					//if (phi[REST] > 0.1 && phi[REST] < 0.9) std::cout << phi[REST] << " " << dX1_phi * rhoToPhi / rho << " " << dRhoInvX * rho *3<< std::endl;
-//					//LBMReal forcingX1ALTERNAT = ( pStar * dX1_rhoInv * rho) ;
-//					//LBMReal forcingX2ALTERNAT = ( pStar * dX2_rhoInv * rho) ;
-//					//LBMReal forcingX3ALTERNAT = ( pStar * dX3_rhoInv * rho) ;
-//
-//					//forcingX1 = (fabs(vvx + c1o2 * forcingX1) < fabs(vvx + c1o2 * forcingX1ALTERNAT)) ? forcingX1 : forcingX1ALTERNAT;
-//					//forcingX2 = (fabs(vvy + c1o2 * forcingX2) < fabs(vvy + c1o2 * forcingX2ALTERNAT)) ? forcingX2 : forcingX2ALTERNAT;
-//					//forcingX3 = (fabs(vvz + c1o2 * forcingX3) < fabs(vvz + c1o2 * forcingX3ALTERNAT)) ? forcingX3 : forcingX3ALTERNAT;
-//
-//					//	 forcingX1 = -pStar * rhoToPhi / rho * normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
-//					//	 forcingX2 = -pStar * rhoToPhi / rho * normX2 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
-//					//	 forcingX3 = -pStar * rhoToPhi / rho * normX3 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
-//
-//					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX1_rhoInv * rho*(phi[REST]));
-//					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX2_rhoInv * rho*(phi[REST]));
-//					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX3_rhoInv * rho*(phi[REST]));
-//						 //if (phi[REST] > 0.3 && phi[REST] < 0.7)
-//						 //{
-//							// int test = 1;
-//							// std::cout << phi[REST] <<" "<< dX1_phi <<" "<< normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale<<" "<< normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale/ dX1_phi<< std::endl;
-//						 //}
-//
-//
-//
-//					 //LBMReal scaleGrad = c2 * phi[REST] * (1.0 - phi[REST]) / ((phi[REST] * phi[REST] + (1.0 - phi[REST]) * (1.0 - phi[REST])) * (phi[REST] * phi[REST] + (1.0 - phi[REST]) * (1.0 - phi[REST])));
-//					 //dX1_phi *= scaleGrad;
-//					 //dX2_phi *= scaleGrad;
-//					 //dX3_phi *= scaleGrad;
-//
-//					 ///Experimental interface sharpening force 20.06.2022
-//
-//					 LBMReal scaleSharpener = 1.0;
-//					 //forcingX1 += scaleSharpener * (FdX1_phi - dX1_phi) * fabsf(FdX1_phi - dX1_phi)  / rho;
-//					 //forcingX2 += scaleSharpener * (FdX2_phi - dX2_phi) * fabsf(FdX2_phi - dX2_phi)  / rho;
-//					 //forcingX3 += scaleSharpener * (FdX3_phi - dX3_phi) * fabsf(FdX3_phi - dX3_phi)  / rho;
-//					///surface tension force
-//					forcingX1 += mu * dX1_phi/rho;
-//					forcingX2 += mu * dX2_phi/rho;
-//					forcingX3 += mu * dX3_phi/rho;
-//
-//					LBMReal forcingBIAS = 0.5;
-//					forcingX1 += muForcingX1.Eval() / rho;//*phi[REST];
-//					forcingX2 += muForcingX2.Eval() / rho;// * phi[REST];
-//					forcingX3 += muForcingX3.Eval() / rho;// * phi[REST];
-//
-//				//	//19.08.2022
-//					//vvx += vvxh / rho * c1o2;
-//					//vvy += vvyh / rho * c1o2;
-//					//vvz += vvzh / rho * c1o2;
-//				//	//
-//
-//
-//					vvx += (forcingX1) * deltaT * c1o2;
-//					vvy += (forcingX2) * deltaT * c1o2;
-//					vvz += (forcingX3) * deltaT * c1o2;
-//
-//					//vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT *  c1o2; // X
-//					//vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT *  c1o2; // Y
-//					//vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT *  c1o2; // Z
-//
-//
-//
-//				//	vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * forcingBIAS; // X
-//				//	vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * forcingBIAS; // Y
-//				//	vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * forcingBIAS; // Z
-//
-//
-//
-//					//Abbas
-//					LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) ))
-//						+ ((mfabb + mfcbb))) );
-//					LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//						+ (((mfaab + mfccb) + (mfacb + mfcab))  + ((mfbaa + mfbcc) + (mfbac + mfbca))))
-//						+ ( (mfbab + mfbcb) )) );
-//					LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
-//						+ ( + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
-//						+ ( (mfbba + mfbbc))));
-//
-//					LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa -mfacc)))
-//						+ (((mfaab + mfccb) + (-mfacb - mfcab))   ))
-//						) );
-//					LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc)))
-//						+ (((mfaba + mfcbc) + (-mfabc - mfcba))))
-//						));
-//					LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ( (mfcaa + mfacc)- (mfcac + mfaca)))
-//						+ (((mfbaa + mfbcc) + (-mfbac - mfbca))))
-//						));
-//					LBMReal vvxI = vvx;
-//					LBMReal vvyI = vvy;
-//					LBMReal vvzI = vvz;
-//
-//					LBMReal collFactorStore=collFactorM;
-//					LBMReal stress;
-//					//for(int iter=0;iter<5;iter++)
-//				 //{
-//					//	LBMReal OxxPyyPzz = 1.0;
-//					//	LBMReal mxxPyyPzz = (M200-vvxI*vvxI) + (M020-vvyI*vvyI) + (M002-vvzI*vvzI);
-//					//	//pStar = mxxPyyPzz * c1o3;
-//					//mxxPyyPzz -= c3 *pStar;
-//
-//					//LBMReal mxxMyy = (M200-vvxI*vvxI) - (M020-vvyI*vvyI);
-//					//LBMReal mxxMzz = (M200-vvxI*vvxI) - (M002-vvzI*vvzI);
-//					//LBMReal mxy = M110 - vvxI * vvyI;
-//					//LBMReal mxz = M101 - vvxI * vvzI;
-//					//LBMReal myz = M011 - vvyI * vvzI;
-//
-//
-//					//mxxMyy *= c1 - collFactorM * c1o2;
-//					//mxxMzz *= c1 - collFactorM * c1o2;
-//					//mxy *= c1 - collFactorM * c1o2;
-//					//mxz *= c1 - collFactorM * c1o2;
-//					//myz *= c1 - collFactorM * c1o2;
-//					//mxxPyyPzz *= c1 - OxxPyyPzz * c1o2;
-//					////mxxPyyPzz = mxxPyyPzz*fabs(mxxPyyPzz)/(1.0e-6+fabs(mxxPyyPzz));
-//					////mxxPyyPzz += c3 * pStar;
-//					//LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz)*c1o3;
-//					//LBMReal myy = (-c2*mxxMyy + mxxMzz + mxxPyyPzz)*c1o3;
-//					//LBMReal mzz = (mxxMyy -c2* mxxMzz + mxxPyyPzz) * c1o3;
-//					//vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho);
-//					//vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho);
-//					//vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho);
-//
-//
-//				////	vvzI = vvz + (mxz * dRhoInvX + myz * dRhoInvY + mzz * dRhoInvZ) *  (rho)*c3;
-//				////	vvxI = vvx + (mxx * dRhoInvX + mxy * dRhoInvY + mxz * dRhoInvZ) *  (rho)*c3;
-//				////	vvyI = vvy + (mxy * dRhoInvX + myy * dRhoInvY + myz * dRhoInvZ) *  (rho)*c3;
-//
-//
-//				//	//LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
-//				//	//
-//				//	//LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy;
-//				//	//LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz;
-//				//	//LBMReal Dxy = -three * collFactorM * mxy;
-//				//	//LBMReal Dxz = -three * collFactorM * mxz;
-//				//	//LBMReal Dyz = -three * collFactorM * myz;
-//				//	////LBMReal stress = sqrt(sqrt((dyuy+dxux+dzuz)* (dyuy + dxux + dzuz))) * sqrt(forcingX1 * forcingX1 + forcingX2 * forcingX2 + forcingX3 * forcingX3);
-//				//	// stress = sqrt(dyuy * dyuy + dxux * dxux + dzuz*dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz)*sqrt(forcingX1*forcingX1+forcingX2*forcingX2+forcingX3*forcingX3);
-//				//	////collFactorM = collFactorStore + (1.75 - collFactorStore) * stress / (stress + 1.0e-8);
-//				//	//
-//				//	//LBMReal dX2_rho = (rhoToPhi)*dX2_phi;
-//				//	//LBMReal dX1_rho = (rhoToPhi)*dX1_phi;
-//				//	//LBMReal dX3_rho = (rhoToPhi)*dX3_phi;
-//				//	////vvxI= vvx+ c1o6 * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
-//				//	////vvyI= vvy+ c1o6 * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
-//				//	////vvzI= vvz+ c1o6 * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
-//
-//				//	//vvxI = vvx + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
-//				//	//vvyI = vvy + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
-//				//	//vvzI = vvz + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
-//
-//				//	////vvxI = vvx - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rhoInv + Dxy * dX2_rhoInv + Dxz * dX3_rhoInv);
-//				//	////vvyI = vvy - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rhoInv + 2 * dyuy * dX2_rhoInv + Dyz * dX3_rhoInv);
-//				//	////vvzI = vvz - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rhoInv + Dyz * dX2_rhoInv + 2 * dyuy * dX3_rhoInv);
-//
-//
-//					//}
-//				//	//forcingX1+=(vvxI-vvx)/(deltaT* forcingBIAS) + muForcingX1.Eval() / rho;
-//				//	//forcingX2 += (vvyI - vvy) / (deltaT * forcingBIAS) + muForcingX2.Eval() / rho;
-//				//	//forcingX3 += (vvzI - vvz) / (deltaT * forcingBIAS) + muForcingX3.Eval() / rho;
-//
-//
-//				////	forcingX1 += c2 * (vvxI - vvx);
-//				////	forcingX2 += c2 * (vvyI - vvy);
-//				////	forcingX3 += c2 * (vvzI - vvz);
-//
-//
-//					//mfabb += c1o2*(-forcingX1) * c2o9;
-//					//mfbab += c1o2*(-forcingX2) * c2o9;
-//					//mfbba += c1o2*(-forcingX3) * c2o9;
-//					//mfaab += c1o2*(-forcingX1 - forcingX2) * c1o18;
-//					//mfcab += c1o2*( forcingX1 - forcingX2) * c1o18;
-//					//mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18;
-//					//mfcba += c1o2*( forcingX1 - forcingX3) * c1o18;
-//					//mfbaa += c1o2*(-forcingX2 - forcingX3) * c1o18;
-//					//mfbca += c1o2*( forcingX2 - forcingX3) * c1o18;
-//					//mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72;
-//					//mfcaa += c1o2*(forcingX1 - forcingX2 - forcingX3) * c1o72;
-//					//mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72;
-//					//mfcca += c1o2*(forcingX1 + forcingX2 - forcingX3) * c1o72;
-//					//mfcbb += c1o2*(forcingX1)*c2o9;
-//					//mfbcb += c1o2*(forcingX2)*c2o9;
-//					//mfbbc += c1o2*(forcingX3)*c2o9;
-//					//mfccb += c1o2*( forcingX1 + forcingX2) * c1o18;
-//					//mfacb += c1o2*(-forcingX1 + forcingX2) * c1o18;
-//					//mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18;
-//					//mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18;
-//					//mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18;
-//					//mfbac += c1o2*(-forcingX2 + forcingX3) * c1o18;
-//					//mfccc += c1o2*(forcingX1 + forcingX2 + forcingX3) * c1o72;
-//					//mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72;
-//					//mfcac += c1o2*(forcingX1 - forcingX2 + forcingX3) * c1o72;
-//					//mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72;
-//
-//
-//					//forcingX1 = saveForceX1;
-//					//forcingX2 = saveForceX2;
-//					//forcingX3 = saveForceX3;
-//					vvx = vvxI;
-//					vvy = vvyI;
-//					vvz = vvzI;
-//
-//
-//
-//					//!Abbas
-//
-//					LBMReal vx2;
-//					LBMReal vy2;
-//					LBMReal vz2;
-//					vx2 = vvx * vvx;
-//					vy2 = vvy * vvy;
-//					vz2 = vvz * vvz;
-//					//pStar =ppStar- (vx2 + vy2 + vz2)*pStar;
-//				//	pStar = (pStar + ppStar)*c1o2;
-//					///////////////////////////////////////////////////////////////////////////////////////////               
-//					LBMReal oMdrho;
-//					///////////////
-//						//mfabb -= pStar * c2o9;
-//						//mfbab -= pStar * c2o9;
-//						//mfbba -= pStar * c2o9;
-//						//mfaab -= pStar * c1o16;
-//						//mfcab -= pStar * c1o16;
-//						//mfaba -= pStar * c1o16;
-//						//mfcba -= pStar * c1o16;
-//						//mfbaa -= pStar * c1o16;
-//						//mfbca -= pStar * c1o16;
-//						//mfaaa -= pStar * c1o72;
-//						//mfcaa -= pStar * c1o72;
-//						//mfaca -= pStar * c1o72;
-//						//mfcca -= pStar * c1o72;
-//						//mfcbb -= pStar * c2o9;
-//						//mfbcb -= pStar * c2o9;
-//						//mfbbc -= pStar * c2o9;
-//						//mfccb -= pStar * c1o16;
-//						//mfacb -= pStar * c1o16;
-//						//mfcbc -= pStar * c1o16;
-//						//mfabc -= pStar * c1o16;
-//						//mfbcc -= pStar * c1o16;
-//						//mfbac -= pStar * c1o16;
-//						//mfccc -= pStar * c1o72;
-//						//mfacc -= pStar * c1o72;
-//						//mfcac -= pStar * c1o72;
-//						//mfaac -= pStar * c1o72;
-//						//mfbbb -= pStar * 8.0/9.0;
-//					///////////////////
-//
-//					oMdrho = mfccc + mfaaa;
-//					m0 = mfaca + mfcac;
-//					m1 = mfacc + mfcaa;
-//					m2 = mfaac + mfcca;
-//					oMdrho += m0;
-//					m1 += m2;
-//					oMdrho += m1;
-//					m0 = mfbac + mfbca;
-//					m1 = mfbaa + mfbcc;
-//					m0 += m1;
-//					m1 = mfabc + mfcba;
-//					m2 = mfaba + mfcbc;
-//					m1 += m2;
-//					m0 += m1;
-//					m1 = mfacb + mfcab;
-//					m2 = mfaab + mfccb;
-//					m1 += m2;
-//					m0 += m1;
-//					oMdrho += m0;
-//					m0 = mfabb + mfcbb;
-//					m1 = mfbab + mfbcb;
-//					m2 = mfbba + mfbbc;
-//					m0 += m1 + m2;
-//					m0 += mfbbb; //hat gefehlt
-//					oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
-//
-//															 ////////////////////////////////////////////////////////////////////////////////////
-//					LBMReal wadjust;
-//					LBMReal qudricLimit = 0.01 / (c1 + 1.0e4 * phi[REST] * (c1 - phi[REST])); //LBMReal qudricLimit = 0.01;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					//Hin
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// Z - Dir
-//					m2 = mfaaa + mfaac;
-//					m1 = mfaac - mfaaa;
-//					m0 = m2 + mfaab;
-//					mfaaa = m0;
-//					m0 += c1o36 * oMdrho;
-//					mfaab = m1 - m0 * vvz;
-//					mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaba + mfabc;
-//					m1 = mfabc - mfaba;
-//					m0 = m2 + mfabb;
-//					mfaba = m0;
-//					m0 += c1o9 * oMdrho;
-//					mfabb = m1 - m0 * vvz;
-//					mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaca + mfacc;
-//					m1 = mfacc - mfaca;
-//					m0 = m2 + mfacb;
-//					mfaca = m0;
-//					m0 += c1o36 * oMdrho;
-//					mfacb = m1 - m0 * vvz;
-//					mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfbaa + mfbac;
-//					m1 = mfbac - mfbaa;
-//					m0 = m2 + mfbab;
-//					mfbaa = m0;
-//					m0 += c1o9 * oMdrho;
-//					mfbab = m1 - m0 * vvz;
-//					mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfbba + mfbbc;
-//					m1 = mfbbc - mfbba;
-//					m0 = m2 + mfbbb;
-//					mfbba = m0;
-//					m0 += c4o9 * oMdrho;
-//					mfbbb = m1 - m0 * vvz;
-//					mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfbca + mfbcc;
-//					m1 = mfbcc - mfbca;
-//					m0 = m2 + mfbcb;
-//					mfbca = m0;
-//					m0 += c1o9 * oMdrho;
-//					mfbcb = m1 - m0 * vvz;
-//					mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfcaa + mfcac;
-//					m1 = mfcac - mfcaa;
-//					m0 = m2 + mfcab;
-//					mfcaa = m0;
-//					m0 += c1o36 * oMdrho;
-//					mfcab = m1 - m0 * vvz;
-//					mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfcba + mfcbc;
-//					m1 = mfcbc - mfcba;
-//					m0 = m2 + mfcbb;
-//					mfcba = m0;
-//					m0 += c1o9 * oMdrho;
-//					mfcbb = m1 - m0 * vvz;
-//					mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfcca + mfccc;
-//					m1 = mfccc - mfcca;
-//					m0 = m2 + mfccb;
-//					mfcca = m0;
-//					m0 += c1o36 * oMdrho;
-//					mfccb = m1 - m0 * vvz;
-//					mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// Y - Dir
-//					m2 = mfaaa + mfaca;
-//					m1 = mfaca - mfaaa;
-//					m0 = m2 + mfaba;
-//					mfaaa = m0;
-//					m0 += c1o6 * oMdrho;
-//					mfaba = m1 - m0 * vvy;
-//					mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaab + mfacb;
-//					m1 = mfacb - mfaab;
-//					m0 = m2 + mfabb;
-//					mfaab = m0;
-//					mfabb = m1 - m0 * vvy;
-//					mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaac + mfacc;
-//					m1 = mfacc - mfaac;
-//					m0 = m2 + mfabc;
-//					mfaac = m0;
-//					m0 += c1o18 * oMdrho;
-//					mfabc = m1 - m0 * vvy;
-//					mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfbaa + mfbca;
-//					m1 = mfbca - mfbaa;
-//					m0 = m2 + mfbba;
-//					mfbaa = m0;
-//					m0 += c2o3 * oMdrho;
-//					mfbba = m1 - m0 * vvy;
-//					mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfbab + mfbcb;
-//					m1 = mfbcb - mfbab;
-//					m0 = m2 + mfbbb;
-//					mfbab = m0;
-//					mfbbb = m1 - m0 * vvy;
-//					mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfbac + mfbcc;
-//					m1 = mfbcc - mfbac;
-//					m0 = m2 + mfbbc;
-//					mfbac = m0;
-//					m0 += c2o9 * oMdrho;
-//					mfbbc = m1 - m0 * vvy;
-//					mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfcaa + mfcca;
-//					m1 = mfcca - mfcaa;
-//					m0 = m2 + mfcba;
-//					mfcaa = m0;
-//					m0 += c1o6 * oMdrho;
-//					mfcba = m1 - m0 * vvy;
-//					mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfcab + mfccb;
-//					m1 = mfccb - mfcab;
-//					m0 = m2 + mfcbb;
-//					mfcab = m0;
-//					mfcbb = m1 - m0 * vvy;
-//					mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfcac + mfccc;
-//					m1 = mfccc - mfcac;
-//					m0 = m2 + mfcbc;
-//					mfcac = m0;
-//					m0 += c1o18 * oMdrho;
-//					mfcbc = m1 - m0 * vvy;
-//					mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// X - Dir
-//					m2 = mfaaa + mfcaa;
-//					m1 = mfcaa - mfaaa;
-//					m0 = m2 + mfbaa;
-//					mfaaa = m0;
-//					m0 += 1. * oMdrho;
-//					mfbaa = m1 - m0 * vvx;
-//					mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaba + mfcba;
-//					m1 = mfcba - mfaba;
-//					m0 = m2 + mfbba;
-//					mfaba = m0;
-//					mfbba = m1 - m0 * vvx;
-//					mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaca + mfcca;
-//					m1 = mfcca - mfaca;
-//					m0 = m2 + mfbca;
-//					mfaca = m0;
-//					m0 += c1o3 * oMdrho;
-//					mfbca = m1 - m0 * vvx;
-//					mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaab + mfcab;
-//					m1 = mfcab - mfaab;
-//					m0 = m2 + mfbab;
-//					mfaab = m0;
-//					mfbab = m1 - m0 * vvx;
-//					mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfabb + mfcbb;
-//					m1 = mfcbb - mfabb;
-//					m0 = m2 + mfbbb;
-//					mfabb = m0;
-//					mfbbb = m1 - m0 * vvx;
-//					mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfacb + mfccb;
-//					m1 = mfccb - mfacb;
-//					m0 = m2 + mfbcb;
-//					mfacb = m0;
-//					mfbcb = m1 - m0 * vvx;
-//					mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfaac + mfcac;
-//					m1 = mfcac - mfaac;
-//					m0 = m2 + mfbac;
-//					mfaac = m0;
-//					m0 += c1o3 * oMdrho;
-//					mfbac = m1 - m0 * vvx;
-//					mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfabc + mfcbc;
-//					m1 = mfcbc - mfabc;
-//					m0 = m2 + mfbbc;
-//					mfabc = m0;
-//					mfbbc = m1 - m0 * vvx;
-//					mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m2 = mfacc + mfccc;
-//					m1 = mfccc - mfacc;
-//					m0 = m2 + mfbcc;
-//					mfacc = m0;
-//					m0 += c1o9 * oMdrho;
-//					mfbcc = m1 - m0 * vvx;
-//					mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// Cumulants
-//					////////////////////////////////////////////////////////////////////////////////////
-//
-//					// mfaaa = 0.0;
-//					LBMReal OxxPyyPzz = 1.0; //omega2 or bulk viscosity
-//											//  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
-//											//  LBMReal OxyyMxzz  = 1.;//2+s9;//
-//					LBMReal O4 = 1.;
-//					LBMReal O5 = 1.;
-//					LBMReal O6 = 1.;
-//
-//					//collFactorM+= (1.7 - collFactorM) * fabs(mfaaa) / (fabs(mfaaa) + 0.001f);
-//
-//
-//					/////fourth order parameters; here only for test. Move out of loop!
-//
-//					LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
-//					LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
-//				    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
-//					LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
-//					//FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' )
-//					LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
-//					//LBMReal stress = 1.0;// stress / (stress + 1.0e-10);
-//					stress = 1.0;
-//					//OxyyPxzz += stress*(1.0-OxyyPxzz);
-//					//OxyyPxzz = c3 * (collFactorM - c2) / (collFactorM - c3);
-//					//OxyyMxzz += stress*(1.0-OxyyMxzz);
-//					//Oxyz +=  stress*(1.0-Oxyz);
-//					//A *= 1.0-stress;
-//					//BB *= 1.0-stress;
-//
-//					//Cum 4.
-//					//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
-//					//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
-//					//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
-//
-//					LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
-//					LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
-//					LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
-//
-//					LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
-//					LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
-//					LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
-//
-//					//Cum 5.
-//					LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
-//					LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
-//					LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
-//
-//					//Cum 6.
-//					LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
-//						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-//						- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-//						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
-//						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-//							+ 2. * (mfcaa * mfaca * mfaac)
-//							+ 16. * mfbba * mfbab * mfabb)
-//						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
-//						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
-//						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
-//							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
-//
-//					//2.
-//					// linear combinations
-//					LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
-//					//pStar = (mxxPyyPzz+vx2+vy2+vz2) * c1o3;//does not work
-//					//pStar = (mxxPyyPzz) * c1o3;
-//					//pStar = pStar + 1.5 * (mxxPyyPzz * c1o3 - pStar);
-//					//mfaaa = mxxPyyPzz;
-//					//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
-//					mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
-//										//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
-//					LBMReal mxxMyy = mfcaa - mfaca;
-//					LBMReal mxxMzz = mfcaa - mfaac;
-//
-//					///
-//					LBMReal mmfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
-//					LBMReal mmfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
-//					LBMReal mmfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
-//					LBMReal mmfabb = mfabb;
-//					LBMReal mmfbab = mfbab;
-//					LBMReal mmfbba = mfbba;
-//					///
-//
-//					LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz)*0;
-//					//LBMReal dxux = -c1o2 * (mxxMyy + mxxMzz) * collFactorM - mfaaa * c1o3* omegaDRho;
-//					LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
-//					LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
-//					LBMReal Dxy = -three * collFactorM * mfbba;
-//					LBMReal Dxz = -three * collFactorM * mfbab;
-//					LBMReal Dyz = -three * collFactorM * mfabb;
-////					// attempt to improve implicit  stress computation by fixed iteration
-////					LBMReal dX2_rho = (rhoToPhi)*dX2_phi;
-////					LBMReal dX1_rho = (rhoToPhi)*dX1_phi;
-////					LBMReal dX3_rho = (rhoToPhi)*dX3_phi;
-////
-////						LBMReal dfx= c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
-////						LBMReal dfy = c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
-////						LBMReal dfz = c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
-////
-////						for (int iteration = 0; iteration < 5; iteration++) {
-////							mxxMyy = (mfcaa - dfx * dfx * c1o2) - (mfaca - dfy * dfy * c1o2);
-////							mxxMzz = (mfcaa - dfx * dfx * c1o2) - (mfaac - dfz * dfz * c1o2);
-////						}
-///////end fixed iteration
-////
-//
-//
-//					//relax
-//					mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
-//					mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
-//					mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
-//
-//					mfabb += collFactorM * (-mfabb);
-//					mfbab += collFactorM * (-mfbab);
-//					mfbba += collFactorM * (-mfbba);
-//
-//					//if (fabsf(mfaaa + (dxux + dyuy + dzuz) > 1e-9)){
-//					//	std::cout << mfaaa <<" "<< (dxux + dyuy + dzuz)<< std::endl;
-//					//}
-//
-//
-//					////updated pressure
-//					//mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
-//					//mfaaa *= (one-omegaDRho);// (mfaaa + (dxux + dyuy + dzuz)) * .5; // Pressure elimination as in standard velocity model
-//								 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
-//				
-//					mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
-//
-//										// mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
-//										//mfaaa = mfaaaS;
-//										// linear combinations back
-//					mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
-//					mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
-//					mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
-//
-//					//3.
-//					// linear combinations
-//					LBMReal mxxyPyzz = mfcba + mfabc;
-//					LBMReal mxxyMyzz = mfcba - mfabc;
-//
-//					LBMReal mxxzPyyz = mfcab + mfacb;
-//					LBMReal mxxzMyyz = mfcab - mfacb;
-//
-//					LBMReal mxyyPxzz = mfbca + mfbac;
-//					LBMReal mxyyMxzz = mfbca - mfbac;
-//
-//					 mmfcaa += c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz- mfaaa);
-//					 mmfaca += c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz- mfaaa);
-//					 mmfaac += c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz- mfaaa);
-//					 mmfabb += mfabb;
-//					 mmfbab += mfbab;
-//					 mmfbba += mfbba;
-//
-//					//relax
-//					wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
-//					mfbbb += wadjust * (-mfbbb);
-//					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
-//					mxxyPyzz += wadjust * (-mxxyPyzz);
-//					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
-//					mxxyMyzz += wadjust * (-mxxyMyzz);
-//					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
-//					mxxzPyyz += wadjust * (-mxxzPyyz);
-//					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
-//					mxxzMyyz += wadjust * (-mxxzMyyz);
-//					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
-//					mxyyPxzz += wadjust * (-mxyyPxzz);
-//					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
-//					mxyyMxzz += wadjust * (-mxyyMxzz);
-//
-//					// linear combinations back
-//					mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
-//					mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
-//					mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
-//					mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
-//					mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
-//					mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
-//
-//					//4.
-//					CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
-//					CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
-//					CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
-//					CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
-//					CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
-//					CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
-//
-//					//5.
-//					CUMbcc += O5 * (-CUMbcc);
-//					CUMcbc += O5 * (-CUMcbc);
-//					CUMccb += O5 * (-CUMccb);
-//
-//					//6.
-//					CUMccc += O6 * (-CUMccc);
-//
-//					//back cumulants to central moments
-//					//4.
-//					//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
-//					//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
-//					//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
-//
-//					mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
-//					mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
-//					mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
-//
-//					mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
-//					mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
-//					mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
-//
-//					//5.
-//					mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
-//					mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
-//					mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
-//
-//					//6.
-//					mfccc = CUMccc - ((-4. * mfbbb * mfbbb
-//						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-//						- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
-//						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
-//						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-//							+ 2. * (mfcaa * mfaca * mfaac)
-//							+ 16. * mfbba * mfbab * mfabb)
-//						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
-//						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
-//						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
-//							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
-//
-//
-//					////////
-//
-//
-//					////////////////////////////////////////////////////////////////////////////////////
-//					//forcing
-//					mfbaa = -mfbaa;// *(c1 - forcingBIAS) / forcingBIAS;
-//					mfaba = -mfaba;// *(c1 - forcingBIAS) / forcingBIAS;
-//					mfaab = -mfaab;// *(c1 - forcingBIAS) / forcingBIAS;
-//
-//					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho);
-//					//mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho);
-//					//mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho);
-//
-//					mfbaa -= c1o2 * rhoToPhi * (mmfcaa* dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho);
-//					mfaba -= c1o2 * rhoToPhi * (mmfbba* dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho);
-//					mfaab -= c1o2 * rhoToPhi * (mmfbab* dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho);
-//					
-//					vvx -= c1o4 * rhoToPhi * (mmfcaa * dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho);
-//					vvy -= c1o4 * rhoToPhi * (mmfbba * dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho);
-//					vvz -= c1o4 * rhoToPhi * (mmfbab * dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho);
-//
-//					vx2 = vvx * vvx;
-//					vy2 = vvy * vvy;
-//					vz2 = vvz * vvz;
-//
-//					//mmfcaa =0;// c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz - mfaaa);
-//					//mmfaca =0;// c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz - mfaaa);
-//					//mmfaac =0;// c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz - mfaaa);
-//					//mmfabb =0;// mfabb;
-//					//mmfbab =0;// mfbab;
-//					//mmfbba =0;// mfbba;
-//
-//
-//					//////////////////////////////////////////////////////////////////////////////////////
-//					//grad Rho
-//					//LBMReal dX1_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX1_phi - phi[REST] * three * gradPx;
-//					//LBMReal dX2_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX2_phi - phi[REST] * three * gradPy;
-//					//LBMReal dX3_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX3_phi - phi[REST] * three * gradPz;
-//
-//					//LBMReal dX2_rho = (rhoToPhi ) * dX2_phi ;
-//					//LBMReal dX1_rho = (rhoToPhi ) * dX1_phi ;
-//					//LBMReal dX3_rho = (rhoToPhi ) * dX3_phi ;
-//					///////////////////////////////////////////////////////////////////////////////////////
-//					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
-//					//mfaba += c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
-//					//mfaab += c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
-//					
-//					///////Fakhari pressure correction
-//					//mfbaa -= mfaaa / rho * dX1_rho*c1o3;
-//					//mfaba -= mfaaa / rho * dX2_rho*c1o3;
-//					//mfaab -= mfaaa / rho * dX3_rho*c1o3;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					//back
-//					////////////////////////////////////////////////////////////////////////////////////
-//					//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// Z - Dir
-//					m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
-//					m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
-//					m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
-//					mfaaa = m0;
-//					mfaab = m1;
-//					mfaac = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
-//					m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
-//					m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
-//					mfaba = m0;
-//					mfabb = m1;
-//					mfabc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
-//					m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
-//					m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
-//					mfaca = m0;
-//					mfacb = m1;
-//					mfacc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
-//					m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
-//					m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
-//					mfbaa = m0;
-//					mfbab = m1;
-//					mfbac = m2;
-//					/////////b//////////////////////////////////////////////////////////////////////////
-//					m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
-//					m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
-//					m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
-//					mfbba = m0;
-//					mfbbb = m1;
-//					mfbbc = m2;
-//					/////////b//////////////////////////////////////////////////////////////////////////
-//					m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
-//					m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
-//					m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
-//					mfbca = m0;
-//					mfbcb = m1;
-//					mfbcc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
-//					m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
-//					m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
-//					mfcaa = m0;
-//					mfcab = m1;
-//					mfcac = m2;
-//					/////////c//////////////////////////////////////////////////////////////////////////
-//					m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
-//					m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
-//					m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
-//					mfcba = m0;
-//					mfcbb = m1;
-//					mfcbc = m2;
-//					/////////c//////////////////////////////////////////////////////////////////////////
-//					m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
-//					m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
-//					m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
-//					mfcca = m0;
-//					mfccb = m1;
-//					mfccc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// Y - Dir
-//					m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
-//					m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
-//					m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
-//					mfaaa = m0;
-//					mfaba = m1;
-//					mfaca = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
-//					m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
-//					m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
-//					mfaab = m0;
-//					mfabb = m1;
-//					mfacb = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
-//					m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
-//					m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
-//					mfaac = m0;
-//					mfabc = m1;
-//					mfacc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
-//					m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
-//					m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
-//					mfbaa = m0;
-//					mfbba = m1;
-//					mfbca = m2;
-//					/////////b//////////////////////////////////////////////////////////////////////////
-//					m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
-//					m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
-//					m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
-//					mfbab = m0;
-//					mfbbb = m1;
-//					mfbcb = m2;
-//					/////////b//////////////////////////////////////////////////////////////////////////
-//					m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
-//					m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
-//					m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
-//					mfbac = m0;
-//					mfbbc = m1;
-//					mfbcc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
-//					m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
-//					m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
-//					mfcaa = m0;
-//					mfcba = m1;
-//					mfcca = m2;
-//					/////////c//////////////////////////////////////////////////////////////////////////
-//					m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
-//					m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
-//					m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
-//					mfcab = m0;
-//					mfcbb = m1;
-//					mfccb = m2;
-//					/////////c//////////////////////////////////////////////////////////////////////////
-//					m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
-//					m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
-//					m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
-//					mfcac = m0;
-//					mfcbc = m1;
-//					mfccc = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
-//					////////////////////////////////////////////////////////////////////////////////////
-//					// X - Dir
-//					m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
-//					m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfaaa = m0;
-//					mfbaa = m1;
-//					mfcaa = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
-//					m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfaba = m0;
-//					mfbba = m1;
-//					mfcba = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
-//					m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfaca = m0;
-//					mfbca = m1;
-//					mfcca = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
-//					m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfaab = m0;
-//					mfbab = m1;
-//					mfcab = m2;
-//					///////////b////////////////////////////////////////////////////////////////////////
-//					m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
-//					m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfabb = m0;
-//					mfbbb = m1;
-//					mfcbb = m2;
-//					///////////b////////////////////////////////////////////////////////////////////////
-//					m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
-//					m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfacb = m0;
-//					mfbcb = m1;
-//					mfccb = m2;
-//					////////////////////////////////////////////////////////////////////////////////////
-//					////////////////////////////////////////////////////////////////////////////////////
-//					m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
-//					m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfaac = m0;
-//					mfbac = m1;
-//					mfcac = m2;
-//					///////////c////////////////////////////////////////////////////////////////////////
-//					m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
-//					m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfabc = m0;
-//					mfbbc = m1;
-//					mfcbc = m2;
-//					///////////c////////////////////////////////////////////////////////////////////////
-//					m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
-//					m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
-//					m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
-//					mfacc = m0;
-//					mfbcc = m1;
-//					mfccc = m2;
-//					/////SimpleForce
-//
-//					//mfabb += c2o9 * deltaP;
-//					//mfbab += c2o9 * deltaP;
-//					//mfbba += c2o9 * deltaP;
-//					//mfaab += c1o18 * deltaP;
-//					//mfcab += c1o18 * deltaP;
-//					//mfaba += c1o18 * deltaP;
-//					//mfcba += c1o18 * deltaP;
-//					//mfbaa += c1o18 * deltaP;
-//					//mfbca += c1o18 * deltaP;
-//					//mfaaa += c1o72 * deltaP;
-//					//mfcaa += c1o72 * deltaP;
-//					//mfaca += c1o72 * deltaP;
-//					//mfcca += c1o72 * deltaP;
-//					//mfcbb += c2o9 * deltaP;
-//					//mfbcb += c2o9 * deltaP;
-//					//mfbbc += c2o9 * deltaP;
-//					//mfccb += c1o18 * deltaP;
-//					//mfacb += c1o18 * deltaP;
-//					//mfcbc += c1o18 * deltaP;
-//					//mfabc += c1o18 * deltaP;
-//					//mfbcc += c1o18 * deltaP;
-//					//mfbac += c1o18 * deltaP;
-//					//mfccc += c1o72 * deltaP;
-//					//mfacc += c1o72 * deltaP;
-//					//mfcac += c1o72 * deltaP;
-//					//mfaac += c1o72 * deltaP;
-//
-//					//mfabb += c1o2*(-forcingX1                        ) * c2o9;
-//					//mfbab += c1o2*(           - forcingX2            ) * c2o9;
-//					//mfbba += c1o2*(                       - forcingX3) * c2o9;
-//					//mfaab += c1o2*(-forcingX1 - forcingX2            ) * c1o18;
-//					//mfcab += c1o2*( forcingX1 - forcingX2            ) * c1o18;
-//					//mfaba += c1o2*(-forcingX1             - forcingX3) * c1o18;
-//					//mfcba += c1o2*( forcingX1             - forcingX3) * c1o18;
-//					//mfbaa += c1o2*(           - forcingX2 - forcingX3) * c1o18;
-//					//mfbca += c1o2*(             forcingX2 - forcingX3) * c1o18;
-//					//mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72;
-//					//mfcaa += c1o2*( forcingX1 - forcingX2 - forcingX3) * c1o72;
-//					//mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72;
-//					//mfcca += c1o2*( forcingX1 + forcingX2 - forcingX3) * c1o72;
-//					//mfcbb += c1o2*( forcingX1                        ) * c2o9;
-//					//mfbcb += c1o2*(             forcingX2            ) * c2o9;
-//					//mfbbc += c1o2*(                         forcingX3) * c2o9;
-//					//mfccb += c1o2*( forcingX1 + forcingX2            ) * c1o18;
-//					//mfacb += c1o2*(-forcingX1 + forcingX2            ) * c1o18;
-//					//mfcbc += c1o2*( forcingX1             + forcingX3) * c1o18;
-//					//mfabc += c1o2*(-forcingX1             + forcingX3) * c1o18;
-//					//mfbcc += c1o2*(             forcingX2 + forcingX3) * c1o18;
-//					//mfbac += c1o2*(           - forcingX2 + forcingX3) * c1o18;
-//					//mfccc += c1o2*( forcingX1 + forcingX2 + forcingX3) * c1o72;
-//					//mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72;
-//					//mfcac += c1o2*( forcingX1 - forcingX2 + forcingX3) * c1o72;
-//					//mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72;
-//					//pStarStart -= (vx2 + vy2 + vz2) * c1o3;
-//
-//					///Take the diffusion part with out
-//
-//					//mfStartcbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::E  , zeroReal, vvx, vvy, vvz);
-//					//mfStartbcb -= D3Q27System::getIncompFeqForDirection(D3Q27System::N  , zeroReal, vvx, vvy, vvz);
-//					//mfStartbbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::T  , zeroReal, vvx, vvy, vvz);
-//					//mfStartccb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NE , zeroReal, vvx, vvy, vvz);
-//					//mfStartacb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NW , zeroReal, vvx, vvy, vvz);
-//					//mfStartcbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TE , zeroReal, vvx, vvy, vvz);
-//					//mfStartabc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TW , zeroReal, vvx, vvy, vvz);
-//					//mfStartbcc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TN , zeroReal, vvx, vvy, vvz);
-//					//mfStartbac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TS , zeroReal, vvx, vvy, vvz);
-//					//mfStartccc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNE, zeroReal, vvx, vvy, vvz);
-//					//mfStartacc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNW, zeroReal, vvx, vvy, vvz);
-//					//mfStartcac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSE, zeroReal, vvx, vvy, vvz);
-//					//mfStartaac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSW, zeroReal, vvx, vvy, vvz);
-//					//mfStartabb -= D3Q27System::getIncompFeqForDirection(D3Q27System::W  , zeroReal, vvx, vvy, vvz);
-//					//mfStartbab -= D3Q27System::getIncompFeqForDirection(D3Q27System::S  , zeroReal, vvx, vvy, vvz);
-//					//mfStartbba -= D3Q27System::getIncompFeqForDirection(D3Q27System::B  , zeroReal, vvx, vvy, vvz);
-//					//mfStartaab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SW , zeroReal, vvx, vvy, vvz);
-//					//mfStartcab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SE , zeroReal, vvx, vvy, vvz);
-//					//mfStartaba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BW , zeroReal, vvx, vvy, vvz);
-//					//mfStartcba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BE , zeroReal, vvx, vvy, vvz);
-//					//mfStartbaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BS , zeroReal, vvx, vvy, vvz);
-//					//mfStartbca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BN , zeroReal, vvx, vvy, vvz);
-//					//mfStartaaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSW, zeroReal, vvx, vvy, vvz);
-//					//mfStartcaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSE, zeroReal, vvx, vvy, vvz);
-//					//mfStartaca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNW, zeroReal, vvx, vvy, vvz);
-//					//mfStartcca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNE, zeroReal, vvx, vvy, vvz);
-//					//mfStartbbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::REST, zeroReal, vvx, vvy, vvz);
-//					//
-//					//pStar += pStarStart*(omegaDRho-c1);
-//
-//					//mfStartcbb = c2o9 * pStar;
-//					//	mfStartbcb= c2o9 * pStar;
-//					//	mfStartbbc= c2o9 * pStar;
-//					//	mfStartccb= c1o18 * pStar;
-//					//	mfStartacb= c1o18 * pStar;
-//					//	mfStartcbc= c1o18 * pStar;
-//					//	mfStartabc= c1o18 * pStar;
-//					//	mfStartbcc= c1o18 * pStar;
-//					//	mfStartbac= c1o18 * pStar;
-//					//	mfStartccc= c1o72 * pStar;
-//					//	mfStartacc= c1o72 * pStar;
-//					//	mfStartcac= c1o72 * pStar;
-//					//	mfStartaac= c1o72 * pStar;
-//					//	mfStartabb= c2o9 * pStar;
-//					//	mfStartbab= c2o9 * pStar;
-//					//	mfStartbba= c2o9 * pStar;
-//					//	mfStartaab= c1o18 * pStar;
-//					//	mfStartcab= c1o18 * pStar;
-//					//	mfStartaba= c1o18 * pStar;
-//					//	mfStartcba= c1o18 * pStar;
-//					//	mfStartbaa= c1o18 * pStar;
-//					//	mfStartbca= c1o18 * pStar;
-//					//	mfStartaaa= c1o72 * pStar;
-//					//	mfStartcaa= c1o72 * pStar;
-//					//	mfStartaca= c1o72 * pStar;
-//					//	mfStartcca= c1o72 * pStar;
-//					//	mfStartbbb= c4 * c2o9 * pStar;
-//
-//					//mfaaa -= c1o2 * (mfStartaaa + mfStartccc)+ c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa);
-//					//mfaab -= c1o2 * (mfStartaab + mfStartccb)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa));
-//					//mfaac -= c1o2 * (mfStartaac + mfStartcca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa);
-//					//mfaba -= c1o2 * (mfStartaba + mfStartcbc)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa);
-//					//mfabb -= c1o2 * (mfStartabb + mfStartcbb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa);
-//					//mfabc -= c1o2 * (mfStartabc + mfStartcba)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa);
-//					//mfaca -= c1o2 * (mfStartaca + mfStartcac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa);
-//					//mfacb -= c1o2 * (mfStartacb + mfStartcab)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa));
-//					//mfacc -= c1o2 * (mfStartacc + mfStartcaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa);
-//					//mfbaa -= c1o2 * (mfStartbaa + mfStartbcc)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa);
-//					//mfbab -= c1o2 * (mfStartbab + mfStartbcb)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa);
-//					//mfbac -= c1o2 * (mfStartbac + mfStartbca)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa);
-//					//mfbba -= c1o2 * (mfStartbba + mfStartbbc)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa);
-//					//mfbbb -=  (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa));
-//					//mfbbc -= c1o2 * (mfStartbbc + mfStartbba)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa);
-//					//mfbca -= c1o2 * (mfStartbca + mfStartbac)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa);
-//					//mfbcb -= c1o2 * (mfStartbcb + mfStartbab)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa);
-//					//mfbcc -= c1o2 * (mfStartbcc + mfStartbaa)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa);
-//					//mfcaa -= c1o2 * (mfStartcaa + mfStartacc)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa);
-//					//mfcab -= c1o2 * (mfStartcab + mfStartacb)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa));
-//					//mfcac -= c1o2 * (mfStartcac + mfStartaca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa);
-//					//mfcba -= c1o2 * (mfStartcba + mfStartabc)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa);
-//					//mfcbb -= c1o2 * (mfStartcbb + mfStartabb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa);
-//					//mfcbc -= c1o2 * (mfStartcbc + mfStartaba)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa);
-//					//mfcca -= c1o2 * (mfStartcca + mfStartaac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa);
-//					//mfccb -= c1o2 * (mfStartccb + mfStartaab)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa));
-//					//mfccc -= c1o2 * (mfStartccc + mfStartaaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa);
-//
-//					//mfhaaa =rho*( c1o2 * (mfStartaaa + mfStartccc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa));
-//					//mfhaab =rho*( c1o2 * (mfStartaab + mfStartccb) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)));
-//					//mfhaac =rho*( c1o2 * (mfStartaac + mfStartcca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa));
-//					//mfhaba =rho*( c1o2 * (mfStartaba + mfStartcbc) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa));
-//					//mfhabb =rho*( c1o2 * (mfStartabb + mfStartcbb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa));
-//					//mfhabc =rho*( c1o2 * (mfStartabc + mfStartcba) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa));
-//					//mfhaca =rho*( c1o2 * (mfStartaca + mfStartcac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa));
-//					//mfhacb =rho*( c1o2 * (mfStartacb + mfStartcab) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)));
-//					//mfhacc =rho*( c1o2 * (mfStartacc + mfStartcaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa));
-//					//mfhbaa =rho*( c1o2 * (mfStartbaa + mfStartbcc) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa));
-//					//mfhbab =rho*( c1o2 * (mfStartbab + mfStartbcb) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa));
-//					//mfhbac =rho*( c1o2 * (mfStartbac + mfStartbca) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa));
-//					//mfhbba =rho*( c1o2 * (mfStartbba + mfStartbbc) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa));
-//					//mfhbbb =rho*( (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa)));
-//					//mfhbbc =rho*( c1o2 * (mfStartbbc + mfStartbba) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa));
-//					//mfhbca =rho*( c1o2 * (mfStartbca + mfStartbac) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa));
-//					//mfhbcb =rho*( c1o2 * (mfStartbcb + mfStartbab) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa));
-//					//mfhbcc =rho*( c1o2 * (mfStartbcc + mfStartbaa) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa));
-//					//mfhcaa =rho*( c1o2 * (mfStartcaa + mfStartacc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa));
-//					//mfhcab =rho*( c1o2 * (mfStartcab + mfStartacb) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)));
-//					//mfhcac =rho*( c1o2 * (mfStartcac + mfStartaca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa));
-//					//mfhcba =rho*( c1o2 * (mfStartcba + mfStartabc) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa));
-//					//mfhcbb =rho*( c1o2 * (mfStartcbb + mfStartabb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa));
-//					//mfhcbc =rho*( c1o2 * (mfStartcbc + mfStartaba) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa));
-//					//mfhcca =rho*( c1o2 * (mfStartcca + mfStartaac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa));
-//					//mfhccb =rho*( c1o2 * (mfStartccb + mfStartaab) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)));
-//					//mfhccc =rho*( c1o2 * (mfStartccc + mfStartaaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa));
-//
-//
-//
-//
-//					pStar += pStarStart*(omegaDRho-c1);
-//
-//					mfcbb -= c2o9*pStar;
-//					mfbcb -= c2o9*pStar;
-//					mfbbc -= c2o9*pStar;
-//					mfccb -= c1o18*pStar;
-//					mfacb -= c1o18*pStar;
-//					mfcbc -= c1o18*pStar;
-//					mfabc -= c1o18*pStar;
-//					mfbcc -= c1o18*pStar;
-//					mfbac -= c1o18*pStar;
-//					mfccc -= c1o72*pStar;
-//					mfacc -= c1o72*pStar;
-//					mfcac -= c1o72*pStar;
-//					mfaac -= c1o72*pStar;
-//					mfabb -= c2o9*pStar;
-//					mfbab -= c2o9*pStar;
-//					mfbba -= c2o9*pStar;
-//					mfaab -= c1o18*pStar;
-//					mfcab -= c1o18*pStar;
-//					mfaba -= c1o18*pStar;
-//					mfcba -= c1o18*pStar;
-//					mfbaa -= c1o18*pStar;
-//					mfbca -= c1o18*pStar;
-//					mfaaa -= c1o72*pStar;
-//					mfcaa -= c1o72*pStar;
-//					mfaca -= c1o72*pStar;
-//					mfcca -= c1o72*pStar;
-//					mfbbb -= c4*c2o9*pStar;
-//
-//					mfhbcb = rho*c2o9 * pStar;
-//					mfhbbc = rho*c2o9 * pStar;
-//					mfhcbb = rho*c2o9 * pStar;
-//					mfhccb = rho*c1o18 * pStar;
-//					mfhacb = rho*c1o18 * pStar;
-//					mfhcbc = rho*c1o18 * pStar;
-//					mfhabc = rho*c1o18 * pStar;
-//					mfhbcc = rho*c1o18 * pStar;
-//					mfhbac = rho*c1o18 * pStar;
-//					mfhccc = rho*c1o72 * pStar;
-//					mfhacc = rho*c1o72 * pStar;
-//					mfhcac = rho*c1o72 * pStar;
-//					mfhaac = rho*c1o72 * pStar;
-//					mfhabb = rho*c2o9 * pStar;
-//					mfhbab = rho*c2o9 * pStar;
-//					mfhbba = rho*c2o9 * pStar;
-//					mfhaab = rho*c1o18 * pStar;
-//					mfhcab = rho*c1o18 * pStar;
-//					mfhaba = rho*c1o18 * pStar;
-//					mfhcba = rho*c1o18 * pStar;
-//					mfhbaa = rho*c1o18 * pStar;
-//					mfhbca = rho*c1o18 * pStar;
-//					mfhaaa = rho*c1o72 * pStar;
-//					mfhcaa = rho*c1o72 * pStar;
-//					mfhaca = rho*c1o72 * pStar;
-//					mfhcca = rho*c1o72 * pStar;
-//					mfhbbb = rho*c4 * c2o9 * pStar;
-//
-//					//mfStartbcb =  c2o9  * pStarStart;
-//					//mfStartbbc =  c2o9  * pStarStart;
-//					//mfStartcbb =  c2o9  * pStarStart;
-//					//mfStartccb =  c1o18 * pStarStart;
-//					//mfStartacb =  c1o18 * pStarStart;
-//					//mfStartcbc =  c1o18 * pStarStart;
-//					//mfStartabc =  c1o18 * pStarStart;
-//					//mfStartbcc =  c1o18 * pStarStart;
-//					//mfStartbac =  c1o18 * pStarStart;
-//					//mfStartccc =  c1o72 * pStarStart;
-//					//mfStartacc =  c1o72 * pStarStart;
-//					//mfStartcac =  c1o72 * pStarStart;
-//					//mfStartaac =  c1o72 * pStarStart;
-//					//mfStartabb =  c2o9  * pStarStart;
-//					//mfStartbab =  c2o9  * pStarStart;
-//					//mfStartbba =  c2o9  * pStarStart;
-//					//mfStartaab =  c1o18 * pStarStart;
-//					//mfStartcab =  c1o18 * pStarStart;
-//					//mfStartaba =  c1o18 * pStarStart;
-//					//mfStartcba =  c1o18 * pStarStart;
-//					//mfStartbaa =  c1o18 * pStarStart;
-//					//mfStartbca =  c1o18 * pStarStart;
-//					//mfStartaaa =  c1o72 * pStarStart;
-//					//mfStartcaa =  c1o72 * pStarStart;
-//					//mfStartaca =  c1o72 * pStarStart;
-//					//mfStartcca =  c1o72 * pStarStart;
-//					//mfStartbbb =  c4 * c2o9 * pStarStart;
-//
-//					//LBMReal scaleSplit = 0.5;
-//					//mfStartbcb = mfStartbcb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
-//					//mfStartbbc = mfStartbbc*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
-//					//mfStartcbb = mfStartcbb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
-//					//mfStartccb = mfStartccb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartacb = mfStartacb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartcbc = mfStartcbc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartabc = mfStartabc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartbcc = mfStartbcc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartbac = mfStartbac*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartccc = mfStartccc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartacc = mfStartacc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartcac = mfStartcac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartaac = mfStartaac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartabb = mfStartabb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
-//					//mfStartbab = mfStartbab*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
-//					//mfStartbba = mfStartbba*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
-//					//mfStartaab = mfStartaab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartcab = mfStartcab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartaba = mfStartaba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartcba = mfStartcba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartbaa = mfStartbaa*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartbca = mfStartbca*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
-//					//mfStartaaa = mfStartaaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartcaa = mfStartcaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartaca = mfStartaca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartcca = mfStartcca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
-//					//mfStartbbb = mfStartbbb*scaleSplit+(c1-scaleSplit)* c4 * c2o9 * pStarStart;
-//
-//
-//					//mfaaa -= c1o2 * (mfStartaaa + mfStartccc);
-//     //               mfaab -= c1o2 * (mfStartaab + mfStartccb);
-//     //               mfaac -= c1o2 * (mfStartaac + mfStartcca);
-//     //               mfaba -= c1o2 * (mfStartaba + mfStartcbc);
-//     //               mfabb -= c1o2 * (mfStartabb + mfStartcbb);
-//     //               mfabc -= c1o2 * (mfStartabc + mfStartcba);
-//     //               mfaca -= c1o2 * (mfStartaca + mfStartcac);
-//     //               mfacb -= c1o2 * (mfStartacb + mfStartcab);
-//     //               mfacc -= c1o2 * (mfStartacc + mfStartcaa);
-//     //               mfbaa -= c1o2 * (mfStartbaa + mfStartbcc);
-//     //               mfbab -= c1o2 * (mfStartbab + mfStartbcb);
-//     //               mfbac -= c1o2 * (mfStartbac + mfStartbca);
-//     //               mfbba -= c1o2 * (mfStartbba + mfStartbbc);
-//					//mfbbb -= (mfStartbbb);
-//     //               mfbbc -= c1o2 * (mfStartbbc + mfStartbba);
-//     //               mfbca -= c1o2 * (mfStartbca + mfStartbac);
-//     //               mfbcb -= c1o2 * (mfStartbcb + mfStartbab);
-//     //               mfbcc -= c1o2 * (mfStartbcc + mfStartbaa);
-//     //               mfcaa -= c1o2 * (mfStartcaa + mfStartacc);
-//     //               mfcab -= c1o2 * (mfStartcab + mfStartacb);
-//     //               mfcac -= c1o2 * (mfStartcac + mfStartaca);
-//     //               mfcba -= c1o2 * (mfStartcba + mfStartabc);
-//     //               mfcbb -= c1o2 * (mfStartcbb + mfStartabb);
-//     //               mfcbc -= c1o2 * (mfStartcbc + mfStartaba);
-//     //               mfcca -= c1o2 * (mfStartcca + mfStartaac);
-//     //               mfccb -= c1o2 * (mfStartccb + mfStartaab);
-//     //               mfccc -= c1o2 * (mfStartccc + mfStartaaa);
-//					//												
-//					//mfhaaa += rho*c1o2 * (mfStartaaa + mfStartccc);
-//					//mfhaab += rho*c1o2 * (mfStartaab + mfStartccb);
-//					//mfhaac += rho*c1o2 * (mfStartaac + mfStartcca);
-//					//mfhaba += rho*c1o2 * (mfStartaba + mfStartcbc);
-//					//mfhabb += rho*c1o2 * (mfStartabb + mfStartcbb);
-//					//mfhabc += rho*c1o2 * (mfStartabc + mfStartcba);
-//					//mfhaca += rho*c1o2 * (mfStartaca + mfStartcac);
-//					//mfhacb += rho*c1o2 * (mfStartacb + mfStartcab);
-//					//mfhacc += rho*c1o2 * (mfStartacc + mfStartcaa);
-//					//mfhbaa += rho*c1o2 * (mfStartbaa + mfStartbcc);
-//					//mfhbab += rho*c1o2 * (mfStartbab + mfStartbcb);
-//					//mfhbac += rho*c1o2 * (mfStartbac + mfStartbca);
-//					//mfhbba += rho*c1o2 * (mfStartbba + mfStartbbc);
-//					//mfhbbb += rho*(mfStartbbb);
-//					//mfhbbc += rho*c1o2 * (mfStartbbc + mfStartbba);
-//					//mfhbca += rho*c1o2 * (mfStartbca + mfStartbac);
-//					//mfhbcb += rho*c1o2 * (mfStartbcb + mfStartbab);
-//					//mfhbcc += rho*c1o2 * (mfStartbcc + mfStartbaa);
-//					//mfhcaa += rho*c1o2 * (mfStartcaa + mfStartacc);
-//					//mfhcab += rho*c1o2 * (mfStartcab + mfStartacb);
-//					//mfhcac += rho*c1o2 * (mfStartcac + mfStartaca);
-//					//mfhcba += rho*c1o2 * (mfStartcba + mfStartabc);
-//					//mfhcbb += rho*c1o2 * (mfStartcbb + mfStartabb);
-//					//mfhcbc += rho*c1o2 * (mfStartcbc + mfStartaba);
-//					//mfhcca += rho*c1o2 * (mfStartcca + mfStartaac);
-//					//mfhccb += rho*c1o2 * (mfStartccb + mfStartaab);
-//					//mfhccc += rho*c1o2 * (mfStartccc + mfStartaaa);
-//					//mfhbcb += c1o6 * c2o9 * deltaPP;
-//					//mfhbbc += c1o6 * c2o9 * deltaPP;
-//					//mfhcbb += c1o6 * c2o9 * deltaPP;
-//					//mfhccb += c1o6 * c1o18 * deltaPP;
-//					//mfhacb += c1o6 * c1o18 * deltaPP;
-//					//mfhcbc += c1o6 * c1o18 * deltaPP;
-//					//mfhabc += c1o6 * c1o18 * deltaPP;
-//					//mfhbcc += c1o6 * c1o18 * deltaPP;
-//					//mfhbac += c1o6 * c1o18 * deltaPP;
-//					//mfhccc += c1o6 * c1o72 * deltaPP;
-//					//mfhacc += c1o6 * c1o72 * deltaPP;
-//					//mfhcac += c1o6 * c1o72 * deltaPP;
-//					//mfhaac += c1o6 * c1o72 * deltaPP;
-//					//mfhabb += c1o6 * c2o9 * deltaPP;
-//					//mfhbab += c1o6 * c2o9 * deltaPP;
-//					//mfhbba += c1o6 * c2o9 * deltaPP;
-//					//mfhaab += c1o6 * c1o18 * deltaPP;
-//					//mfhcab += c1o6 * c1o18 * deltaPP;
-//					//mfhaba += c1o6 * c1o18 * deltaPP;
-//					//mfhcba += c1o6 * c1o18 * deltaPP;
-//					//mfhbaa += c1o6 * c1o18 * deltaPP;
-//					//mfhbca += c1o6 * c1o18 * deltaPP;
-//					//mfhaaa += c1o6 * c1o72 * deltaPP;
-//					//mfhcaa += c1o6 * c1o72 * deltaPP;
-//					//mfhaca += c1o6 * c1o72 * deltaPP;
-//					//mfhcca += c1o6 * c1o72 * deltaPP;
-//					//mfhbbb += c1o6 * c4 * c2o9 * deltaPP;
-//
-//
-//					//mfhbcb = c1o3/rho * c2o9 ;
-//					//mfhbbc = c1o3/rho * c2o9 ;
-//					//mfhcbb = c1o3/rho * c2o9 ;
-//					//mfhccb = c1o3/rho * c1o18 ;
-//					//mfhacb = c1o3/rho * c1o18 ;
-//					//mfhcbc = c1o3/rho * c1o18 ;
-//					//mfhabc = c1o3/rho * c1o18 ;
-//					//mfhbcc = c1o3/rho * c1o18 ;
-//					//mfhbac = c1o3/rho * c1o18 ;
-//					//mfhccc = c1o3/rho * c1o72 ;
-//					//mfhacc = c1o3/rho * c1o72 ;
-//					//mfhcac = c1o3/rho * c1o72 ;
-//					//mfhaac = c1o3/rho * c1o72 ;
-//					//mfhabb = c1o3/rho * c2o9 ;
-//					//mfhbab = c1o3/rho * c2o9 ;
-//					//mfhbba = c1o3/rho * c2o9 ;
-//					//mfhaab = c1o3/rho * c1o18 ;
-//					//mfhcab = c1o3/rho * c1o18 ;
-//					//mfhaba = c1o3/rho * c1o18 ;
-//					//mfhcba = c1o3/rho * c1o18 ;
-//					//mfhbaa = c1o3/rho * c1o18 ;
-//					//mfhbca = c1o3/rho * c1o18 ;
-//					//mfhaaa = c1o3/rho * c1o72 ;
-//					//mfhcaa = c1o3/rho * c1o72 ;
-//					//mfhaca = c1o3/rho * c1o72 ;
-//					//mfhcca = c1o3/rho * c1o72 ;
-//					//mfhbbb = c1/rho;//c1o3/rho * c4 * c2o9 ;
-//
-//
-//					
-//					//mfabb += c1o2 * c2o9 * pStar * (phi[REST] - phi[W]) * rhoToPhi / rho;
-//					//mfbab += c1o2 * c2o9 * pStar * (phi[REST] - phi[S]) * rhoToPhi / rho;
-//					//mfbba += c1o2 * c2o9 * pStar * (phi[REST] - phi[B]) * rhoToPhi / rho;
-//					//mfaab += c1o2 * c1o18 * pStar * (phi[REST] - phi[SW]) * rhoToPhi / rho;
-//					//mfcab += c1o2 * c1o18 * pStar * (phi[REST] - phi[SE]) * rhoToPhi / rho;
-//					//mfaba += c1o2 * c1o18 * pStar * (phi[REST] - phi[BW]) * rhoToPhi / rho;
-//					//mfcba += c1o2 * c1o18 * pStar * (phi[REST] - phi[BE]) * rhoToPhi / rho;
-//					//mfbaa += c1o2 * c1o18 * pStar * (phi[REST] - phi[BS]) * rhoToPhi / rho;
-//					//mfbca += c1o2 * c1o18 * pStar * (phi[REST] - phi[BN]) * rhoToPhi / rho;
-//					//mfaaa += c1o2 * c1o72 * pStar * (phi[REST] - phi[BSW]) * rhoToPhi / rho;
-//					//mfcaa += c1o2 * c1o72 * pStar * (phi[REST] - phi[BSE]) * rhoToPhi / rho;
-//					//mfaca += c1o2 * c1o72 * pStar * (phi[REST] - phi[BNW]) * rhoToPhi / rho;
-//					//mfcca += c1o2 * c1o72 * pStar * (phi[REST] - phi[BNE]) * rhoToPhi / rho;
-//					//mfcbb += c1o2 * c2o9 * pStar * (phi[REST] - phi[E]) * rhoToPhi / rho;
-//					//mfbcb += c1o2 * c2o9 * pStar * (phi[REST] - phi[N]) * rhoToPhi / rho;
-//					//mfbbc += c1o2 * c2o9 * pStar * (phi[REST] - phi[T]) * rhoToPhi / rho;
-//					//mfccb += c1o2 * c1o18 * pStar * (phi[REST] - phi[NE]) * rhoToPhi / rho;
-//					//mfacb += c1o2 * c1o18 * pStar * (phi[REST] - phi[NW]) * rhoToPhi / rho;
-//					//mfcbc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TE]) * rhoToPhi / rho;
-//					//mfabc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TW]) * rhoToPhi / rho;
-//					//mfbcc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TN]) * rhoToPhi / rho;
-//					//mfbac += c1o2 * c1o18 * pStar * (phi[REST] - phi[TS]) * rhoToPhi / rho;
-//					//mfccc += c1o2 * c1o72 * pStar * (phi[REST] - phi[TNE]) * rhoToPhi / rho;
-//					//mfacc += c1o2 * c1o72 * pStar * (phi[REST] - phi[TNW]) * rhoToPhi / rho;
-//					//mfcac += c1o2 * c1o72 * pStar * (phi[REST] - phi[TSE]) * rhoToPhi / rho;
-//					//mfaac += c1o2 * c1o72 * pStar * (phi[REST] - phi[TSW]) * rhoToPhi / rho;
-//					
-//					///////////////
-//					//mfabb += (pBefore-pStar) * c2o9  ;
-//					//mfbab += (pBefore-pStar) * c2o9  ;
-//					//mfbba += (pBefore-pStar) * c2o9  ;
-//					//mfaab += (pBefore-pStar) * c1o18 ;
-//					//mfcab += (pBefore-pStar) * c1o18 ;
-//					//mfaba += (pBefore-pStar) * c1o18 ;
-//					//mfcba += (pBefore-pStar) * c1o18 ;
-//					//mfbaa += (pBefore-pStar) * c1o18 ;
-//					//mfbca += (pBefore-pStar) * c1o18 ;
-//					//mfaaa += (pBefore-pStar) * c1o72 ;
-//					//mfcaa += (pBefore-pStar) * c1o72 ;
-//					//mfaca += (pBefore-pStar) * c1o72 ;
-//					//mfcca += (pBefore-pStar) * c1o72 ;
-//					//mfcbb += (pBefore-pStar) * c2o9  ;
-//					//mfbcb += (pBefore-pStar) * c2o9  ;
-//					//mfbbc += (pBefore-pStar) * c2o9  ;
-//					//mfccb += (pBefore-pStar) * c1o18 ;
-//					//mfacb += (pBefore-pStar) * c1o18 ;
-//					//mfcbc += (pBefore-pStar) * c1o18 ;
-//					//mfabc += (pBefore-pStar) * c1o18 ;
-//					//mfbcc += (pBefore-pStar) * c1o18 ;
-//					//mfbac += (pBefore-pStar) * c1o18 ;
-//					//mfccc += (pBefore-pStar) * c1o72 ;
-//					//mfacc += (pBefore-pStar) * c1o72 ;
-//					//mfcac += (pBefore-pStar) * c1o72 ;
-//					//mfaac += (pBefore-pStar) * c1o72 ;
-//					//mfbbb += (pBefore-pStar) * 8.0 / 9.0;
-//
-//					//mfabb = (pBefore ) * c2o9;
-//					//mfbab = (pBefore ) * c2o9;
-//					//mfbba = (pBefore ) * c2o9;
-//					//mfaab = (pBefore ) * c1o16;
-//					//mfcab = (pBefore ) * c1o16;
-//					//mfaba = (pBefore ) * c1o16;
-//					//mfcba = (pBefore ) * c1o16;
-//					//mfbaa = (pBefore ) * c1o16;
-//					//mfbca = (pBefore ) * c1o16;
-//					//mfaaa = (pBefore ) * c1o72;
-//					//mfcaa = (pBefore ) * c1o72;
-//					//mfaca = (pBefore ) * c1o72;
-//					//mfcca = (pBefore ) * c1o72;
-//					//mfcbb = (pBefore ) * c2o9;
-//					//mfbcb = (pBefore ) * c2o9;
-//					//mfbbc = (pBefore ) * c2o9;
-//					//mfccb = (pBefore ) * c1o16;
-//					//mfacb = (pBefore ) * c1o16;
-//					//mfcbc = (pBefore ) * c1o16;
-//					//mfabc = (pBefore ) * c1o16;
-//					//mfbcc = (pBefore ) * c1o16;
-//					//mfbac = (pBefore ) * c1o16;
-//					//mfccc = (pBefore ) * c1o72;
-//					//mfacc = (pBefore ) * c1o72;
-//					//mfcac = (pBefore ) * c1o72;
-//					//mfaac = (pBefore ) * c1o72;
-//					//mfbbb = (pBefore ) * 8.0 / 9.0;
-//					///////////////////
-//
-//					//////////////////////////////////////////////////////////////////////////
-//					//proof correctness
-//					//////////////////////////////////////////////////////////////////////////
-//					//#ifdef  PROOF_CORRECTNESS
-//					LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
-//						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
-//						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
-//					//			   //LBMReal dif = fabs(drho - rho_post);
-//					//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
-//					//#ifdef SINGLEPRECISION
-//					//			   if (dif > 10.0E-7 || dif < -10.0E-7)
-//					//#else
-//					//			   if (dif > 10.0E-15 || dif < -10.0E-15)
-//					//#endif
-//					//			   {
-//					//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
-//					//					   + " dif=" + UbSystem::toString(dif)
-//					//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
-//					//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
-//					//				   //exit(EXIT_FAILURE);
-//					//			   }
-//					//#endif
-//
-//					if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post))
-//						UB_THROW(UbException(
-//							UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," +
-//							UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
-//
-//					//////////////////////////////////////////////////////////////////////////
-//					//write distribution
-//					//////////////////////////////////////////////////////////////////////////
-//					(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)         = mfabb         ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)         = mfbab         ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)         = mfbba         ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)        = mfaab        ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)       = mfcab       ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)        = mfaba        ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)       = mfcba       ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)        = mfbaa        ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)       = mfbca       ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)       = mfaaa       ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)      = mfcaa      ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)      = mfaca      ;//* rho * c1o3;
-//					(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3)     = mfcca     ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     = mfcbb     ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     = mfbcb     ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     = mfbbc     ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfccb   ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    = mfacb    ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfcbc   ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    = mfabc    ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfbcc   ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    = mfbac    ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfacc  ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfcac  ;//* rho * c1o3;
-//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfaac   ;//* rho * c1o3;
-//
-//					(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
-//
-//			
-//					(*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3)         = mfhabb;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3)         = mfhbab;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3)         = mfhbba;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3)        = mfhaab;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3)       = mfhcab;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3)        = mfhaba;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3)       = mfhcba;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3)        = mfhbaa;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3)       = mfhbca;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3)       = mfhaaa;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3)      = mfhcaa;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3)      = mfhaca;//* rho * c1o3;
-//					(*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3)     = mfhcca;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3)     = mfhcbb;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3)     = mfhbcb;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p)     = mfhbbc;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfhccb;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3)    = mfhacb;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfhcbc;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p)    = mfhabc;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfhbcc;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p)    = mfhbac;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfhccc;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfhacc;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfhcac;//* rho * c1o3;
-//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfhaac;//* rho * c1o3;
-//
-//					(*this->zeroDistributionsH2)(x1, x2, x3) = mfhbbb;// *rho* c1o3;
-//
-//																	// !Old Kernel
-///////////////////////  P H A S E - F I E L D   S O L V E R
-//////////////////////////////////////////////
-///////CUMULANT PHASE-FIELD
-//					LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
-//					{
-//						mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
-//						mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
-//						mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
-//						mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
-//						mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
-//						mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
-//						mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
-//						mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
-//						mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
-//						mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
-//						mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
-//						mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
-//						mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
-//						mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
-//						mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
-//						mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
-//						mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
-//						mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
-//						mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
-//						mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
-//						mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
-//						mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
-//						mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-//						mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
-//						mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
-//						mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
-//						mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
-//
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
-//						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
-//						//!
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// second component
-//						LBMReal concentration =
-//							((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
-//								(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
-//								((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
-//						////////////////////////////////////////////////////////////////////////////////////
-//						LBMReal oneMinusRho = c1- concentration;
-//
-//						LBMReal cx =
-//							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
-//								(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
-//								(mfcbb - mfabb));
-//						LBMReal cy =
-//							((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
-//								(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
-//								(mfbcb - mfbab));
-//						LBMReal cz =
-//							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
-//								(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
-//								(mfbbc - mfbba));
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// calculate the square of velocities for this lattice node
-//						LBMReal cx2 = cx * cx;
-//						LBMReal cy2 = cy * cy;
-//						LBMReal cz2 = cz * cz;
-//						////////////////////////////////////////////////////////////////////////////////////
-//						//! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
-//						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
-//						//! see also Eq. (6)-(14) in \ref
-//						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
-//						//!
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// Z - Dir
-//						forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// Y - Dir
-//						forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
-//						forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
-//						forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
-//						forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
-//						forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
-//						forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
-//						forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
-//						forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// X - Dir
-//						forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
-//						forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
-//						forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
-//						forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
-//						forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
-//						forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
-//						forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
-//						forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
-//						forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						//! - experimental Cumulant ... to be published ... hopefully
-//						//!
-//
-//						// linearized orthogonalization of 3rd order central moments
-//						LBMReal Mabc = mfabc - mfaba * c1o3;
-//						LBMReal Mbca = mfbca - mfbaa * c1o3;
-//						LBMReal Macb = mfacb - mfaab * c1o3;
-//						LBMReal Mcba = mfcba - mfaba * c1o3;
-//						LBMReal Mcab = mfcab - mfaab * c1o3;
-//						LBMReal Mbac = mfbac - mfbaa * c1o3;
-//						// linearized orthogonalization of 5th order central moments
-//						LBMReal Mcbc = mfcbc - mfaba * c1o9;
-//						LBMReal Mbcc = mfbcc - mfbaa * c1o9;
-//						LBMReal Mccb = mfccb - mfaab * c1o9;
-//
-//						//31.05.2022 addaptive mobility
-//						//omegaD = c1 + (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) / (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration)) + fabs((1.0 - concentration) * (concentration)) * c1o6 * oneOverInterfaceScale+1.0e-200);
-//						//omegaD = c2 * (concentration * (concentration - c1)) / (-c6 * (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) + (concentration * (concentration - c1))+1.0e-200);
-//						// collision of 1st order moments
-//						cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
-//							normX1 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
-//						cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
-//							normX2 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
-//						cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
-//							normX3 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
-//
-//						cx2 = cx * cx;
-//						cy2 = cy * cy;
-//						cz2 = cz * cz;
-//
-//						// equilibration of 2nd order moments
-//						mfbba = zeroReal;
-//						mfbab = zeroReal;
-//						mfabb = zeroReal;
-//
-//						mfcaa = c1o3 * concentration;
-//						mfaca = c1o3 * concentration;
-//						mfaac = c1o3 * concentration;
-//
-//						// equilibration of 3rd order moments
-//						Mabc = zeroReal;
-//						Mbca = zeroReal;
-//						Macb = zeroReal;
-//						Mcba = zeroReal;
-//						Mcab = zeroReal;
-//						Mbac = zeroReal;
-//						mfbbb = zeroReal;
-//
-//						// from linearized orthogonalization 3rd order central moments to central moments
-//						mfabc = Mabc + mfaba * c1o3;
-//						mfbca = Mbca + mfbaa * c1o3;
-//						mfacb = Macb + mfaab * c1o3;
-//						mfcba = Mcba + mfaba * c1o3;
-//						mfcab = Mcab + mfaab * c1o3;
-//						mfbac = Mbac + mfbaa * c1o3;
-//
-//						// equilibration of 4th order moments
-//						mfacc = c1o9 * concentration;
-//						mfcac = c1o9 * concentration;
-//						mfcca = c1o9 * concentration;
-//
-//						mfcbb = zeroReal;
-//						mfbcb = zeroReal;
-//						mfbbc = zeroReal;
-//
-//						// equilibration of 5th order moments
-//						Mcbc = zeroReal;
-//						Mbcc = zeroReal;
-//						Mccb = zeroReal;
-//
-//						// from linearized orthogonalization 5th order central moments to central moments
-//						mfcbc = Mcbc + mfaba * c1o9;
-//						mfbcc = Mbcc + mfbaa * c1o9;
-//						mfccb = Mccb + mfaab * c1o9;
-//
-//						// equilibration of 6th order moment
-//						mfccc = c1o27 * concentration;
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						//! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
-//						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
-//						//! see also Eq. (88)-(96) in
-//						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
-//						//!
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// X - Dir
-//						backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
-//						backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
-//						backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
-//						backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
-//						backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
-//						backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
-//						backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
-//						backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
-//						backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// Y - Dir
-//						backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
-//						backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
-//						backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
-//						backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
-//						backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
-//						backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
-//						backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
-//
-//						////////////////////////////////////////////////////////////////////////////////////
-//						// Z - Dir
-//						backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
-//						backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
-//
-//
-//
-//						(*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
-//						(*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
-//						(*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
-//						(*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
-//						(*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
-//						(*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
-//
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
-//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
-//
-//						(*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
-//
-//
-//
-//
-//					}
-//				}
-//			}
-//		}
-//	}
-//}
-////////////////////////////////////////////////////////////////////////////
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi()
-//{
-//	using namespace D3Q27System;
-//	return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW])))
-//		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) +
-//		+WEIGTH[N] * (phi[E] - phi[W]));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi()
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW])))
-//		+ WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) +
-//		+WEIGTH[N] * (phi[N] - phi[S]));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi()
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW])))
-//		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) +
-//		+WEIGTH[N] * (phi[T] - phi[B]));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_rhoInv(LBMReal rhoL,LBMReal rhoDIV)
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((1.0/(rhoL+rhoDIV*phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) + (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])) + (1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW]))))
-//		+ WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TE]) - 1.0 / (rhoL + rhoDIV * phi[BW])) + (1.0 / (rhoL + rhoDIV * phi[BE]) - 1.0 / (rhoL + rhoDIV * phi[TW]))) + ((1.0 / (rhoL + rhoDIV * phi[SE]) - 1.0 / (rhoL + rhoDIV * phi[NW])) + (1.0 / (rhoL + rhoDIV * phi[NE]) - 1.0 / (rhoL + rhoDIV * phi[SW]))))) +
-//		+WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[E]) - 1.0 / (rhoL + rhoDIV * phi[W])));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_rhoInv(LBMReal rhoL,LBMReal rhoDIV)
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((1.0 / (rhoL + rhoDIV * phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) - (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW])) - (1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW]))))
-//		+ WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TN]) - 1.0 / (rhoL + rhoDIV * phi[BS])) + (1.0 / (rhoL + rhoDIV * phi[BN]) - 1.0 / (rhoL + rhoDIV * phi[TS]))) + ((1.0 / (rhoL + rhoDIV * phi[NE]) - 1.0 / (rhoL + rhoDIV * phi[SW])) - (1.0 / (rhoL + rhoDIV * phi[SE]) - 1.0 / (rhoL + rhoDIV * phi[NW]))))) +
-//		+WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[N]) - 1.0 / (rhoL + rhoDIV * phi[S])));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV)
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((1.0 / (rhoL + rhoDIV * phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) - (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])) - (1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW]))))
-//		+ WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TE]) - 1.0 / (rhoL + rhoDIV * phi[BW])) - (1.0 / (rhoL + rhoDIV * phi[BE]) - 1.0 / (rhoL + rhoDIV * phi[TW]))) + ((1.0 / (rhoL + rhoDIV * phi[TS]) - 1.0 / (rhoL + rhoDIV * phi[BN])) + (1.0 / (rhoL + rhoDIV * phi[TN]) - 1.0 / (rhoL + rhoDIV * phi[BS]))))) +
-//		+WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[T]) - 1.0 / (rhoL + rhoDIV * phi[B])));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi2()
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) + (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) + (phi2[BNE] - phi2[TSW])))
-//		+ WEIGTH[NE] * (((phi2[TE] - phi2[BW]) + (phi2[BE] - phi2[TW])) + ((phi2[SE] - phi2[NW]) + (phi2[NE] - phi2[SW])))) +
-//		+WEIGTH[N] * (phi2[E] - phi2[W]));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi2()
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[BNE] - phi2[TSW]) - (phi2[TSE] - phi2[BNW])))
-//		+ WEIGTH[NE] * (((phi2[TN] - phi2[BS]) + (phi2[BN] - phi2[TS])) + ((phi2[NE] - phi2[SW]) - (phi2[SE] - phi2[NW])))) +
-//		+WEIGTH[N] * (phi2[N] - phi2[S]));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi2()
-//{
-//	using namespace D3Q27System;
-//	return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
-//		+ WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
-//		+WEIGTH[N] * (phi2[T] - phi2[B]));
-//}
-//
-//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::nabla2_phi()
-//{
-//	using namespace D3Q27System;
-//	LBMReal sum = 0.0;
-//	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
-//		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
-//	sum += WEIGTH[DIR_0PP] * (
-//			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
-//		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
-//		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
-//		);
-//	sum += WEIGTH[DIR_00P] * (
-//			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
-//		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
-//		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
-//		);
-//
-//
-//	return 6.0 * sum;
-//}
-//
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::computePhasefield()
-//{
-//	using namespace D3Q27System;
-//	SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
-//
-//	int minX1 = ghostLayerWidth;
-//	int minX2 = ghostLayerWidth;
-//	int minX3 = ghostLayerWidth;
-//	int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
-//	int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
-//	int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
-//
-//	//------------- Computing the phase-field ------------------
-//	for (int x3 = minX3; x3 < maxX3; x3++) {
-//		for (int x2 = minX2; x2 < maxX2; x2++) {
-//			for (int x1 = minX1; x1 < maxX1; x1++) {
-//				// if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
-//				{
-//					int x1p = x1 + 1;
-//					int x2p = x2 + 1;
-//					int x3p = x3 + 1;
-//
-//					h[E]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
-//					h[N]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
-//					h[T]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
-//					h[NE]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
-//					h[NW]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
-//					h[TE]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
-//					h[TW]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
-//					h[TN]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
-//					h[TS]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
-//					h[TNE] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
-//					h[TNW] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
-//					h[TSE] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
-//					h[TSW] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
-//
-//					h[W]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
-//					h[S]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
-//					h[B]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
-//					h[SW]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
-//					h[SE]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
-//					h[BW]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
-//					h[BE]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
-//					h[BS]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
-//					h[BN]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
-//					h[BSW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-//					h[BSE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
-//					h[BNW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
-//					h[BNE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
-//
-//					h[REST] = (*this->zeroDistributionsH1)(x1, x2, x3);
-//				}
-//			}
-//		}
-//	}
-//}
-//
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
-//	int x3)
-//{
-//	using namespace D3Q27System;
-//
-//	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
-//
-//	phi[REST] = (*ph)(x1, x2, x3);
-//
-//
-//	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
-//
-//		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
-//			phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
-//		} else {
-//			//phi[k] = (*ph)(x1 , x2, x3 );// neutral wetting
-//			phi[k] = 0.0;//unwetting
-//		}
-//	}
-//}
-//
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
-//	int x3)
-//{
-//	using namespace D3Q27System;
-//
-//	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
-//
-//	phi2[REST] = (*ph)(x1, x2, x3);
-//
-//
-//	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
-//
-//		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
-//			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
-//		}
-//		else {
-//			phi2[k] = 0.05;
-//		}
-//	}
-//}
-//
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::swapDistributions()
-//{
-//	LBMKernel::swapDistributions();
-//	dataSet->getHdistributions()->swap();
-//	dataSet->getH2distributions()->swap();
-//}
-//
-//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initForcing()
-//{
-//	muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
-//	muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
-//	muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
-//
-//	muDeltaT = deltaT;
-//
-//	muForcingX1.DefineVar("dt", &muDeltaT);
-//	muForcingX2.DefineVar("dt", &muDeltaT);
-//	muForcingX3.DefineVar("dt", &muDeltaT);
-//
-//	muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
-//
-//	muForcingX1.DefineVar("nu", &muNu);
-//	muForcingX2.DefineVar("nu", &muNu);
-//	muForcingX3.DefineVar("nu", &muNu);
-//
-//	muForcingX1.DefineVar("rho",&muRho); 
-//	muForcingX2.DefineVar("rho",&muRho); 
-//	muForcingX3.DefineVar("rho",&muRho); 
-//
-//}
diff --git a/src/cpu/VirtualFluidsCore/LBM/VoidLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/VoidLBMKernel.cpp
index 83d6a791e761190e3cdd34d101c4fd1d1588a191..4e56f9fbd48ac43a7361bcd91a2e0f18a9ed2ebf 100644
--- a/src/cpu/VirtualFluidsCore/LBM/VoidLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/VoidLBMKernel.cpp
@@ -1,7 +1,8 @@
 #include "VoidLBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "DataSet3D.h"
 #include "VoidData3D.h"
+#include "D3Q27System.h"
 
 VoidLBMKernel::VoidLBMKernel() = default;
 //////////////////////////////////////////////////////////////////////////
@@ -19,7 +20,7 @@ SPtr<LBMKernel> VoidLBMKernel::clone()
     kernel->setNX(nx);
     dynamicPointerCast<VoidLBMKernel>(kernel)->initDataSet();
     kernel->setCollisionFactor(this->collFactor);
-    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setBCSet(bcSet->clone(kernel));
     kernel->setWithForcing(withForcing);
     kernel->setForcingX1(muForcingX1);
     kernel->setForcingX2(muForcingX2);
@@ -31,4 +32,4 @@ SPtr<LBMKernel> VoidLBMKernel::clone()
 //////////////////////////////////////////////////////////////////////////
 void VoidLBMKernel::calculate(int step) {}
 //////////////////////////////////////////////////////////////////////////
-real VoidLBMKernel::getCalculationTime() { return 0.0; }
+real VoidLBMKernel::getCalculationTime() { return vf::lbm::constant::c0o1; }
diff --git a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
index bbc4face9f784d120c80dcfbbbd73d07951fe49b..e84d4b7cd7e205c5403e57b4f9a737e8007e2ee2 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
+++ b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
@@ -56,7 +56,7 @@ struct dataSetParam {
 };
 
 //! \struct DataSetRestart
-//! \brief Structure describes parameters of the dataSet in MPIIORestartCoProcessor format
+//! \brief Structure describes parameters of the dataSet in MPIIORestartSimulationObserver format
 //! \details The structure is used when reading from the file
 struct DataSetRestart {
     real collFactor;
@@ -74,7 +74,7 @@ struct DataSetRestart {
 };
 
 //! \struct DataSetMigration
-//! \brief Structure describes parameters of the dataSet in MPIIOMigrationCoProcessor format
+//! \brief Structure describes parameters of the dataSet in MPIIOMigrationSimulationObserver format
 //! \details The structure is used to find the needed block in the grid when restoring a dataSet
 struct DataSetMigration {
     real collFactor;
@@ -89,7 +89,7 @@ struct DataSetMigration {
 };
 
 //! \struct DataSetSmallRead
-//! \brief Structure describes parameters of the DataSetSmall in MPIIORestartCoProcessor format
+//! \brief Structure describes parameters of the DataSetSmall in MPIIORestartSimulationObserver format
 //! \details The structure is used when reading from the file
 struct DataSetSmallRestart {
     int x1;
@@ -98,7 +98,7 @@ struct DataSetSmallRestart {
     int level;
 };
 //! \struct dataSetSmall
-//! \brief Structure containes information identifying the block in MPIIOMigrationCoProcessor format
+//! \brief Structure containes information identifying the block in MPIIOMigrationSimulationObserver format
 //! \details The structure is used to find the needed block in the grid when restoring a dataSet arrays
 struct DataSetSmallMigration {
     int globalID;
@@ -138,7 +138,7 @@ struct boundCondParam {
 };
 
 //! \struct BCAddRead
-//! \brief Structure describes parameters of the BCAdd in MPIIORestartCoProcessor format
+//! \brief Structure describes parameters of the BCAdd in MPIIORestartSimulationObserver format
 //! \details The structure is used when reading from the file
 struct BCAddRestart {
     int x1; //	to find the right block
@@ -151,7 +151,7 @@ struct BCAddRestart {
 
 //! \struct BCAdd
 //! \brief Structure containes information identifying the block and some parameters of the arrays
-//! \of boundary conditions that are equal in all blocks in MPIIOMigrationCoProcessor format
+//! \of boundary conditions that are equal in all blocks in MPIIOMigrationSimulationObserver format
 //! \details The structure is used to find the needed block in the grid when restoring a dataSet
 //! and to set common parameters
 struct BCAddMigration {
diff --git a/src/cpu/VirtualFluidsCore/Parallel/ZoltanPartitioner.cpp b/src/cpu/VirtualFluidsCore/Parallel/ZoltanPartitioner.cpp
index 220fe67c5d0c34ecb40e4066c68d84649ca0dfc1..820af332b19754ee2a4325f0328bdb01de3d784b 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/ZoltanPartitioner.cpp
+++ b/src/cpu/VirtualFluidsCore/Parallel/ZoltanPartitioner.cpp
@@ -76,7 +76,7 @@ void ZoltanPartitioner::partition()
                                  &exportToPart);    /* Partition to which each vertex will belong */
 
     if (rc != ZOLTAN_OK) {
-        cout << "Partitioning failed on process " << rank << "\n" << endl;
+        cout << "Partitioning failed on update " << rank << "\n" << endl;
         MPI_Finalize();
         Zoltan_Destroy(&zz);
         exit(0);
diff --git a/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp b/src/cpu/VirtualFluidsCore/Simulation/Block3D.cpp
similarity index 100%
rename from src/cpu/VirtualFluidsCore/Grid/Block3D.cpp
rename to src/cpu/VirtualFluidsCore/Simulation/Block3D.cpp
diff --git a/src/cpu/VirtualFluidsCore/Grid/Block3D.h b/src/cpu/VirtualFluidsCore/Simulation/Block3D.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/Grid/Block3D.h
rename to src/cpu/VirtualFluidsCore/Simulation/Block3D.h
index 686d8df0f9a4dda1b8d744b11b18a7bddf7e3f77..e909ae0723c6bc1c2bda778831a18e33851ec249 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Block3D.h
+++ b/src/cpu/VirtualFluidsCore/Simulation/Block3D.h
@@ -27,7 +27,7 @@
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Block3D.h
-//! \ingroup Grid
+//! \ingroup Simulation
 //! \author Konstantin Kutscher
 //=======================================================================================
 
diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.cpp
similarity index 100%
rename from src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp
rename to src/cpu/VirtualFluidsCore/Simulation/Grid3D.cpp
diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.h
similarity index 99%
rename from src/cpu/VirtualFluidsCore/Grid/Grid3D.h
rename to src/cpu/VirtualFluidsCore/Simulation/Grid3D.h
index 41a99d6cc7be5177cc0f3ff2e89591b28317fede..821adff473961fafa00be08ca2cf8e2339353b51 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h
+++ b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.h
@@ -27,7 +27,7 @@
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Grid.h
-//! \ingroup Grid
+//! \ingroup Simulation
 //! \author Konstantin Kutscher, Soeren Freudiger, Sebastian Geller
 //=======================================================================================
 
diff --git a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp b/src/cpu/VirtualFluidsCore/Simulation/Simulation.cpp
similarity index 54%
rename from src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp
rename to src/cpu/VirtualFluidsCore/Simulation/Simulation.cpp
index 92559f5f37d0b39a086b6bab0e63157b79c9f718..e3b0169847d43efd62bdf7dabf80fdc009027d46 100644
--- a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp
+++ b/src/cpu/VirtualFluidsCore/Simulation/Simulation.cpp
@@ -26,16 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file BasicCalculator.cpp
+//! \file Simulation.cpp
 //! \ingroup Grid
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "BasicCalculator.h"
+#include "Simulation.h"
 
-#include "BCProcessor.h"
 #include "Block3D.h"
 #include "Block3DConnector.h"
+#include "SimulationObserver.h"
+#include "Grid3D.h"
+#include "BCSet.h"
+#include "Block3DConnector.h"
 #include "LBMKernel.h"
 #include "UbLogger.h"
 #include "UbScheduler.h"
@@ -45,22 +48,207 @@
 #endif
 #define OMP_SCHEDULE guided
 
-//#define TIMING
-//#include "UbTiming.h"
+// #define TIMING
+// #include "UbTiming.h"
+
+#include <basics/utilities/UbException.h>
+
+
+Simulation::Simulation(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps)
+    : grid(grid), additionalGhostLayerUpdateScheduler(additionalGhostLayerUpdateScheduler),
+      numberOfTimeSteps(numberOfTimeSteps)
+{
+    this->grid    = grid;
+    startTimeStep = int(grid->getTimeStep()) + 1;
+    minLevel      = grid->getCoarsestInitializedLevel();
+    maxLevel      = grid->getFinestInitializedLevel();
+    if (maxLevel > 0)
+        refinement = true;
+    else
+        refinement = false;
+    blocks.resize(maxLevel + 1);
+    localConns.resize(maxLevel + 1);
+    remoteConns.resize(maxLevel + 1);
+    localInterConns.resize(maxLevel);
+    remoteInterConns.resize(maxLevel);
+
+    int gridRank = grid->getRank();
+
+    for (int level = minLevel; level <= maxLevel; level++) {
+        std::vector<SPtr<Block3D>> blockVector;
+        grid->getBlocks(level, gridRank, true, blockVector);
+        for (const auto &block : blockVector)
+            if (block)
+                blocks[block->getLevel()].push_back(block);
+    }
+
+    initLocalConnectors();
+    initRemoteConnectors();
+}
+//////////////////////////////////////////////////////////////////////////
+Simulation::~Simulation() = default;
+//////////////////////////////////////////////////////////////////////////
+void Simulation::addSimulationObserver(SPtr<SimulationObserver> coProcessor) { simulationObserver.push_back(coProcessor); }
+//////////////////////////////////////////////////////////////////////////
+void Simulation::notifyObservers(real step)
+{
+    for (SPtr<SimulationObserver> cp : simulationObserver) {
+        cp->update(step);
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+void Simulation::initLocalConnectors()
+{
+    UBLOG(logDEBUG1, "Simulation::initLocalConnectors() - start");
+
+    for (int l = minLevel; l <= maxLevel; l++) {
+        for (SPtr<Block3D> block : blocks[l]) {
+            block->pushBackLocalSameLevelConnectors(localConns[l]);
+
+            if (l != maxLevel)
+                block->pushBackLocalInterpolationConnectorsCF(localInterConns[l]);
+        }
+        if (l != maxLevel) {
+            for (SPtr<Block3D> block : blocks[l + 1]) {
+                block->pushBackLocalInterpolationConnectorsFC(localInterConns[l]);
+            }
+        }
+        UBLOG(logDEBUG5, "Simulation::initConnectors()-initConnectors(localConns[" << l << "])");
+        initConnectors(localConns[l]);
+
+        if (l != maxLevel) {
+            UBLOG(logDEBUG5, "Simulation::initConnectors()-initConnectors(localInterConns[" << l << "])");
+            initConnectors(localInterConns[l]);
+        }
+    }
+
+    UBLOG(logDEBUG1, "Simulation::initLocalConnectors() - end");
+}
+//////////////////////////////////////////////////////////////////////////
+void Simulation::initRemoteConnectors()
+{
+    std::vector<std::vector<SPtr<Block3DConnector>>> remoteInterConnsCF;
+    std::vector<std::vector<SPtr<Block3DConnector>>> remoteInterConnsFC;
+    remoteInterConnsCF.resize(maxLevel + 1);
+    remoteInterConnsFC.resize(maxLevel + 1);
+
+    for (int l = minLevel; l <= maxLevel; l++) {
+        std::vector<SPtr<Block3D>> blockVector;
+        // grid->getBlocks(level, gridRank, true, blockVector);
+        grid->getBlocks(l, blockVector);
+        for (SPtr<Block3D> block : blockVector) {
+            int block_level = block->getLevel();
+            block->pushBackRemoteSameLevelConnectors(remoteConns[block_level]);
+
+            block->pushBackRemoteInterpolationConnectorsCF(remoteInterConnsCF[block_level]);
+            block->pushBackRemoteInterpolationConnectorsFC(remoteInterConnsFC[block_level]);
+        }
+    }
+
+    for (int l = minLevel; l <= maxLevel; l++) {
+        UBLOG(logDEBUG5, "Simulation::initRemoteConnectors()-initConnectors(remoteConns[" << l << "])");
+        initConnectors(remoteConns[l]);
+        if (l != maxLevel) {
+            for (size_t i = 0; i < remoteInterConnsCF[l].size(); i++)
+                remoteInterConns[l].push_back(remoteInterConnsCF[l][i]);
+            for (size_t i = 0; i < remoteInterConnsFC[l + 1].size(); i++)
+                remoteInterConns[l].push_back(remoteInterConnsFC[l + 1][i]);
+        }
+    }
+    //////////////////////////////////////////////////////////////////////////
+    // UBLOG(logDEBUG5, "Simulation::initConnectors() - connectoren initialisieren - start");
+    for (int l = minLevel; l <= maxLevel; l++) {
+        if (l != maxLevel) {
+            UBLOG(logDEBUG5, "Simulation::initRemoteConnectors()-initConnectors(remoteInterConns[" << l << "])");
+            for (SPtr<Block3DConnector> c : remoteInterConns[l])
+                c->init();
+        }
+    }
+    // UBLOG(logDEBUG5, "Simulation::initConnectors() - connectoren initialisieren - end");
+    //////////////////////////////////////////////////////////////////////////
+    // sendTransmitterDataSize
+    // UBLOG(logDEBUG5, "Simulation::initConnectors() - sendTransmitterDataSize - start");
+    for (int l = minLevel; l <= maxLevel; l++) {
+        if (l != maxLevel) {
+            UBLOG(logDEBUG5,
+                  "Simulation::initRemoteConnectors()-sendTransmitterDataSize(remoteInterConns[" << l << "])");
+            for (SPtr<Block3DConnector> c : remoteInterConns[l])
+                c->sendTransmitterDataSize();
+        }
+    }
+    // UBLOG(logDEBUG5, "Simulation::initConnectors() - sendTransmitterDataSize - end");
+    //////////////////////////////////////////////////////////////////////////
+    // receiveTransmitterDataSize
+    // if it stops here during distributed calculations, then there is probably an inactive block on one side!!!
+    // UBLOG(logDEBUG5, "Simulation::initConnectors() - receiveTransmitterDataSize - start");
+    for (int l = minLevel; l <= maxLevel; l++) {
+        if (l != maxLevel) {
+            UBLOG(logDEBUG5,
+                  "Simulation::initRemoteConnectors()-receiveTransmitterDataSize(remoteInterConns[" << l << "])");
+            for (SPtr<Block3DConnector> c : remoteInterConns[l])
+                c->receiveTransmitterDataSize();
+        }
+    }
+    // UBLOG(logDEBUG5, "Simulation::initConnectors() - receiveTransmitterDataSize - end");
+    //////////////////////////////////////////////////////////////////////////
+}
+//////////////////////////////////////////////////////////////////////////
+void Simulation::initConnectors(std::vector<SPtr<Block3DConnector>> &connectors)
+{
+    UBLOG(logDEBUG1, "Simulation::initConnectors() - start");
+
+    // initialization
+    //////////////////////////////////////////////////////////////////////////
+    // initialize connectors
+    UBLOG(logDEBUG5, "Simulation::initConnectors() - connectoren initialisieren - start");
+    for (SPtr<Block3DConnector> c : connectors)
+        c->init();
+    UBLOG(logDEBUG5, "Simulation::initConnectors() - connectoren initialisieren - end");
+    //////////////////////////////////////////////////////////////////////////
+    // sendTransmitterDataSize
+    UBLOG(logDEBUG5, "Simulation::initConnectors() - sendTransmitterDataSize - start");
+    for (SPtr<Block3DConnector> c : connectors)
+        c->sendTransmitterDataSize();
+    UBLOG(logDEBUG5, "Simulation::initConnectors() - sendTransmitterDataSize - end");
+    //////////////////////////////////////////////////////////////////////////
+    // receiveTransmitterDataSize
+    // if it stops here during distributed calculations, then there is probably an inactive block on one side!!!
+    UBLOG(logDEBUG5, "Simulation::initConnectors() - receiveTransmitterDataSize - start");
+    for (SPtr<Block3DConnector> c : connectors)
+        c->receiveTransmitterDataSize();
+    UBLOG(logDEBUG5, "Simulation::initConnectors() - receiveTransmitterDataSize - end");
 
-BasicCalculator::BasicCalculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler,
-                                 int numberOfTimeSteps)
-    : Calculator(grid, additionalGhostLayerUpdateScheduler, numberOfTimeSteps)
+    UBLOG(logDEBUG1, "Simulation::initConnectors() - end");
+}
+//////////////////////////////////////////////////////////////////////////
+void Simulation::deleteBlocks()
 {
+    for (std::vector<SPtr<Block3D>> &bs : blocks)
+        bs.resize(0);
+}
+//////////////////////////////////////////////////////////////////////////
+void Simulation::deleteConnectors()
+{
+    deleteConnectors(localConns);
+    deleteConnectors(remoteConns);
+
+    deleteConnectors(localInterConns);
+    deleteConnectors(remoteInterConns);
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::calculate()
+void Simulation::deleteConnectors(std::vector<std::vector<SPtr<Block3DConnector>>> &conns)
 {
-    UBLOG(logDEBUG1, "OMPCalculator::calculate() - started");
+    for (std::vector<SPtr<Block3DConnector>> &c : conns)
+        c.resize(0);
+}
+//////////////////////////////////////////////////////////////////////////
+void Simulation::run()
+{
+    UBLOG(logDEBUG1, "OMPSimulation::calculate() - started");
     int calcStep = 0;
     try {
-        int minInitLevel       = minLevel;
-        int maxInitLevel       = maxLevel - minLevel;
+        int minInitLevel = minLevel;
+        int maxInitLevel = maxLevel - minLevel;
         int straightStartLevel = minInitLevel;
         int internalIterations = 1 << (maxInitLevel - minInitLevel);
         int threshold;
@@ -75,16 +263,15 @@ void BasicCalculator::calculate()
 #ifdef TIMING
             UBLOG(logINFO, "calcStep = " << calcStep);
 #endif
-         //////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////
 
-         for (int staggeredStep = 1; staggeredStep <= internalIterations; staggeredStep++)
-         {
-            if (staggeredStep == internalIterations) straightStartLevel = minInitLevel;
-            else
-            {
-               for (straightStartLevel = maxInitLevel, threshold = 1;
-                  (staggeredStep & threshold) != threshold; straightStartLevel--, threshold <<= 1);
-            }
+            for (int staggeredStep = 1; staggeredStep <= internalIterations; staggeredStep++) {
+                if (staggeredStep == internalIterations)
+                    straightStartLevel = minInitLevel;
+                else {
+                    for (straightStartLevel = maxInitLevel, threshold = 1; (staggeredStep & threshold) != threshold; straightStartLevel--, threshold <<= 1)
+                        ;
+                }
 #ifdef TIMING
                 timer.resetAndStart();
 #endif
@@ -124,8 +311,7 @@ void BasicCalculator::calculate()
 #endif
                 //////////////////////////////////////////////////////////////////////////
                 if (refinement) {
-                    if (straightStartLevel < maxInitLevel)
-                        exchangeBlockData(straightStartLevel, maxInitLevel);
+                    if (straightStartLevel < maxInitLevel) exchangeBlockData(straightStartLevel, maxInitLevel);
                         //////////////////////////////////////////////////////////////////////////
 #ifdef TIMING
                     time[4] = timer.stop();
@@ -147,10 +333,10 @@ void BasicCalculator::calculate()
             if (additionalGhostLayerUpdateScheduler->isDue(calcStep)) {
                 exchangeBlockData(straightStartLevel, maxInitLevel);
             }
-            coProcess((real)(calcStep));
+            notifyObservers((real)(calcStep));
             // now ghost nodes have actual values
         }
-        UBLOG(logDEBUG1, "OMPCalculator::calculate() - stoped");
+        UBLOG(logDEBUG1, "OMPSimulation::calculate() - stoped");
     } catch (std::exception &e) {
         UBLOG(logERROR, e.what());
         UBLOG(logERROR, " step = " << calcStep);
@@ -167,7 +353,7 @@ void BasicCalculator::calculate()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::calculateBlocks(int startLevel, int maxInitLevel, int calcStep)
+void Simulation::calculateBlocks(int startLevel, int maxInitLevel, int calcStep)
 {
 #ifdef _OPENMP
 #pragma omp parallel
@@ -199,7 +385,7 @@ void BasicCalculator::calculateBlocks(int startLevel, int maxInitLevel, int calc
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::exchangeBlockData(int startLevel, int maxInitLevel)
+void Simulation::exchangeBlockData(int startLevel, int maxInitLevel)
 {
     // startLevel bis maxInitLevel
     for (int level = startLevel; level <= maxInitLevel; level++) {
@@ -213,7 +399,7 @@ void BasicCalculator::exchangeBlockData(int startLevel, int maxInitLevel)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::swapDistributions(int startLevel, int maxInitLevel)
+void Simulation::swapDistributions(int startLevel, int maxInitLevel)
 {
 #ifdef _OPENMP
 #pragma omp parallel
@@ -232,7 +418,7 @@ void BasicCalculator::swapDistributions(int startLevel, int maxInitLevel)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::connectorsPrepareLocal(std::vector<SPtr<Block3DConnector>> &connectors)
+void Simulation::connectorsPrepareLocal(std::vector<SPtr<Block3DConnector>> &connectors)
 {
     int size = (int)connectors.size();
 #ifdef _OPENMP
@@ -249,7 +435,7 @@ void BasicCalculator::connectorsPrepareLocal(std::vector<SPtr<Block3DConnector>>
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::connectorsSendLocal(std::vector<SPtr<Block3DConnector>> &connectors)
+void Simulation::connectorsSendLocal(std::vector<SPtr<Block3DConnector>> &connectors)
 {
     int size = (int)connectors.size();
 #ifdef _OPENMP
@@ -266,7 +452,7 @@ void BasicCalculator::connectorsSendLocal(std::vector<SPtr<Block3DConnector>> &c
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::connectorsReceiveLocal(std::vector<SPtr<Block3DConnector>> &connectors)
+void Simulation::connectorsReceiveLocal(std::vector<SPtr<Block3DConnector>> &connectors)
 {
     int size = (int)connectors.size();
 #ifdef _OPENMP
@@ -277,7 +463,7 @@ void BasicCalculator::connectorsReceiveLocal(std::vector<SPtr<Block3DConnector>>
         connectors[i]->distributeReceiveVectors();
     }
 }
-void BasicCalculator::connectorsPrepareRemote(std::vector<SPtr<Block3DConnector>> &connectors)
+void Simulation::connectorsPrepareRemote(std::vector<SPtr<Block3DConnector>> &connectors)
 {
     int size = (int)connectors.size();
     for (int i = 0; i < size; i++) {
@@ -286,7 +472,7 @@ void BasicCalculator::connectorsPrepareRemote(std::vector<SPtr<Block3DConnector>
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::connectorsSendRemote(std::vector<SPtr<Block3DConnector>> &connectors)
+void Simulation::connectorsSendRemote(std::vector<SPtr<Block3DConnector>> &connectors)
 {
     int size = (int)connectors.size();
     for (int i = 0; i < size; i++) {
@@ -295,7 +481,7 @@ void BasicCalculator::connectorsSendRemote(std::vector<SPtr<Block3DConnector>> &
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::connectorsReceiveRemote(std::vector<SPtr<Block3DConnector>> &connectors)
+void Simulation::connectorsReceiveRemote(std::vector<SPtr<Block3DConnector>> &connectors)
 {
     int size = (int)connectors.size();
     for (int i = 0; i < size; i++) {
@@ -304,7 +490,7 @@ void BasicCalculator::connectorsReceiveRemote(std::vector<SPtr<Block3DConnector>
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::interpolation(int startLevel, int maxInitLevel)
+void Simulation::interpolation(int startLevel, int maxInitLevel)
 {
     for (int level = startLevel; level < maxInitLevel; level++) {
         connectorsPrepareLocal(localInterConns[level]);
@@ -322,7 +508,7 @@ void BasicCalculator::interpolation(int startLevel, int maxInitLevel)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::applyPreCollisionBC(int startLevel, int maxInitLevel)
+void Simulation::applyPreCollisionBC(int startLevel, int maxInitLevel)
 {
     // from startLevel to maxInitLevel
     for (int level = startLevel; level <= maxInitLevel; level++) {
@@ -332,7 +518,7 @@ void BasicCalculator::applyPreCollisionBC(int startLevel, int maxInitLevel)
 #endif
         for (int i = 0; i < size; i++) {
             try {
-                blocks[level][i]->getKernel()->getBCProcessor()->applyPreCollisionBC();
+                blocks[level][i]->getKernel()->getBCSet()->applyPreCollisionBC();
             } catch (std::exception &e) {
                 UBLOG(logERROR, e.what());
                 exit(EXIT_FAILURE);
@@ -347,7 +533,7 @@ void BasicCalculator::applyPreCollisionBC(int startLevel, int maxInitLevel)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BasicCalculator::applyPostCollisionBC(int startLevel, int maxInitLevel)
+void Simulation::applyPostCollisionBC(int startLevel, int maxInitLevel)
 {
     //  from startLevel to maxInitLevel
     for (int level = startLevel; level <= maxInitLevel; level++) {
@@ -357,7 +543,7 @@ void BasicCalculator::applyPostCollisionBC(int startLevel, int maxInitLevel)
 #endif
         for (int i = 0; i < size; i++) {
             try {
-                blocks[level][i]->getKernel()->getBCProcessor()->applyPostCollisionBC();
+                blocks[level][i]->getKernel()->getBCSet()->applyPostCollisionBC();
             } catch (std::exception &e) {
                 UBLOG(logERROR, e.what());
                 exit(EXIT_FAILURE);
@@ -370,4 +556,4 @@ void BasicCalculator::applyPostCollisionBC(int startLevel, int maxInitLevel)
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Grid/Calculator.h b/src/cpu/VirtualFluidsCore/Simulation/Simulation.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/Grid/Calculator.h
rename to src/cpu/VirtualFluidsCore/Simulation/Simulation.h
index 759541dd5c1a85cac727c9a714407d1fa10a1cb7..ba66b385a3eb9da2e15af72eaa31c8e896780f30 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Calculator.h
+++ b/src/cpu/VirtualFluidsCore/Simulation/Simulation.h
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file Calculator.h
-//! \ingroup Grid
+//! \file Simulation.h
+//! \ingroup Simulation
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef CALCULATOR_H
-#define CALCULATOR_H
+#ifndef Simulation_H
+#define Simulation_H
 
 #include <PointerDefinitions.h>
 #include <vector>
@@ -42,21 +42,21 @@ class Grid3D;
 class UbScheduler;
 class Block3D;
 class Block3DConnector;
-class CoProcessor;
+class SimulationObserver;
 
-//! \class Calculator
-//! \brief A base class for main calculation loop
+//! \class Simulation
+//! \brief A base class for main simulation loop
 
-class Calculator
+class Simulation
 {
 public:
-    Calculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps);
-    virtual ~Calculator();
+    Simulation(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps);
+    virtual ~Simulation();
     //! control of coProcessors
-    void addCoProcessor(SPtr<CoProcessor> coProcessor);
-    void coProcess(real step);
+    void addSimulationObserver(SPtr<SimulationObserver> coProcessor);
+    void notifyObservers(real step);
 
-    virtual void calculate() = 0;
+    virtual void run();
 
 protected:
     virtual void initLocalConnectors();
@@ -66,6 +66,19 @@ protected:
     void deleteConnectors();
     void deleteConnectors(std::vector<std::vector<SPtr<Block3DConnector>>> &conns);
 
+    void calculateBlocks(int startLevel, int maxInitLevel, int calcStep);
+    void swapDistributions(int startLevel, int maxInitLevel);
+    void exchangeBlockData(int startLevel, int maxInitLevel);
+    void connectorsPrepareLocal(std::vector<SPtr<Block3DConnector>> &connectors);
+    void connectorsSendLocal(std::vector<SPtr<Block3DConnector>> &connectors);
+    void connectorsReceiveLocal(std::vector<SPtr<Block3DConnector>> &connectors);
+    void connectorsPrepareRemote(std::vector<SPtr<Block3DConnector>> &connectors);
+    void connectorsSendRemote(std::vector<SPtr<Block3DConnector>> &connectors);
+    void connectorsReceiveRemote(std::vector<SPtr<Block3DConnector>> &connectors);
+    void interpolation(int startLevel, int maxInitLevel);
+    void applyPreCollisionBC(int startLevel, int maxInitLevel);
+    void applyPostCollisionBC(int startLevel, int maxInitLevel);
+
     int minLevel, maxLevel;
     int startTimeStep;
     int numberOfTimeSteps;
@@ -86,7 +99,7 @@ protected:
     std::vector<std::vector<SPtr<Block3DConnector>>> localInterConns;
     std::vector<std::vector<SPtr<Block3DConnector>>> remoteInterConns;
 
-    std::vector<SPtr<CoProcessor>> coProcessors;
+    std::vector<SPtr<SimulationObserver>> simulationObserver;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
index f3137e5f63dff257d1311eee8d75550f186b480e..2254b9b02ea383e18c654a7569f0e5b2e973c839 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
@@ -1,8 +1,8 @@
 /*
- * D3Q27AdjustForcingCoProcessor.cpp
+ * D3Q27AdjustForcingSimulationObserver.cpp
  *  Author: Konstantin Kutscher
  */
-#include "AdjustForcingCoProcessor.h"
+#include "AdjustForcingSimulationObserver.h"
 
 #include <fstream>
 
@@ -12,11 +12,11 @@
 #include "UbScheduler.h"
 #include <SetForcingBlockVisitor.h>
 
-AdjustForcingCoProcessor::AdjustForcingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+AdjustForcingSimulationObserver::AdjustForcingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                    SPtr<IntegrateValuesHelper> integrateValues, real vTarged,
                                                    std::shared_ptr<vf::mpi::Communicator> comm)
 
-    : CoProcessor(grid, s), path(path), integrateValues(integrateValues), comm(comm), vx1Targed(vTarged)
+    : SimulationObserver(grid, s), path(path), integrateValues(integrateValues), comm(comm), vx1Targed(vTarged)
 {
     // cnodes = integrateValues->getCNodes();
     root = comm->isRoot();
@@ -71,13 +71,13 @@ AdjustForcingCoProcessor::AdjustForcingCoProcessor(SPtr<Grid3D> grid, SPtr<UbSch
 }
 
 //////////////////////////////////////////////////////////////////////////
-void AdjustForcingCoProcessor::process(real step)
+void AdjustForcingSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void AdjustForcingCoProcessor::collectData(real step)
+void AdjustForcingSimulationObserver::collectData(real step)
 {
     //////////////////////////////////////////////////////////////////////////////////////////////////
     // temporary solution
@@ -140,7 +140,7 @@ void AdjustForcingCoProcessor::collectData(real step)
     //}
 
     if (root) {
-        // UBLOG(logINFO, "D3Q27AdjustForcingCoProcessor step: " << static_cast<int>(step));
+        // UBLOG(logINFO, "D3Q27AdjustForcingSimulationObserver step: " << static_cast<int>(step));
         // UBLOG(logINFO, "new forcing is: " << forcing);
         std::string fname = path + "/forcing/forcing.csv";
         // std::string fname = path + "/forcing/forcing_"+UbSystem::toString(comm->getProcessID())+".csv";
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
similarity index 79%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
index be8dbc69f957521cff88cfbcc2b7260db05d6cdc..9e570e34dc43fa025c47c3d3c29c0dad4a262b99 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
@@ -1,10 +1,10 @@
-#ifndef D3Q27ADJUSTFORCINGCoProcessor_H
-#define D3Q27ADJUSTFORCINGCoProcessor_H
+#ifndef D3Q27ADJUSTFORCINGSimulationObserver_H
+#define D3Q27ADJUSTFORCINGSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "lbm/constants/D3Q27.h"
 
 namespace vf::mpi {class Communicator;}
@@ -18,13 +18,13 @@ class IntegrateValuesHelper;
 //!          Integrate values helper, scheduler must be set in test case.
 //! \author: Konstantin Kutscher
 
-class AdjustForcingCoProcessor : public CoProcessor
+class AdjustForcingSimulationObserver : public SimulationObserver
 {
 public:
-    AdjustForcingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    AdjustForcingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                              SPtr<IntegrateValuesHelper> integrateValues, real vTarged, std::shared_ptr<vf::mpi::Communicator> comm);
     //!< calls collect PostprocessData
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //!< object that can compute spacial average values in 3D-subdomain.
@@ -55,4 +55,4 @@ private:
     std::string path;
 };
 
-#endif /* D3Q27RHODIFFERENCECoProcessor_H_ */
+#endif /* D3Q27RHODIFFERENCESimulationObserver_H_ */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
similarity index 94%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
index 1a5276fcf44098254cee825af503a4752df60cd5..1adf3ad9944a49c8065756988e95ab837e9f6d15 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
@@ -1,6 +1,6 @@
-#include "AverageValuesCoProcessor.h"
+#include "AverageValuesSimulationObserver.h"
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 
 #include "basics/writer/WbWriterVtkXmlASCII.h"
@@ -15,12 +15,12 @@
 
 using namespace std;
 
-AverageValuesCoProcessor::AverageValuesCoProcessor() = default;
+AverageValuesSimulationObserver::AverageValuesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-AverageValuesCoProcessor::AverageValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+AverageValuesSimulationObserver::AverageValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                                    SPtr<UbScheduler> s, SPtr<UbScheduler> Avs,
                                                    SPtr<UbScheduler> rsMeans, SPtr<UbScheduler> rsRMS, bool restart)
-    : CoProcessor(grid, s), averageScheduler(Avs), resetSchedulerMeans(rsMeans), resetSchedulerRMS(rsRMS), path(path),
+    : SimulationObserver(grid, s), averageScheduler(Avs), resetSchedulerMeans(rsMeans), resetSchedulerRMS(rsRMS), path(path),
       writer(writer)
 {
     resetStepMeans  = (int)rsMeans->getMinBegin();
@@ -54,7 +54,7 @@ AverageValuesCoProcessor::AverageValuesCoProcessor(SPtr<Grid3D> grid, const std:
     // restartStep = 0.0;
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::process(real step)
+void AverageValuesSimulationObserver::update(real step)
 {
     // resetRMS(step);
     if (resetSchedulerRMS->isDue(step))
@@ -73,10 +73,10 @@ void AverageValuesCoProcessor::process(real step)
         collectData(step);
     }
 
-    UBLOG(logDEBUG3, "AverageValuesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "AverageValuesSimulationObserver::update:" << step);
 }
 
-void AverageValuesCoProcessor::resetDataRMS(real step)
+void AverageValuesSimulationObserver::resetDataRMS(real step)
 {
     resetStepRMS = (int)step;
 
@@ -84,7 +84,7 @@ void AverageValuesCoProcessor::resetDataRMS(real step)
         for (SPtr<Block3D> block : blockVector[level]) {
             if (block) {
                 SPtr<ILBMKernel> kernel                 = block->getKernel();
-                SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                 SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                 SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageValues();
 
@@ -120,7 +120,7 @@ void AverageValuesCoProcessor::resetDataRMS(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::resetDataMeans(real step)
+void AverageValuesSimulationObserver::resetDataMeans(real step)
 {
     resetStepMeans = (int)step;
 
@@ -128,7 +128,7 @@ void AverageValuesCoProcessor::resetDataMeans(real step)
         for (SPtr<Block3D> block : blockVector[level]) {
             if (block) {
                 SPtr<ILBMKernel> kernel                 = block->getKernel();
-                SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                 SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                 SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageValues();
 
@@ -161,7 +161,7 @@ void AverageValuesCoProcessor::resetDataMeans(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::collectData(real step)
+void AverageValuesSimulationObserver::collectData(real step)
 {
     int istep = int(step);
 
@@ -195,18 +195,18 @@ void AverageValuesCoProcessor::collectData(real step)
 
         vector<string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "AverageValuesCoProcessor step: " << istep);
+        UBLOG(logINFO, "AverageValuesSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::clearData()
+void AverageValuesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -214,7 +214,7 @@ void AverageValuesCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::addData(const SPtr<Block3D> block)
+void AverageValuesSimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //	UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -238,7 +238,7 @@ void AverageValuesCoProcessor::addData(const SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageValues();
     // int ghostLayerWidth = kernel->getGhostLayerWidth();
@@ -330,7 +330,7 @@ void AverageValuesCoProcessor::addData(const SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
+void AverageValuesSimulationObserver::calculateAverageValues(real timeStep)
 {
     using namespace D3Q27System;
 
@@ -348,7 +348,7 @@ void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
         for (SPtr<Block3D> block : blockVector[level]) {
             if (block) {
                 SPtr<ILBMKernel> kernel                 = block->getKernel();
-                SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                 SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                 SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageValues();
 
@@ -446,7 +446,7 @@ void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
     }
 }
 ////////////////////////////////////////////////////////////////////////////
-// void AverageValuesCoProcessor::initPlotData(double step)
+// void AverageValuesSimulationObserver::initPlotData(double step)
 //{
 //   std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
 //	if (comm->getProcessID() == comm->getRoot())
@@ -469,7 +469,7 @@ void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
 //	}
 //}
 //////////////////////////////////////////////////////////////////////////////
-// void AverageValuesCoProcessor::collectPlotData(double step)
+// void AverageValuesSimulationObserver::collectPlotData(double step)
 //{
 //
 //	double hminX1 = 0.9;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.h
similarity index 88%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.h
index b45118adb5b9a18de0eabcc061fa18e11c042bdf..b5ce823ba3cedffd145d0d513c5acf715a631430 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef AverageValuesCoProcessor_H
-#define AverageValuesCoProcessor_H
+#ifndef AverageValuesSimulationObserver_H
+#define AverageValuesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -22,14 +22,14 @@ class Block3D;
 //
 //! \author  Sonja Uphoff, Kostyantyn Kucher
 // \f$ u_{mean}=\frac{1}{N}\sum\limits_{i=1}^n u_{i} \f$
-class AverageValuesCoProcessor : public CoProcessor
+class AverageValuesSimulationObserver : public SimulationObserver
 {
 public:
-    AverageValuesCoProcessor();
-    AverageValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
+    AverageValuesSimulationObserver();
+    AverageValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
                              SPtr<UbScheduler> Avs, SPtr<UbScheduler> rsMeans, SPtr<UbScheduler> rsRMS, bool restart);
     //! Make update
-    void process(real step) override;
+    void update(real step) override;
     //! Resets averaged velocity and RMS-values according to ResetSceduler
     void reset(real step);
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
index d50c58d5698a7faa0939fedd613075873d9e5363..8610c5df9e4b56496c3dc3ba1c25fabfd355f294 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
@@ -1,5 +1,5 @@
-#include "CalculateForcesCoProcessor.h"
-#include "BCProcessor.h"
+#include "CalculateForcesSimulationObserver.h"
+#include "BCSet.h"
 
 #include "BCArray3D.h"
 #include "Block3D.h"
@@ -13,9 +13,9 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-CalculateForcesCoProcessor::CalculateForcesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+CalculateForcesSimulationObserver::CalculateForcesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                        std::shared_ptr<vf::mpi::Communicator> comm, real v, real a)
-    : CoProcessor(grid, s), path(path), comm(comm), v(v), a(a), forceX1global(0), forceX2global(0), forceX3global(0)
+    : SimulationObserver(grid, s), path(path), comm(comm), v(v), a(a), forceX1global(0), forceX2global(0), forceX3global(0)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         std::ofstream ostr;
@@ -55,17 +55,17 @@ CalculateForcesCoProcessor::CalculateForcesCoProcessor(SPtr<Grid3D> grid, SPtr<U
     }
 }
 //////////////////////////////////////////////////////////////////////////
-CalculateForcesCoProcessor::~CalculateForcesCoProcessor() = default;
+CalculateForcesSimulationObserver::~CalculateForcesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::process(real step)
+void CalculateForcesSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::collectData(real step)
+void CalculateForcesSimulationObserver::collectData(real step)
 {
     calculateForces();
 
@@ -101,7 +101,7 @@ void CalculateForcesCoProcessor::collectData(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::calculateForces()
+void CalculateForcesSimulationObserver::calculateForces()
 {
     forceX1global = 0.0;
     forceX2global = 0.0;
@@ -117,7 +117,7 @@ void CalculateForcesCoProcessor::calculateForces()
             std::set<std::vector<int>> &transNodeIndicesSet = t.second;
 
             SPtr<ILBMKernel> kernel                 = block->getKernel();
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
             distributions->swap();
 
@@ -184,7 +184,7 @@ void CalculateForcesCoProcessor::calculateForces()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateForcesCoProcessor::getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions,
+UbTupleDouble3 CalculateForcesSimulationObserver::getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions,
                                                      SPtr<BoundaryConditions> bc)
 {
     UbTupleDouble3 force(0.0, 0.0, 0.0);
@@ -215,7 +215,7 @@ UbTupleDouble3 CalculateForcesCoProcessor::getForces(int x1, int x2, int x3, SPt
     return force;
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::calculateCoefficients()
+void CalculateForcesSimulationObserver::calculateCoefficients()
 {
     real F1 = forceX1global;
     real F2 = forceX2global;
@@ -227,9 +227,9 @@ void CalculateForcesCoProcessor::calculateCoefficients()
     C3 = 2.0 * F3 / (v * v * a);
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
+void CalculateForcesSimulationObserver::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::write(std::ofstream *fileObject, real value, char *separator)
+void CalculateForcesSimulationObserver::write(std::ofstream *fileObject, real value, char *separator)
 {
     (*fileObject).width(12);
     //(*fileObject).precision(2);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
index d282ae8ed10ae177ae78e4f559018d7ff0959be7..02b76e77bc6bfb3ee375e79465f2d548226189cb 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
@@ -1,18 +1,18 @@
 /*
- *  D3Q27ForcesCoProcessor.h
+ *  D3Q27ForcesSimulationObserver.h
  *
  *  Created on: 29.09.2012
  *  Author: K. Kucher
  */
 
-#ifndef D3Q27ForcesCoProcessor_H
-#define D3Q27ForcesCoProcessor_H
+#ifndef D3Q27ForcesSimulationObserver_H
+#define D3Q27ForcesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 #include "lbm/constants/D3Q27.h"
 
@@ -24,16 +24,16 @@ class D3Q27Interactor;
 class DistributionArray3D;
 class BoundaryConditions;
 
-class CalculateForcesCoProcessor : public CoProcessor
+class CalculateForcesSimulationObserver : public SimulationObserver
 {
 public:
     //! Constructor
     //! \param v - velocity of fluid in LB units
     //! \param a - area of object in LB units
-    CalculateForcesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm,
+    CalculateForcesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm,
                                real v, real a);
-    ~CalculateForcesCoProcessor() override;
-    void process(real step) override;
+    ~CalculateForcesSimulationObserver() override;
+    void update(real step) override;
     void addInteractor(SPtr<D3Q27Interactor> interactor);
 
 protected:
@@ -58,4 +58,4 @@ private:
     real C3;
 };
 
-#endif /* D3Q27ForcesCoProcessor_H */
+#endif /* D3Q27ForcesSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..affba2a27e9e840751c2ef35463b1353f0be9b44
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
@@ -0,0 +1,294 @@
+#include "NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h"
+#include "BCSet.h"
+
+#include <mpi/Communicator.h>
+#include "D3Q27Interactor.h"
+#include "UbScheduler.h"
+#include "Grid3D.h"
+#include "BoundaryConditions.h"
+#include "DataSet3D.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "BCArray3D.h"
+#include "EsoTwist3D.h"
+#include "DistributionArray3D.h"
+#include "NonNewtonianFluids/LBM/Rheology.h"
+
+CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
+{
+   if (comm->getProcessID() == comm->getRoot())
+   {
+      std::ofstream ostr;
+       std::string fname = path_;
+      ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);
+      if(!ostr)
+      { 
+         ostr.clear();
+         const std::string path = UbSystem::getPathFromString(fname);
+         if(path.size()>0){ UbSystem::makeDirectory(path); ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);}
+         if(!ostr) throw UbException(UB_EXARGS,"couldn't open file "+fname);
+      }
+
+      ostr << "step;";
+      ostr << "Tx;";
+      ostr << "Ty;";
+      ostr << "Tz" << std::endl;
+      ostr.close();
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+CalculateTorqueSimulationObserver::~CalculateTorqueSimulationObserver()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueSimulationObserver::update( real step )
+{
+   if(scheduler->isDue(step) )
+      collectData(step);
+
+   UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueSimulationObserver::collectData( real step )
+{
+   calculateForces();
+
+   if (comm->getProcessID() == comm->getRoot())
+   {
+      int istep = static_cast<int>(step);
+      std::ofstream ostr;
+      std::string fname = path;
+      ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);
+      if(!ostr)
+      { 
+         ostr.clear();
+         std::string path = UbSystem::getPathFromString(fname);
+         if(path.size()>0){ UbSystem::makeDirectory(path); ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);}
+         if(!ostr) throw UbException(UB_EXARGS,"couldn't open file "+fname);
+      }
+
+      ostr << istep << ";";
+      ostr << torqueX1global << ";";
+      ostr << torqueX2global << ";";
+      ostr << torqueX3global << ";";
+      ostr << Fx << ";";
+      ostr << Fy << ";";
+      ostr << Fz;
+      ostr << std::endl;
+      ostr.close();
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueSimulationObserver::calculateForces()
+{
+   torqueX1global = 0.0;
+   torqueX2global = 0.0;
+   torqueX3global = 0.0;
+
+   for(SPtr<D3Q27Interactor> interactor : interactors)
+   {
+      real x1Centre = interactor->getGbObject3D()->getX1Centroid();
+      real x2Centre = interactor->getGbObject3D()->getX2Centroid();
+      real x3Centre = interactor->getGbObject3D()->getX3Centroid();
+
+      for(BcNodeIndicesMap::value_type t : interactor->getBcNodeIndicesMap())
+      {
+         real torqueX1 = 0.0;
+         real torqueX2 = 0.0;
+         real torqueX3 = 0.0;
+
+         SPtr<Block3D> block = t.first;
+         std::set< std::vector<int> >& transNodeIndicesSet = t.second;
+
+         real deltaX = grid->getDeltaX(block);
+
+         SPtr<ILBMKernel> kernel = block->getKernel();
+
+         SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();          
+         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); 
+
+         int ghostLayerWidth = kernel->getGhostLayerWidth();
+         int minX1 = ghostLayerWidth;
+         int maxX1 = (int)bcArray->getNX1() - 1 - ghostLayerWidth;
+         int minX2 = ghostLayerWidth;
+         int maxX2 = (int)bcArray->getNX2() - 1 - ghostLayerWidth;
+         int minX3 = ghostLayerWidth;
+         int maxX3 = (int)bcArray->getNX3() - 1 - ghostLayerWidth;
+
+         for(std::vector<int> node : transNodeIndicesSet)
+         {
+            int x1 = node[0];
+            int x2 = node[1];
+            int x3 = node[2];
+
+            //without ghost nodes
+            if (x1 < minX1 || x1 > maxX1 || x2 < minX2 || x2 > maxX2 ||x3 < minX3 || x3 > maxX3 ) continue;
+
+            if(bcArray->isFluid(x1,x2,x3)) //es kann sein, dass der node von einem anderen interactor z.B. als solid gemarkt wurde!!!
+            {
+               SPtr<BoundaryConditions> bc = bcArray->getBC(x1,x2,x3);
+               
+               Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3);
+               real rx = (worldCoordinates[0] - x1Centre) / deltaX;
+               real ry = (worldCoordinates[1] - x2Centre) / deltaX;
+               real rz = (worldCoordinates[2] - x3Centre) / deltaX;
+
+               // real nx = rx / sqrt(rx * rx + ry * ry + rz * rz);
+               // real ny = ry / sqrt(rx * rx + ry * ry + rz * rz);
+               // real nz = rz / sqrt(rx * rx + ry * ry + rz * rz);
+
+               UbTupleDouble3 forceVec = getForces(x1, x2, x3, distributions, bc);
+               //UbTupleDouble3 forceVec = getForcesFromMoments(x1, x2, x3, kernel, distributions, bc, nx, ny, nz);
+               //UbTupleDouble3 forceVec = getForcesFromStressTensor(x1, x2, x3, kernel, distributions, bc, nx, ny, nz);
+               /*real*/ Fx                   = val<1>(forceVec);
+               /*real*/ Fy                   = val<2>(forceVec);
+               /*real*/ Fz                   = val<3>(forceVec);
+              
+
+
+               torqueX1 += ry * Fz - rz * Fy;
+               torqueX2 += rz * Fx - rx * Fz;
+               torqueX3 += rx * Fy - ry * Fx;
+            }
+         }
+
+         torqueX1global += torqueX1;
+         torqueX2global += torqueX2;
+         torqueX3global += torqueX3;
+      }
+   }
+   std::vector<real> values;
+   std::vector<real> rvalues;
+   values.push_back(torqueX1global);
+   values.push_back(torqueX2global);
+   values.push_back(torqueX3global);
+
+   rvalues = comm->gather(values);
+   if (comm->getProcessID() == comm->getRoot())
+   {
+      torqueX1global = 0.0;
+      torqueX2global = 0.0;
+      torqueX3global = 0.0;
+      
+      for (int i = 0; i < (int)rvalues.size(); i+=3)
+      {
+         torqueX1global += rvalues[i];
+         torqueX2global += rvalues[i+1];
+         torqueX3global += rvalues[i+2];
+      }
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForces(int x1, int x2, int x3,  SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc)
+{
+   UbTupleDouble3 force(0.0,0.0,0.0);
+
+   if(bc)
+   {
+      //references to tuple "force"
+      real& forceX1 = val<1>(force);
+      real& forceX2 = val<2>(force);
+      real& forceX3 = val<3>(force);
+      real f,  fnbr;
+
+      dynamicPointerCast<EsoTwist3D>(distributions)->swap();
+
+      for(int fdir=D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
+      {
+         if(bc->hasNoSlipBoundaryFlag(fdir) || bc->hasVelocityBoundaryFlag(fdir))
+         {
+            const int invDir = D3Q27System::INVDIR[fdir];
+            f = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1, x2, x3, invDir);
+            fnbr = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+
+            forceX1 += (f + fnbr) * D3Q27System::DX1[invDir];
+            forceX2 += (f + fnbr) * D3Q27System::DX2[invDir];
+            forceX3 += (f + fnbr) * D3Q27System::DX3[invDir];
+         }
+      }
+
+      dynamicPointerCast<EsoTwist3D>(distributions)->swap();
+   }
+
+   return force;
+}
+//////////////////////////////////////////////////////////////////////////
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForcesFromMoments(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
+{
+   using namespace vf::lbm::constant;
+   UbTupleDouble3 force(0.0, 0.0, 0.0);
+
+
+   if (bc) {
+      real f[D3Q27System::ENDF + 1];
+      distributions->getDistribution(f, x1, x2, x3);
+      real collFactor = kernel->getCollisionFactor();
+      real shearRate = D3Q27System::getShearRate(f, collFactor);
+      real rho = D3Q27System::getDensity(f);
+      real omega = Rheology::getBinghamCollFactor(collFactor, shearRate, rho);
+      std::array<real, 6> moments = D3Q27System::getSecondMoments(f, omega);
+
+      // references to tuple "force"
+      real &forceX1 = val<1>(force);
+      real &forceX2 = val<2>(force);
+      real &forceX3 = val<3>(force);
+
+      real mxx = (moments[0] + moments[1] + moments[2])*c1o3;
+      real myy = (-c2o1 * moments[1] + moments[2] + moments[0]) * c1o3; 
+      real mzz = (-c2o1 * moments[2] + moments[1] + moments[0]) * c1o3;
+      real mxy = moments[3];
+      real mxz = moments[4];
+      real myz = moments[5];
+      
+      forceX1 = mxx *nx + mxy*ny + mxz*nz;
+      forceX2 = mxy *nx + myy*ny + myz*nz;
+      forceX3 = mxz *nx + myz*ny + mzz*nz;
+   }
+
+   return force;
+}
+//////////////////////////////////////////////////////////////////////////
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForcesFromStressTensor(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
+{
+   using namespace vf::lbm::constant;
+   UbTupleDouble3 force(0.0, 0.0, 0.0);
+
+   if (bc) {
+      real f[D3Q27System::ENDF + 1];
+      distributions->getDistribution(f, x1, x2, x3);
+      real collFactor = kernel->getCollisionFactor();
+      real shearRate = D3Q27System::getShearRate(f, collFactor);
+      real rho = D3Q27System::getDensity(f);
+      real omega = Rheology::getBinghamCollFactor(collFactor, shearRate, rho);
+      std::array<real, 6> stress = D3Q27System::getStressTensor(f, omega);
+
+      // references to tuple "force"
+      real &forceX1 = val<1>(force);
+      real &forceX2 = val<2>(force);
+      real &forceX3 = val<3>(force);
+
+      real &tauXX = stress[0];
+      real &tauYY = stress[1];
+      real &tauZZ = stress[2];
+      real &tauXY = stress[3];
+      real &tauXZ = stress[4];
+      real &tauYZ = stress[5];
+
+      //https: // journals.aps.org/pre/pdf/10.1103/PhysRevE.88.013303
+
+      forceX1 = tauXX * nx + tauXY * ny + tauXZ * nz;
+      forceX2 = tauXY * nx + tauYY * ny + tauYZ * nz;
+      forceX3 = tauXZ * nx + tauYZ * ny + tauZZ * nz;
+   }
+
+   return force;
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueSimulationObserver::addInteractor( SPtr<D3Q27Interactor> interactor )
+{
+   interactors.push_back(interactor);
+}
+
+
+
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
similarity index 76%
rename from src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
index 0221bf38a599352728dbd42f37b78bc5fa6ff1ee..0754491767b55e2a6059c8eef160a94a1f087540 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
@@ -1,11 +1,11 @@
 /*
- *  DecreaseViscosityCoProcessor
+ *  DecreaseViscositySimulationObserver
  *
  *  Created on: 10.05.2013
  *  Author: uphoff
  */
 
-#include "DecreaseViscosityCoProcessor.h"
+#include "DecreaseViscositySimulationObserver.h"
 
 #include <vector>
 
@@ -15,27 +15,27 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-DecreaseViscosityCoProcessor::DecreaseViscosityCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc,
+DecreaseViscositySimulationObserver::DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc,
                                                            std::shared_ptr<vf::mpi::Communicator> comm)
 
-    : CoProcessor(grid, s), nueFunc(nueFunc), comm(comm)
+    : SimulationObserver(grid, s), nueFunc(nueFunc), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
     }
 }
 //////////////////////////////////////////////////////////////////////////
-DecreaseViscosityCoProcessor::~DecreaseViscosityCoProcessor() = default;
+DecreaseViscositySimulationObserver::~DecreaseViscositySimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void DecreaseViscosityCoProcessor::process(real step)
+void DecreaseViscositySimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         setViscosity(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void DecreaseViscosityCoProcessor::setViscosity(real step)
+void DecreaseViscositySimulationObserver::setViscosity(real step)
 {
 
-    UBLOG(logDEBUG3, "DecreaseViscosityCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "DecreaseViscositySimulationObserver::update:" << step);
     int gridRank     = grid->getRank();
     int minInitLevel = this->grid->getCoarsestInitializedLevel();
     int maxInitLevel = this->grid->getFinestInitializedLevel();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
similarity index 61%
rename from src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
index aaa8a3c0b8db4d9adb9b28c19ef993444e7106c0..2e2c655d223619169e0f3edd3bfa554e924639e0 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
@@ -1,9 +1,9 @@
-#ifndef DecreaseViscosityCoProcessor_H
-#define DecreaseViscosityCoProcessor_H
+#ifndef DecreaseViscositySimulationObserver_H
+#define DecreaseViscositySimulationObserver_H
 
 #include <PointerDefinitions.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "IntegrateValuesHelper.h"
 #include "LBMUnitConverter.h"
 
@@ -20,18 +20,18 @@ namespace vf::mpi {class Communicator;}
 //! decrViscFunc.SetExpr("nue0+c0/(t+1)/(t+1)");   //this function is time-dependent, the viscosity decreases a 1/t^2
 //! decrViscFunc.DefineConst("nue0", nueLB);
 //! decrViscFunc.DefineConst("c0", 0.1);           //constants such as c0 controll how fast the viscosity decreasis
-//! SPtr<UbScheduler> DecrViscSch(new UbScheduler()); //the CoProcessor is called according to a Scheduler
+//! SPtr<UbScheduler> DecrViscSch(new UbScheduler()); //the SimulationObserver is called according to a Scheduler
 //! DecrViscSch->addSchedule(10,10,1000);          //in this case the viscosity is reset every 10 timesteps for the
-//! first 1000 timesteps DecreaseViscosityCoProcessor decrViscPPPtr(grid, DecrViscSch,&decrViscFunc, comm); \endcode
+//! first 1000 timesteps DecreaseViscositySimulationObserver decrViscPPPtr(grid, DecrViscSch,&decrViscFunc, comm); \endcode
 //! \author Sonja Uphoff
 
-class DecreaseViscosityCoProcessor : public CoProcessor
+class DecreaseViscositySimulationObserver : public SimulationObserver
 {
 public:
-    DecreaseViscosityCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~DecreaseViscosityCoProcessor() override;
+    DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~DecreaseViscositySimulationObserver() override;
     //! calls collect PostprocessData.
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! resets the collision factor depending on the current timestep.
@@ -43,4 +43,4 @@ private:
     mu::Parser *nueFunc;
 };
 
-#endif /* DecreaseViscosityCoProcessor_H_ */
+#endif /* DecreaseViscositySimulationObserver_H_ */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
similarity index 59%
rename from src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
index fc181e266e0453a12a149a4c69083497617c61ea..a6826a713b45f74239c603d9a23b946169ac60d5 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
@@ -1,15 +1,15 @@
-#include "EmergencyExitCoProcessor.h"
+#include "EmergencyExitSimulationObserver.h"
 #include <mpi/Communicator.h>
 #include "Grid3D.h"
-#include "MPIIORestartCoProcessor.h"
+#include "MPIIORestartSimulationObserver.h"
 #include "UbLogger.h"
 #include "UbScheduler.h"
 #include <basics/utilities/UbFileInputASCII.h>
 #include <basics/utilities/UbFileOutputASCII.h>
 
-EmergencyExitCoProcessor::EmergencyExitCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                   SPtr<MPIIORestartCoProcessor> rp, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), rp(rp), comm(comm)
+EmergencyExitSimulationObserver::EmergencyExitSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+                                                   SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::mpi::Communicator> comm)
+    : SimulationObserver(grid, s), path(path), rp(rp), comm(comm)
 {
     this->path = path + "/exit";
     metafile   = this->path + "/stop.txt";
@@ -20,40 +20,40 @@ EmergencyExitCoProcessor::EmergencyExitCoProcessor(SPtr<Grid3D> grid, SPtr<UbSch
     comm->barrier();
 }
 //////////////////////////////////////////////////////////////////////////
-EmergencyExitCoProcessor::~EmergencyExitCoProcessor() = default;
+EmergencyExitSimulationObserver::~EmergencyExitSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void EmergencyExitCoProcessor::process(real step)
+void EmergencyExitSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "EmergencyExitCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "EmergencyExitSimulationObserver::update:" << step);
 }
 
-void EmergencyExitCoProcessor::collectData(real step)
+void EmergencyExitSimulationObserver::collectData(real step)
 {
     if (readMetafile()) {
-        rp->process((int)step);
+        rp->update((int)step);
         if (comm->getProcessID() == comm->getRoot())
-            UBLOG(logINFO, "EmergencyExitCoProcessor save step: " << step);
+            UBLOG(logINFO, "EmergencyExitSimulationObserver save step: " << step);
         comm->barrier();
         exit(EXIT_SUCCESS);
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void EmergencyExitCoProcessor::writeMetafile(int /*status*/)
+void EmergencyExitSimulationObserver::writeMetafile(int /*status*/)
 {
     UbFileOutputASCII out(metafile);
     out.writeBool(false);
 }
 //////////////////////////////////////////////////////////////////////////
-bool EmergencyExitCoProcessor::readMetafile()
+bool EmergencyExitSimulationObserver::readMetafile()
 {
     UbFileInputASCII in(metafile);
     return in.readBool();
 }
 //////////////////////////////////////////////////////////////////////////
-void EmergencyExitCoProcessor::checkMetafile()
+void EmergencyExitSimulationObserver::checkMetafile()
 {
     std::ifstream file(metafile.c_str());
     if (!file.is_open()) {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
new file mode 100644
index 0000000000000000000000000000000000000000..f4a8e79f6f8b89f1b4e37714f0c42d2be4be1810
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
@@ -0,0 +1,43 @@
+/*
+ *  EmergencyExitSimulationObserver.h
+ *
+ *  Created on: 05.10.2012
+ *  Author: K. Kucher
+ */
+
+#ifndef EmergencyExitSimulationObserver_H
+#define EmergencyExitSimulationObserver_H
+
+#include <PointerDefinitions.h>
+#include <string>
+
+#include "SimulationObserver.h"
+
+class MPIIORestartSimulationObserver;
+namespace vf::mpi {class Communicator;}
+class Grid3D;
+class UbScheduler;
+
+class EmergencyExitSimulationObserver : public SimulationObserver
+{
+public:
+    EmergencyExitSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+                             SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~EmergencyExitSimulationObserver() override;
+
+    void update(real step) override;
+
+protected:
+    void collectData(real step);
+    void writeMetafile(int status);
+    bool readMetafile();
+    void checkMetafile();
+
+private:
+    std::string path;
+    std::shared_ptr<vf::mpi::Communicator> comm;
+    SPtr<MPIIORestartSimulationObserver> rp;
+    std::string metafile;
+};
+
+#endif /* EmergencyExitSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
similarity index 98%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
index 918e3afbe8d454ac97707b8c79f927bca324cb52..9a39ce11ed15e939e9fc32eaeb15d541675387aa 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
@@ -1,5 +1,5 @@
 #include "ForceCalculator.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 
 #include "BCArray3D.h"
 #include "Block3D.h"
@@ -66,7 +66,7 @@ void ForceCalculator::calculateForces(std::vector<SPtr<D3Q27Interactor>> interac
 
             SPtr<Block3D> block                     = t.first;
             SPtr<ILBMKernel> kernel                 = block->getKernel();
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
             distributions->swap();
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.h b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
index 741f1f340c4c02e9f5b08854e7205ab2aa5e507b..4e8fd6d5f39fbeb581ace18bf544fa5346719850 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
@@ -1,7 +1,7 @@
 #ifdef VF_CATALYST
 
-#include "InSituCatalystCoProcessor.h"
-#include <D3Q27ETBCProcessor.h>
+#include "InSituCatalystSimulationObserver.h"
+#include <D3Q27ETBCSet.h>
 #include <LBMKernel.h>
 #include <string>
 #include <vector>
@@ -15,10 +15,10 @@
 
 using namespace std;
 
-InSituCatalystCoProcessor::InSituCatalystCoProcessor() {}
+InSituCatalystSimulationObserver::InSituCatalystSimulationObserver() {}
 //////////////////////////////////////////////////////////////////////////
-InSituCatalystCoProcessor::InSituCatalystCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script)
-    : CoProcessor(grid, s)
+InSituCatalystSimulationObserver::InSituCatalystSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script)
+    : SimulationObserver(grid, s)
 {
     gridRank     = vf::mpi::Communicator::getInstance()->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -40,17 +40,17 @@ InSituCatalystCoProcessor::InSituCatalystCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     buildVTKGrid();
 }
 //////////////////////////////////////////////////////////////////////////
-InSituCatalystCoProcessor::~InSituCatalystCoProcessor() {}
+InSituCatalystSimulationObserver::~InSituCatalystSimulationObserver() {}
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::process(real step)
+void InSituCatalystSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "InSituCatalystCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "InSituCatalystSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::collectData(real step)
+void InSituCatalystSimulationObserver::collectData(real step)
 {
     unsigned int istep = static_cast<int>(step);
 
@@ -86,10 +86,10 @@ void InSituCatalystCoProcessor::collectData(real step)
         Processor->CoProcess(dataDescription.GetPointer());
     }
 
-    UBLOG(logINFO, "InSituCatalystCoProcessor step: " << istep);
+    UBLOG(logINFO, "InSituCatalystSimulationObserver step: " << istep);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::addData(SPtr<Block3D> block)
+void InSituCatalystSimulationObserver::addData(SPtr<Block3D> block)
 {
     UbTupleDouble3 org          = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -97,7 +97,7 @@ void InSituCatalystCoProcessor::addData(SPtr<Block3D> block)
     real dx                   = grid->getDeltaX(block);
 
     SPtr<LBMKernel> kernel                  = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
@@ -166,7 +166,7 @@ void InSituCatalystCoProcessor::addData(SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::buildVTKGrid()
+void InSituCatalystSimulationObserver::buildVTKGrid()
 {
     unstructuredGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
     points           = vtkPoints::New();
@@ -206,7 +206,7 @@ void InSituCatalystCoProcessor::buildVTKGrid()
     vx3Array.resize(numOfPoints);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::addVTKGridData(SPtr<Block3D> block)
+void InSituCatalystSimulationObserver::addVTKGridData(SPtr<Block3D> block)
 {
     UbTupleDouble3 org          = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -214,7 +214,7 @@ void InSituCatalystCoProcessor::addVTKGridData(SPtr<Block3D> block)
     real dx                   = grid->getDeltaX(block);
 
     SPtr<LBMKernel> kernel                  = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.h
similarity index 73%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.h
index e1c9fb95c7ff420362c3dcbe4b7444902beb6ba1..f81fe767a448a75f04d8cf965b33a14cdf36b2b4 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.h
@@ -1,9 +1,9 @@
 #ifdef VF_CATALYST
 
-#ifndef InSituCatalystCoProcessor_h__
-#define InSituCatalystCoProcessor_h__
+#ifndef InSituCatalystSimulationObserver_h__
+#define InSituCatalystSimulationObserver_h__
 
-#include <CoProcessor.h>
+#include <SimulationObserver.h>
 #include <Grid3D.h>
 #include <LBMUnitConverter.h>
 #include "lbm/constants/D3Q27.h"
@@ -19,13 +19,13 @@
 #include <vtkSmartPointer.h>
 #include <vtkUnstructuredGrid.h>
 
-class InSituCatalystCoProcessor : public CoProcessor
+class InSituCatalystSimulationObserver : public SimulationObserver
 {
 public:
-    InSituCatalystCoProcessor();
-    InSituCatalystCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script);
-    virtual ~InSituCatalystCoProcessor();
-    void process(real step);
+    InSituCatalystSimulationObserver();
+    InSituCatalystSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script);
+    virtual ~InSituCatalystSimulationObserver();
+    void update(real step);
 
 protected:
     void collectData(real step);
@@ -52,6 +52,6 @@ private:
                                   real & /*vx2*/, real & /*vx3*/);
     CalcMacrosFct calcMacros;
 };
-#endif // InSituCatalystCoProcessor_h__
+#endif // InSituCatalystSimulationObserver_h__
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
index 6b8026cedd8331c02b52a06c86c0e5d7821d0aa2..74c1b653bd4f8b5f2def3492f83fa38677170feb 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
@@ -1,8 +1,8 @@
 #ifdef VF_VTK
 
-#include "InSituVTKCoProcessor.h"
+#include "InSituVTKSimulationObserver.h"
 #include <BCArray3D.h>
-#include <BCProcessor.h>
+#include <BCSet.h>
 #include <Block3D.h>
 #include <BoundaryConditions.h>
 #include <Communicator.h>
@@ -24,11 +24,11 @@
 
 using namespace std;
 
-InSituVTKCoProcessor::InSituVTKCoProcessor() {}
+InSituVTKSimulationObserver::InSituVTKSimulationObserver() {}
 //////////////////////////////////////////////////////////////////////////
-InSituVTKCoProcessor::InSituVTKCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
+InSituVTKSimulationObserver::InSituVTKSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
                                            SPtr<LBMUnitConverter> conv)
-    : CoProcessor(grid, s), conv(conv)
+    : SimulationObserver(grid, s), conv(conv)
 {
     gridRank     = vf::mpi::Communicator::getInstance()->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -55,17 +55,17 @@ InSituVTKCoProcessor::InSituVTKCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler>
     }
 }
 //////////////////////////////////////////////////////////////////////////
-InSituVTKCoProcessor::~InSituVTKCoProcessor() { comm->CloseConnection(); }
+InSituVTKSimulationObserver::~InSituVTKSimulationObserver() { comm->CloseConnection(); }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::process(real step)
+void InSituVTKSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "InSituVTKCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "InSituVTKSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::collectData(real step)
+void InSituVTKSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -119,10 +119,10 @@ void InSituVTKCoProcessor::collectData(real step)
     // writer->SetDataModeToAscii();
     // writer->Update();
 
-    UBLOG(logINFO, "InSituVTKCoProcessor step: " << istep);
+    UBLOG(logINFO, "InSituVTKSimulationObserver step: " << istep);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::addData(SPtr<Block3D> block)
+void InSituVTKSimulationObserver::addData(SPtr<Block3D> block)
 {
     UbTupleDouble3 org          = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -130,7 +130,7 @@ void InSituVTKCoProcessor::addData(SPtr<Block3D> block)
     real dx                   = grid->getDeltaX(block);
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
@@ -259,7 +259,7 @@ void InSituVTKCoProcessor::addData(SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::readConfigFile(const std::string &configFile)
+void InSituVTKSimulationObserver::readConfigFile(const std::string &configFile)
 {
     ifstream ifs;
     ifs.open(configFile, ifstream::in);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.h
similarity index 69%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.h
index 9456bf298b4e6e4af1e07ae14a46c3e11259cbaa..1171c54252fa315d1e9e84caed34d2596b9520c2 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.h
@@ -1,9 +1,9 @@
 #ifdef VF_VTK
 
-#ifndef InSituVTKCoProcessor_h__
-#define InSituVTKCoProcessor_h__
+#ifndef InSituVTKSimulationObserver_h__
+#define InSituVTKSimulationObserver_h__
 
-#include <CoProcessor.h>
+#include <SimulationObserver.h>
 #include <Grid3D.h>
 #include <LBMUnitConverter.h>
 
@@ -16,14 +16,14 @@
 #include <vtkSocketController.h>
 #include <vtkUnstructuredGrid.h>
 
-class InSituVTKCoProcessor : public CoProcessor
+class InSituVTKSimulationObserver : public SimulationObserver
 {
 public:
-    InSituVTKCoProcessor();
-    InSituVTKCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
+    InSituVTKSimulationObserver();
+    InSituVTKSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
                          SPtr<LBMUnitConverter> conv);
-    virtual ~InSituVTKCoProcessor();
-    void process(real step);
+    virtual ~InSituVTKSimulationObserver();
+    void update(real step);
 
 protected:
     void collectData(real step);
@@ -48,6 +48,6 @@ private:
     std::string wIP;
 };
 
-#endif // InSituVTKCoProcessor_h__
+#endif // InSituVTKSimulationObserver_h__
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
similarity index 98%
rename from src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
index 0d8b7827b48fb2a5e6e16d13538f63209e03e244..7eabcd2849f2fca11cb057357492fa1062c46dce 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
@@ -5,7 +5,7 @@
 #include <vector>
 
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "DataSet3D.h"
 #include "LBMKernel.h"
 
@@ -65,7 +65,7 @@ void IntegrateValuesHelper::init(int level)
             orgX3 = val<3>(org);
 
             SPtr<LBMKernel> kernel                  = dynamicPointerCast<LBMKernel>(block->getKernel());
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             int ghostLayerWitdh                     = kernel->getGhostLayerWidth();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
             real internX1, internX2, internX3;
@@ -193,7 +193,7 @@ void IntegrateValuesHelper::calculateMQ()
             calcMacros = &D3Q27System::calcIncompMacroscopicValues;
         }
 
-        SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
         for (UbTupleInt3 node : cn.nodes) {
             distributions->getDistribution(f, val<1>(node), val<2>(node), val<3>(node));
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.h b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
index 98d0188fc25def9ee613e85f98d9623b0dfdf702..75350fb6e0904c434519a241228d7662c84ecf22 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
@@ -1,5 +1,5 @@
-#include "LineTimeSeriesCoProcessor.h"
-#include "BCProcessor.h"
+#include "LineTimeSeriesSimulationObserver.h"
+#include "BCSet.h"
 #include "WbWriterVtkXmlASCII.h"
 
 #include "Block3D.h"
@@ -12,9 +12,9 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-LineTimeSeriesCoProcessor::LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+LineTimeSeriesSimulationObserver::LineTimeSeriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                      SPtr<GbLine3D> line, int level, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), length(0), ix1(0), ix2(0), ix3(0), level(level), line(line)
+    : SimulationObserver(grid, s), path(path), length(0), ix1(0), ix2(0), ix3(0), level(level), line(line)
 {
     root  = comm->isRoot();
     fname = path;
@@ -23,7 +23,7 @@ LineTimeSeriesCoProcessor::LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     numOfProc = comm->getNumberOfProcesses();
     gridRank  = comm->getProcessID();
 
-    real dx = CoProcessor::grid->getDeltaX(level);
+    real dx = SimulationObserver::grid->getDeltaX(level);
 
     SPtr<CoordinateTransformation3D> trafo = grid->getCoordinateTransformator();
     real orgX1                           = trafo->getX1CoordinateOffset();
@@ -61,16 +61,16 @@ LineTimeSeriesCoProcessor::LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     ix3 = x3min % val<3>(blockNx) + 1;
 }
 //////////////////////////////////////////////////////////////////////////
-void LineTimeSeriesCoProcessor::process(real step)
+void LineTimeSeriesSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step)) {
         collectData();
     }
 
-    UBLOG(logDEBUG3, "MacroscopicQuantitiesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "MacroscopicQuantitiesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void LineTimeSeriesCoProcessor::writeLine(const std::string &path)
+void LineTimeSeriesSimulationObserver::writeLine(const std::string &path)
 {
     std::vector<UbTupleFloat3> nodes(2);
     std::vector<UbTupleInt2> lines(1);
@@ -86,7 +86,7 @@ void LineTimeSeriesCoProcessor::writeLine(const std::string &path)
     writer->writeLines(path, nodes, lines);
 }
 //////////////////////////////////////////////////////////////////////////
-void LineTimeSeriesCoProcessor::collectData()
+void LineTimeSeriesSimulationObserver::collectData()
 {
     real f[27];
     real vx1, vx2, vx3, rho;
@@ -104,7 +104,7 @@ void LineTimeSeriesCoProcessor::collectData()
             blockix3 = x / blocknx;
         }
 
-        SPtr<Block3D> block = CoProcessor::grid->getBlock(blockix1, blockix2, blockix3, level);
+        SPtr<Block3D> block = SimulationObserver::grid->getBlock(blockix1, blockix2, blockix3, level);
         if (block) {
             if (block->getRank() == gridRank) {
                 SPtr<ILBMKernel> kernel = block->getKernel();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
index c510a9b46b265344242ab8e3c75560d370a53921..0f8a9ab44ac60e16708be7453e65809ec0505155 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
@@ -1,12 +1,12 @@
-#ifndef LineTimeSeriesCoProcessor_h__
-#define LineTimeSeriesCoProcessor_h__
+#ifndef LineTimeSeriesSimulationObserver_h__
+#define LineTimeSeriesSimulationObserver_h__
 
 #include <PointerDefinitions.h>
 #include <string>
 
 #include <mpi.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 
 namespace vf::mpi {class Communicator;}
@@ -20,17 +20,17 @@ class GbLine3D;
 //
 //! \author  Konstantin Kutscher
 
-class LineTimeSeriesCoProcessor : public CoProcessor
+class LineTimeSeriesSimulationObserver : public SimulationObserver
 {
 public:
     enum Direction { X1, X2, X3 };
 
 public:
-    LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<GbLine3D> line,
+    LineTimeSeriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<GbLine3D> line,
                               int level, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~LineTimeSeriesCoProcessor() override = default;
+    ~LineTimeSeriesSimulationObserver() override = default;
 
-    void process(real step) override;
+    void update(real step) override;
     void writeLine(const std::string &path);
 
 protected:
@@ -58,4 +58,4 @@ private:
     int gridRank;
     Direction dir;
 };
-#endif // LineTimeSeriesCoProcessor_h__
+#endif // LineTimeSeriesSimulationObserver_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
index fd08df50a3f0cb9b85fd3255465170a4ef1681a9..ef220856838baabadb3b8cf40270d0e505147069 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
@@ -1,6 +1,6 @@
-#include "MPIIOMigrationBECoProcessor.h"
+#include "MPIIOMigrationBESimulationObserver.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include <mpi/Communicator.h>
@@ -25,8 +25,8 @@ using namespace MPIIODataStructures;
 #define MESSAGE_TAG 80
 #define SEND_BLOCK_SIZE 100000
 
-MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : MPIIOCoProcessor(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999)
+MPIIOMigrationBESimulationObserver::MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+    : MPIIOSimulationObserver(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
     metisVisitor = mV;
@@ -38,13 +38,13 @@ MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr
 }
 
 //////////////////////////////////////////////////////////////////////////
-MPIIOMigrationBECoProcessor::~MPIIOMigrationBECoProcessor() { MPI_Type_free(&sendBlockIntType); }
+MPIIOMigrationBESimulationObserver::~MPIIOMigrationBESimulationObserver() { MPI_Type_free(&sendBlockIntType); }
 
-void MPIIOMigrationBECoProcessor::process(real step)
+void MPIIOMigrationBESimulationObserver::update(real step)
 {
     if (scheduler->isDue(step)) {
         if (comm->isRoot())
-            UBLOG(logINFO, "MPIIOMigrationBECoProcessor save step: " << step);
+            UBLOG(logINFO, "MPIIOMigrationBESimulationObserver save step: " << step);
         if (comm->isRoot())
             UBLOG(logINFO, "Save check point - start");
         clearAllFiles((int)step);
@@ -60,13 +60,13 @@ void MPIIOMigrationBECoProcessor::process(real step)
     }
 }
 
-void MPIIOMigrationBECoProcessor::clearAllFiles(int step)
+void MPIIOMigrationBESimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
     MPI_Offset new_size = 0;
 
-    MPIIOCoProcessor::clearAllFiles(step);
+    MPIIOSimulationObserver::clearAllFiles(step);
 
     UbSystem::makeDirectory(path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step));
 
@@ -87,16 +87,16 @@ void MPIIOMigrationBECoProcessor::clearAllFiles(int step)
     MPI_File_close(&file_handler);
 }
 
-void MPIIOMigrationBECoProcessor::writeBlocks(int step)
+void MPIIOMigrationBESimulationObserver::writeBlocks(int step)
 {
     grid->deleteBlockIDs();
     RenumberGridVisitor renumber(comm);
     grid->accept(renumber);
 
-    MPIIOCoProcessor::writeBlocks(step);
+    MPIIOSimulationObserver::writeBlocks(step);
 }
 
-void MPIIOMigrationBECoProcessor::writeDataSet(int step)
+void MPIIOMigrationBESimulationObserver::writeDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -121,7 +121,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeDataSet start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeDataSet start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -290,7 +290,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -362,7 +362,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeDataSet time: " << finish - start << " s");
     }
 
     MPI_File file_handler1;
@@ -409,7 +409,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     }
 
-void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationBESimulationObserver::write4DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -436,7 +436,7 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write4DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write4DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -462,7 +462,7 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
                     ___Array = block->getKernel()->getDataSet()->getShearStressValues();
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::write4DArray : 4D array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBESimulationObserver::write4DArray : 4D array type does not exist!"));
                     break;
             }
 
@@ -489,7 +489,7 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write4DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -524,11 +524,11 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write4DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write4DArray time: " << finish - start << " s");
     }
 }
 
-void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationBESimulationObserver::write3DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -555,7 +555,7 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write3DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write3DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -579,7 +579,7 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
                     break;
                 default:
                     UB_THROW(UbException(UB_EXARGS,
-                    "MPIIOMigrationBECoProcessor::write3DArray : 3D array type does not exist!"));
+                    "MPIIOMigrationBESimulationObserver::write3DArray : 3D array type does not exist!"));
                     break;
             }
 
@@ -606,7 +606,7 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write3DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -641,11 +641,11 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write3DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write3DArray time: " << finish - start << " s");
     }
 }
 
-void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
+void MPIIOMigrationBESimulationObserver::writeBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -653,7 +653,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeBoundaryConds start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeBoundaryConds start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -685,7 +685,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
     {
         for (SPtr<Block3D> block : blocksVector[level]) // all the blocks of the current level
         {
-            bcArr = block->getKernel()->getBCProcessor()->getBCArray();
+            bcArr = block->getKernel()->getBCSet()->getBCArray();
 
             bcAddArray[ic].globalID = block->getGlobalID();                // id of the block needed to find it while regenerating the grid
             bcAddArray[ic].boundCond_count      = 0; // how many BoundaryConditions in this block
@@ -716,7 +716,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
                     bouCond->nx3                    = (real)bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = (real)bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBcAlgorithmType();
+                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
                 }
 
                 bcVector[ic].push_back(*bouCond);
@@ -752,7 +752,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -835,7 +835,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeBoundaryConds time: " << finish - start << " s");
     }
 
     delete[] bcAddArray;
@@ -845,10 +845,10 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
 }
 
 //------------------------------------------- READ -----------------------------------------------
-void MPIIOMigrationBECoProcessor::restart(int step)
+void MPIIOMigrationBESimulationObserver::restart(int step)
 {
     if (comm->isRoot())
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor restart step: " << step);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver restart step: " << step);
     if (comm->isRoot())
         UBLOG(logINFO, "Load check point - start");
 
@@ -863,9 +863,9 @@ void MPIIOMigrationBECoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - end");
 }
 
-void MPIIOMigrationBECoProcessor::readBlocks(int step) { MPIIOCoProcessor::readBlocks(step); }
+void MPIIOMigrationBESimulationObserver::readBlocks(int step) { MPIIOSimulationObserver::readBlocks(step); }
 
-void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, int doubleCountInBlock, std::vector<real> &pV, std::vector<real> *rawDataReceive)
+void MPIIOMigrationBESimulationObserver::blocksExchange(int tagN, int ind1, int ind2, int doubleCountInBlock, std::vector<real> &pV, std::vector<real> *rawDataReceive)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -893,7 +893,7 @@ void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, i
     {
         tempBlock = grid->getBlock(indexB + int(ind));
         if (!tempBlock)
-            throw UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::blocksExchange -- null block pointer!!!");
+            throw UbException(UB_EXARGS, "MPIIOMigrationBESimulationObserver::blocksExchange -- null block pointer!!!");
 
         tempRank = tempBlock->getRank();
 
@@ -998,7 +998,7 @@ void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, i
     delete[] requests;
 }
 
-void MPIIOMigrationBECoProcessor::readDataSet(int step)
+void MPIIOMigrationBESimulationObserver::readDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1006,8 +1006,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
 
     if (!lbmKernel)
         UB_THROW(UbException(UB_EXARGS, "lbmKernel does not exist!"));
-    if (!bcProcessor)
-        UB_THROW(UbException(UB_EXARGS, "bcProcessor does not exist!"));
+    if (!bcSet)
+        UB_THROW(UbException(UB_EXARGS, "BCSet does not exist!"));
     if (nue == -999.999)
         UB_THROW(UbException(UB_EXARGS, "nue is not initialised!"));
     if (nuL == -999.999 )
@@ -1019,7 +1019,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1109,8 +1109,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet start of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet start of exchange of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1139,8 +1139,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1252,7 +1252,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1306,7 +1306,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     delete[] rawDataReceiveH2;
 }
 
-void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::string fname)
+void MPIIOMigrationBESimulationObserver::readArray(int step, Arrays arrType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1314,7 +1314,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1362,8 +1362,8 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray start of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray start of exchange of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1376,9 +1376,9 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray end of exchange of data, rank = " << rank);
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray end of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1452,7 +1452,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
                     block->getKernel()->getDataSet()->setPressureField(___3DArray);
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::readArray : array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBESimulationObserver::readArray : array type does not exist!"));
                     break;
             } 
         }
@@ -1462,12 +1462,12 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
-void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
+void MPIIOMigrationBESimulationObserver::readBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1475,7 +1475,7 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1521,8 +1521,8 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds start of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds start of exchange of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1601,9 +1601,9 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds end of exchange of data, rank = " << rank);
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds end of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1681,7 +1681,7 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
                     bc->nx3 = bcArray[ibc].nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bc->setQ(bcArray[ibc].q[iq], iq);
-                    bc->setBcAlgorithmType(bcArray[ibc].algorithmType);
+                    bc->setBCStrategyType(bcArray[ibc].algorithmType);
                 }
 
                 bcVector.push_back(bc);
@@ -1690,14 +1690,14 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
             CbArray3D<int, IndexerX3X2X1> bcim(bcindexmatrixV, boundCondParamStr.nx1, boundCondParamStr.nx2, boundCondParamStr.nx3);
             SPtr<Block3D> block1 = grid->getBlock(blockID);
 
-            SPtr<BCProcessor> bcProc = bcProcessor->clone(block1->getKernel());
+            SPtr<BCSet> bcProc = bcSet->clone(block1->getKernel());
             SPtr<BCArray3D> bcArr(new BCArray3D());
             bcArr->bcindexmatrix  = bcim;
             bcArr->bcvector       = bcVector;
             bcArr->indexContainer = indexContainerV;
             bcProc->setBCArray(bcArr);
 
-            block1->getKernel()->setBCProcessor(bcProc);
+            block1->getKernel()->setBCSet(bcProc);
         }
     }
 
@@ -1714,20 +1714,20 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds end of restore of data, rank = " << rank);
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds time: " << finish - start << " s");
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationBECoProcessor::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
+void MPIIOMigrationBESimulationObserver::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationBECoProcessor::setBCProcessor(SPtr<BCProcessor> bcProcessor) { this->bcProcessor = bcProcessor; }
+void MPIIOMigrationBESimulationObserver::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationBECoProcessor::setNu(real nu) { this->nue = nu; }
+void MPIIOMigrationBESimulationObserver::setNu(real nu) { this->nue = nu; }
 
-void MPIIOMigrationBECoProcessor::setNuLG(real cfL, real cfG) { this->nuL = cfL;  this->nuG = cfG; }
+void MPIIOMigrationBESimulationObserver::setNuLG(real cfL, real cfG) { this->nuL = cfL;  this->nuG = cfG; }
 
-void MPIIOMigrationBECoProcessor::setDensityRatio(real dr) { this->densityRatio = dr; }
+void MPIIOMigrationBESimulationObserver::setDensityRatio(real dr) { this->densityRatio = dr; }
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
index d29ecca36d194cd0498b3347b9e59eefced8a475..fa55ea17a350ec9a1de215892258526142f6d19b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
@@ -1,23 +1,23 @@
-#ifndef _MPIIOMigrationBECoProcessor_H_
-#define _MPIIOMigrationBECoProcessor_H_
+#ifndef _MPIIOMigrationBESimulationObserver_H_
+#define _MPIIOMigrationBESimulationObserver_H_
 
 #include <mpi.h>
 #include <string>
 #include <vector>
 
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "MPIIODataStructures.h"
 
 class Grid3D;
 class UbScheduler;
 namespace vf::mpi {class Communicator;}
-class BCProcessor;
+class BCSet;
 class LBMKernel;
 class Grid3DVisitor;
 
-//! \class MPIWriteBlocksBECoProcessor
+//! \class MPIWriteBlocksBESimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIOMigrationBECoProcessor : public MPIIOCoProcessor
+class MPIIOMigrationBESimulationObserver : public MPIIOSimulationObserver
 {
     enum Arrays {
         AverageDensity      = 1,
@@ -32,11 +32,11 @@ class MPIIOMigrationBECoProcessor : public MPIIOCoProcessor
     };
 
 public:
-    MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path,
+    MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path,
                                 std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIOMigrationBECoProcessor() override;
+    ~MPIIOMigrationBESimulationObserver() override;
     //! Each timestep writes the grid into the files
-    void process(real step) override;
+    void update(real step) override;
     //! Reads the grid from the files before grid reconstruction
     void restart(int step);
     //! Writes the blocks of the grid into the file cpBlocks.bin
@@ -69,8 +69,8 @@ public:
     void readBoundaryConds(int step);
     //! The function sets LBMKernel
     void setLBMKernel(SPtr<LBMKernel> kernel);
-    //! The function sets BCProcessor
-    void setBCProcessor(SPtr<BCProcessor> bcProcessor);
+    //! The function sets BCSet
+    void setBCSet(SPtr<BCSet> BCSet);
     //! The function truncates the data files
     void clearAllFiles(int step);
     void setNu(real nu);
@@ -90,7 +90,7 @@ private:
 
     MPIIODataStructures::boundCondParam boundCondParamStr;
     SPtr<LBMKernel> lbmKernel;
-    SPtr<BCProcessor> bcProcessor;
+    SPtr<BCSet> bcSet;
     SPtr<Grid3DVisitor> metisVisitor;
     real nue;
     real nuL;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
index 4e3a84aa8a47051aee123181fc63741266dbacc0..32e6ba5188626c0a37fba8e9db0ad4447502d001 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
@@ -1,6 +1,6 @@
-#include "MPIIOMigrationCoProcessor.h"
+#include "MPIIOMigrationSimulationObserver.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include <mpi/Communicator.h>
@@ -22,8 +22,8 @@
 
 using namespace MPIIODataStructures;
 
-MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : MPIIOCoProcessor(grid, s, path, comm)
+MPIIOMigrationSimulationObserver::MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+    : MPIIOSimulationObserver(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
     metisVisitor = mV;
@@ -60,7 +60,7 @@ MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     MPI_Type_commit(&boundCondTypeAdd);
 }
 //////////////////////////////////////////////////////////////////////////
-MPIIOMigrationCoProcessor::~MPIIOMigrationCoProcessor()
+MPIIOMigrationSimulationObserver::~MPIIOMigrationSimulationObserver()
 {
     MPI_Type_free(&dataSetType);
     MPI_Type_free(&dataSetSmallType);
@@ -69,12 +69,12 @@ MPIIOMigrationCoProcessor::~MPIIOMigrationCoProcessor()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationCoProcessor::process(real step)
+void MPIIOMigrationSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step)) 
     {
         if (comm->isRoot())
-            UBLOG(logINFO, "MPIIOMigrationCoProcessor save step: " << step);
+            UBLOG(logINFO, "MPIIOMigrationSimulationObserver save step: " << step);
         if (comm->isRoot())
             UBLOG(logINFO, "Save check point - start");
         /*if (comm->isRoot())*/ clearAllFiles((int)step);
@@ -90,13 +90,13 @@ void MPIIOMigrationCoProcessor::process(real step)
     }
 }
 
-void MPIIOMigrationCoProcessor::clearAllFiles(int step)
+void MPIIOMigrationSimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
     MPI_Offset new_size = 0;
 
-    MPIIOCoProcessor::clearAllFiles(step);
+    MPIIOSimulationObserver::clearAllFiles(step);
 
     UbSystem::makeDirectory(path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step));
 
@@ -108,13 +108,13 @@ void MPIIOMigrationCoProcessor::clearAllFiles(int step)
     MPI_File_close(&file_handler);
 }
 
-void MPIIOMigrationCoProcessor::writeBlocks(int step)
+void MPIIOMigrationSimulationObserver::writeBlocks(int step)
 {
     grid->renumberBlockIDs();
-    MPIIOCoProcessor::writeBlocks(step);
+    MPIIOSimulationObserver::writeBlocks(step);
 }
 
-void MPIIOMigrationCoProcessor::writeDataSet(int step)
+void MPIIOMigrationSimulationObserver::writeDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -139,7 +139,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeDataSet start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeDataSet start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -324,7 +324,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -410,7 +410,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeDataSet time: " << finish - start << " s");
     }
 
     delete[] dataSetArray;
@@ -453,7 +453,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
 }
 
-void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationSimulationObserver::write4DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -476,7 +476,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write4DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -509,7 +509,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
                     ___Array = block->getKernel()->getDataSet()->getShearStressValues();
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::write4DArray : 4D array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationSimulationObserver::write4DArray : 4D array type does not exist!"));
                     break;
             }
 
@@ -538,7 +538,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write4DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -577,13 +577,13 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write4DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationSimulationObserver::write3DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -606,7 +606,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start collect data to file = " << fname);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write3DArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -636,7 +636,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
                     ___Array = block->getKernel()->getDataSet()->getPressureField();
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::write3DArray : 3D array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationSimulationObserver::write3DArray : 3D array type does not exist!"));
                     break;
             }
 
@@ -665,7 +665,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write3DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -710,13 +710,13 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write3DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
+void MPIIOMigrationSimulationObserver::writeBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -724,7 +724,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeBoundaryConds start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeBoundaryConds start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -756,7 +756,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
     {
         for (SPtr<Block3D> block : blocksVector[level]) // all the blocks of the current level
         {
-            bcArr = block->getKernel()->getBCProcessor()->getBCArray();
+            bcArr = block->getKernel()->getBCSet()->getBCArray();
 
             bcAddArray[ic].globalID = block->getGlobalID();                // id of the block needed to find it while regenerating the grid
             bcAddArray[ic].boundCond_count      = 0; // how many BoundaryConditions in this block
@@ -788,7 +788,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
                     bouCond->nx3                    = (real)bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = (real)bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBcAlgorithmType();
+                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
                 }
 
                 bcVector[ic].push_back(*bouCond);
@@ -824,7 +824,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "<< Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -897,7 +897,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeBoundaryConds time: " << finish - start << " s");
     }
 
     delete[] bcAddArray;
@@ -908,10 +908,10 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 }
 
 //------------------------------------------- READ -----------------------------------------------
-void MPIIOMigrationCoProcessor::restart(int step)
+void MPIIOMigrationSimulationObserver::restart(int step)
 {
     if (comm->isRoot())
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor restart step: " << step);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver restart step: " << step);
     if (comm->isRoot())
         UBLOG(logINFO, "Load check point - start");
 
@@ -928,9 +928,9 @@ void MPIIOMigrationCoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - end");
 }
 
-void MPIIOMigrationCoProcessor::readBlocks(int step) { MPIIOCoProcessor::readBlocks(step); }
+void MPIIOMigrationSimulationObserver::readBlocks(int step) { MPIIOSimulationObserver::readBlocks(step); }
 
-void MPIIOMigrationCoProcessor::readDataSet(int step)
+void MPIIOMigrationSimulationObserver::readDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -938,7 +938,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1063,8 +1063,8 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1170,7 +1170,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1216,7 +1216,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
 }
 
-void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string fname)
+void MPIIOMigrationSimulationObserver::readArray(int step, Arrays arrType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1224,7 +1224,7 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start fname = " << fname);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray start fname = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1285,8 +1285,8 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray readArray: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray readArray: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1353,21 +1353,21 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
                 block->getKernel()->getDataSet()->setPressureField(___3DArray);
                 break;
             default:
-                UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::readArray : array type does not exist!"));
+                UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationSimulationObserver::readArray : array type does not exist!"));
                 break;
         }
     }
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
+void MPIIOMigrationSimulationObserver::readBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1375,7 +1375,7 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1416,8 +1416,8 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1481,7 +1481,7 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
                     bc->nx3 = bcArray[ibc].nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bc->setQ(bcArray[ibc].q[iq], iq);
-                    bc->setBcAlgorithmType(bcArray[ibc].algorithmType);
+                    bc->setBCStrategyType(bcArray[ibc].algorithmType);
                 }
 
                 bcVector.push_back(bc);
@@ -1496,14 +1496,14 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
             CbArray3D<int, IndexerX3X2X1> bcim(bcindexmatrixV, boundCondParamStr.nx1, boundCondParamStr.nx2, boundCondParamStr.nx3);
             SPtr<Block3D> block1 = grid->getBlock(bcAddArray[ic].globalID);
 
-            SPtr<BCProcessor> bcProc = bcProcessor->clone(block1->getKernel());
+            SPtr<BCSet> bcProc = bcSet->clone(block1->getKernel());
             SPtr<BCArray3D> bcArr(new BCArray3D());
             bcArr->bcindexmatrix  = bcim;
             bcArr->bcvector       = bcVector;
             bcArr->indexContainer = indexContainerV;
             bcProc->setBCArray(bcArr);
 
-            block1->getKernel()->setBCProcessor(bcProc);
+            block1->getKernel()->setBCSet(bcProc);
 
             delete bcArray;
             delete intArray1;
@@ -1519,12 +1519,12 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationCoProcessor::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
+void MPIIOMigrationSimulationObserver::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationCoProcessor::setBCProcessor(SPtr<BCProcessor> bcProcessor) { this->bcProcessor = bcProcessor; }
+void MPIIOMigrationSimulationObserver::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
similarity index 81%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
index 4b8c6231176923618b1a394f125ff32b0e450d54..588366a6498c107600d377a65819e11100aa6702 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
@@ -1,22 +1,22 @@
-#ifndef _MPIIOMigrationCoProcessor_H_
-#define _MPIIOMigrationCoProcessor_H_
+#ifndef _MPIIOMigrationSimulationObserver_H_
+#define _MPIIOMigrationSimulationObserver_H_
 
 #include <mpi.h>
 #include <string>
 
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "MPIIODataStructures.h"
 
 class Grid3D;
 class UbScheduler;
 namespace vf::mpi {class Communicator;}
-class BCProcessor;
+class BCSet;
 class LBMKernel;
 class Grid3DVisitor;
 
-//! \class MPIWriteBlocksCoProcessor
+//! \class MPIWriteBlocksSimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIOMigrationCoProcessor : public MPIIOCoProcessor
+class MPIIOMigrationSimulationObserver : public MPIIOSimulationObserver
 {
 public:
     enum Arrays {
@@ -31,10 +31,10 @@ public:
         PressureField = 9
     };
 
-    MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIOMigrationCoProcessor() override;
+    MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~MPIIOMigrationSimulationObserver() override;
     //! Each timestep writes the grid into the files
-    void process(real step) override;
+    void update(real step) override;
     //! Reads the grid from the files before grid reconstruction
     void restart(int step);
     //! Writes the blocks of the grid into the file cpBlocks.bin
@@ -67,8 +67,8 @@ public:
     void readBoundaryConds(int step);
     //! The function sets LBMKernel
     void setLBMKernel(SPtr<LBMKernel> kernel);
-    //! The function sets BCProcessor
-    void setBCProcessor(SPtr<BCProcessor> bcProcessor);
+    //! The function sets BCSet
+    void setBCSet(SPtr<BCSet> BCSet);
     //! The function truncates the data files
     void clearAllFiles(int step);
     // void setNu(real nu);
@@ -80,7 +80,7 @@ private:
 
     MPIIODataStructures::boundCondParam boundCondParamStr;
     SPtr<LBMKernel> lbmKernel;
-    SPtr<BCProcessor> bcProcessor;
+    SPtr<BCSet> bcSet;
     SPtr<Grid3DVisitor> metisVisitor;
 };
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
index f55d2e08a847e0892810ea12da8d97454c1416f7..fdc3f4d4347f56d52c2b8a4952da3309ca90fe19 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
@@ -1,6 +1,6 @@
-#include "MPIIORestartCoProcessor.h"
+#include "MPIIORestartSimulationObserver.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include <mpi/Communicator.h>
@@ -25,8 +25,8 @@
 
 using namespace MPIIODataStructures;
 
-MPIIORestartCoProcessor::MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : MPIIOCoProcessor(grid, s, path, comm)
+MPIIORestartSimulationObserver::MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+    : MPIIOSimulationObserver(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
 
@@ -67,7 +67,7 @@ MPIIORestartCoProcessor::MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbSched
     MPI_Type_commit(&boundCondTypeAdd);
 }
 //////////////////////////////////////////////////////////////////////////
-MPIIORestartCoProcessor::~MPIIORestartCoProcessor()
+MPIIORestartSimulationObserver::~MPIIORestartSimulationObserver()
 {
     MPI_Type_free(&dataSetType);
     MPI_Type_free(&dataSetSmallType);
@@ -77,12 +77,12 @@ MPIIORestartCoProcessor::~MPIIORestartCoProcessor()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::process(real step)
+void MPIIORestartSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step)) 
     {
         if (comm->isRoot())
-            UBLOG(logINFO, "MPIIORestartCoProcessor save step: " << step);
+            UBLOG(logINFO, "MPIIORestartSimulationObserver save step: " << step);
         if (comm->isRoot())
             UBLOG(logINFO, "Save check point - start");
         /*if (comm->isRoot())*/ clearAllFiles((int)step);
@@ -98,7 +98,7 @@ void MPIIORestartCoProcessor::process(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::clearAllFiles(int step)
+void MPIIORestartSimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
@@ -106,7 +106,7 @@ void MPIIORestartCoProcessor::clearAllFiles(int step)
 
     UbSystem::makeDirectory(path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step));
 
-    MPIIOCoProcessor::clearAllFiles(step);
+    MPIIOSimulationObserver::clearAllFiles(step);
 
     std::string filename10 = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpBC.bin";
     int rc10 =
@@ -117,9 +117,9 @@ void MPIIORestartCoProcessor::clearAllFiles(int step)
     MPI_File_close(&file_handler);
 }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::writeBlocks(int step) { MPIIOCoProcessor::writeBlocks(step); }
+void MPIIORestartSimulationObserver::writeBlocks(int step) { MPIIOSimulationObserver::writeBlocks(step); }
 
-void MPIIORestartCoProcessor::writeDataSet(int step)
+void MPIIORestartSimulationObserver::writeDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -144,7 +144,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeDataSet start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeDataSet start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -331,7 +331,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -433,7 +433,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeDataSet time: " << finish - start << " s");
     }
 
     MPI_File file_handler1;
@@ -474,7 +474,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
 }
 
-void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+void MPIIORestartSimulationObserver::write4DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -497,7 +497,7 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeAverageDensityArray start collect data to file = " << fname);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeAverageDensityArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -533,7 +533,7 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
                 ___Array = block->getKernel()->getDataSet()->getShearStressValues();
                 break;
             default:
-                UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write4DArray : 4D array type does not exist!"));
+                UB_THROW(UbException(UB_EXARGS, "MPIIORestartSimulationObserver::write4DArray : 4D array type does not exist!"));
                 break;
             }
 
@@ -562,7 +562,7 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write4DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -625,13 +625,13 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write4DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+void MPIIORestartSimulationObserver::write3DArray(int step, Arrays arrayType, std::string fname)
 {
    int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -654,7 +654,7 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start collect data to file = " << fname);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write3DArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -687,7 +687,7 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
                 ___Array = block->getKernel()->getDataSet()->getPressureField();
                 break;
             default:
-                UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write3DArray : 3D array type does not exist!"));
+                UB_THROW(UbException(UB_EXARGS, "MPIIORestartSimulationObserver::write3DArray : 3D array type does not exist!"));
                 break;
             }
 
@@ -716,7 +716,7 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write3DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -782,13 +782,13 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor ::write3DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver ::write3DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::writeBoundaryConds(int step)
+void MPIIORestartSimulationObserver::writeBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -796,7 +796,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeBoundaryConds start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeBoundaryConds start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -826,7 +826,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
     {
         for (SPtr<Block3D> block : blocksVector[level]) // all the blocks of the current level
         {
-            bcArr = block->getKernel()->getBCProcessor()->getBCArray();
+            bcArr = block->getKernel()->getBCSet()->getBCArray();
 
             bcAddArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid
             bcAddArray[ic].x2                   = block->getX2();
@@ -859,7 +859,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
                     bouCond->nx3                    = (real)bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = (real)bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBcAlgorithmType();
+                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
                 }
 
                 bcVector.push_back(*bouCond);
@@ -929,7 +929,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -986,17 +986,17 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeBoundaryConds time: " << finish - start << " s");
     }
 
     delete[] bcAddArray;
 }
 
 //------------------------------------------- READ -----------------------------------------------
-void MPIIORestartCoProcessor::restart(int step)
+void MPIIORestartSimulationObserver::restart(int step)
 {
     if (comm->isRoot())
-        UBLOG(logINFO, "MPIIORestartCoProcessor restart step: " << step);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver restart step: " << step);
     if (comm->isRoot())
         UBLOG(logINFO, "Load check point - start");
 
@@ -1010,9 +1010,9 @@ void MPIIORestartCoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - end");
 }
 
-void MPIIORestartCoProcessor::readBlocks(int step) { MPIIOCoProcessor::readBlocks(step); }
+void MPIIORestartSimulationObserver::readBlocks(int step) { MPIIOSimulationObserver::readBlocks(step); }
 
-void MPIIORestartCoProcessor::readDataSet(int step)
+void MPIIORestartSimulationObserver::readDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1020,7 +1020,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1120,8 +1120,8 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1224,7 +1224,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1270,7 +1270,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
 }
 
-void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fname)
+void MPIIORestartSimulationObserver::readArray(int step, Arrays arrType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1278,7 +1278,7 @@ void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fn
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start fname = " << fname);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray start fname = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1341,8 +1341,8 @@ void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fn
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1410,21 +1410,21 @@ void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fn
             block->getKernel()->getDataSet()->setPressureField(___3DArray);
             break;
         default:
-            UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::readArray : array type does not exist!"));
+            UB_THROW(UbException(UB_EXARGS, "MPIIORestartSimulationObserver::readArray : array type does not exist!"));
             break;
         }
     }
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::readBoundaryConds(int step)
+void MPIIORestartSimulationObserver::readBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1432,7 +1432,7 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1506,8 +1506,8 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1546,7 +1546,7 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
                 bc->nx3 = bcArray[index].nx3;
                 for (int iq = 0; iq < 26; iq++)
                     bc->setQ(bcArray[index].q[iq], iq);
-                bc->setBcAlgorithmType(bcArray[index].algorithmType);
+                bc->setBCStrategyType(bcArray[index].algorithmType);
             }
 
             bcVector.push_back(bc);
@@ -1562,14 +1562,14 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
         CbArray3D<int, IndexerX3X2X1> bcim(bcindexmatrixV, boundCondParamStr.nx1, boundCondParamStr.nx2, boundCondParamStr.nx3);
 
         SPtr<Block3D> block = grid->getBlock(bcAddArray[n].x1, bcAddArray[n].x2, bcAddArray[n].x3, bcAddArray[n].level);
-        SPtr<BCProcessor> bcProc = bcProcessor->clone(block->getKernel());
+        SPtr<BCSet> bcSetNew = bcSet->clone(block->getKernel());
         SPtr<BCArray3D> bcArr(new BCArray3D());
         bcArr->bcindexmatrix  = bcim;
         bcArr->bcvector       = bcVector;
         bcArr->indexContainer = indexContainerV;
-        bcProc->setBCArray(bcArr);
+        bcSetNew->setBCArray(bcArr);
 
-        block->getKernel()->setBCProcessor(bcProc);
+        block->getKernel()->setBCSet(bcSetNew);
     }
 
     delete nullBouCond;
@@ -1579,11 +1579,11 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
     delete[] intArray2;
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
+void MPIIORestartSimulationObserver::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::setBCProcessor(SPtr<BCProcessor> bcProcessor) { this->bcProcessor = bcProcessor; }
+void MPIIORestartSimulationObserver::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
index a4c1b32efbafbdb467eee7facede5f8d834e1a93..5681d9886e3a6f9a4b8d1cf1b8d32e9970fb8855 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
@@ -1,23 +1,23 @@
-#ifndef _MPIIORestartCoProcessor_H_
-#define _MPIIORestartCoProcessor_H_
+#ifndef _MPIIORestartSimulationObserver_H_
+#define _MPIIORestartSimulationObserver_H_
 
 #include <mpi.h>
 //#include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "MPIIODataStructures.h"
 
 class Grid3D;
 class UbScheduler;
 namespace vf::mpi {class Communicator;}
-class BCProcessor;
+class BCSet;
 class LBMKernel;
 
-//! \class MPIIORestartCoProcessor
+//! \class MPIIORestartSimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIORestartCoProcessor : public MPIIOCoProcessor
+class MPIIORestartSimulationObserver : public MPIIOSimulationObserver
 {
 public:
     enum Arrays {
@@ -32,10 +32,10 @@ public:
         PressureField = 9
     };
 
-    MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIORestartCoProcessor() override;
+    MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~MPIIORestartSimulationObserver() override;
     //! Each timestep writes the grid into the files
-    void process(real step) override;
+    void update(real step) override;
     //! Reads the grid from the files before grid reconstruction
     void restart(int step);
     //! Writes the blocks of the grid into the file cpBlocks.bin
@@ -74,8 +74,8 @@ public:
     void readBoundaryConds(int step);
     //! The function sets LBMKernel
     void setLBMKernel(SPtr<LBMKernel> kernel);
-    //! The function sets BCProcessor
-    void setBCProcessor(SPtr<BCProcessor> bcProcessor);
+    //! The function sets BCSet
+    void setBCSet(SPtr<BCSet> BCSet);
     //! The function truncates the data files
     void clearAllFiles(int step);
 
@@ -86,7 +86,7 @@ private:
 
     MPIIODataStructures::boundCondParam boundCondParamStr;
     SPtr<LBMKernel> lbmKernel;
-    SPtr<BCProcessor> bcProcessor;
+    SPtr<BCSet> bcSet;
 
     //std::vector<double> doubleValuesArrayRW;
 };
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
similarity index 95%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
index e238ec8b0f4f342fd24c39ed1e60ab2ad1d137fc..adb47a75a2fbd7fc0e8242ef9b013f6324ae066b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "Block3D.h"
 #include <mpi/Communicator.h>
 #include "CoordinateTransformation3D.h"
@@ -12,9 +12,9 @@
 
 using namespace MPIIODataStructures;
 
-MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+MPIIOSimulationObserver::MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                    std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm)
+    : SimulationObserver(grid, s), path(path), comm(comm)
 {
     UbSystem::makeDirectory(path + "/mpi_io_cp");
 
@@ -74,7 +74,7 @@ MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const
     MPI_Type_commit(&arrayPresenceType);
 }
 
-MPIIOCoProcessor::~MPIIOCoProcessor()
+MPIIOSimulationObserver::~MPIIOSimulationObserver()
 {
     MPI_Type_free(&gridParamType);
     MPI_Type_free(&block3dType);
@@ -83,7 +83,7 @@ MPIIOCoProcessor::~MPIIOCoProcessor()
     MPI_Type_free(&arrayPresenceType);
 }
 
-void MPIIOCoProcessor::writeBlocks(int step)
+void MPIIOSimulationObserver::writeBlocks(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -91,7 +91,7 @@ void MPIIOCoProcessor::writeBlocks(int step)
     size = 1;
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::writeBlocksToFile start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::writeBlocksToFile start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -187,7 +187,7 @@ void MPIIOCoProcessor::writeBlocks(int step)
     }
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::writeBlocksToFile start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::writeBlocksToFile start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -223,21 +223,21 @@ void MPIIOCoProcessor::writeBlocks(int step)
 
     if (comm->isRoot()) {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOCoProcessor::writeBlocksToFile time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOSimulationObserver::writeBlocksToFile time: " << finish - start << " s");
     }
 
     delete[] block3dArray;
     delete gridParameters;
 }
 
-void MPIIOCoProcessor::readBlocks(int step)
+void MPIIOSimulationObserver::readBlocks(int step)
 {
     int rank;
     //   int size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     //   size = 1;
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -276,8 +276,8 @@ void MPIIOCoProcessor::readBlocks(int step)
 
     if (comm->isRoot()) {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -359,13 +359,13 @@ void MPIIOCoProcessor::readBlocks(int step)
     delete[] block3dArray;
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
-void MPIIOCoProcessor::clearAllFiles(int step)
+void MPIIOSimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
@@ -480,7 +480,7 @@ void MPIIOCoProcessor::clearAllFiles(int step)
 
 }
 
-void MPIIOCoProcessor::writeCpTimeStep(int step)
+void MPIIOSimulationObserver::writeCpTimeStep(int step)
 {
     if (comm->isRoot()) {
         UbFileOutputASCII f(path + "/mpi_io_cp/cp.txt");
@@ -488,7 +488,7 @@ void MPIIOCoProcessor::writeCpTimeStep(int step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-int MPIIOCoProcessor::readCpTimeStep()
+int MPIIOSimulationObserver::readCpTimeStep()
 {
     UbFileInputASCII f(path + "/mpi_io_cp/cp.txt");
     int step = f.readInteger();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
similarity index 65%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
index 68759639d10d0032114bfc30ca0ed5d650f35a3f..c04938a71e62db4753689ad35160a7f980c0c0cb 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
@@ -1,7 +1,7 @@
-#ifndef _MPIIOCoProcessor_H_
-#define _MPIIOCoProcessor_H_
+#ifndef _MPIIOSimulationObserver_H_
+#define _MPIIOSimulationObserver_H_
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include <PointerDefinitions.h>
 #include <mpi.h>
 #include <string>
@@ -10,16 +10,16 @@ class Grid3D;
 class UbScheduler;
 namespace vf::mpi {class Communicator;}
 
-//! \class MPIWriteBlocksBECoProcessor
+//! \class MPIWriteBlocksBESimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIOCoProcessor : public CoProcessor
+class MPIIOSimulationObserver : public SimulationObserver
 {
 public:
-    MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIOCoProcessor() override;
+    MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~MPIIOSimulationObserver() override;
 
     //! Each timestep writes the grid into the files
-    void process(real step) override = 0;
+    void update(real step) override = 0;
 
     //! Writes the blocks of the grid into the file cpBlocks.bin
     void writeBlocks(int step);
@@ -40,5 +40,5 @@ protected:
     std::shared_ptr<vf::mpi::Communicator> comm;
     MPI_Datatype gridParamType, block3dType, dataSetParamType, boundCondType, arrayPresenceType;
 };
-#endif // ! _MPIIOCoProcessor_H_
-#define _MPIIOCoProcessor_H_
+#endif // ! _MPIIOSimulationObserver_H_
+#define _MPIIOSimulationObserver_H_
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
similarity index 85%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
index f1762b5fdcfa8a2d4b20ee95665a2a3329e85196..2979c841c9c07e44b5a22998897d5665c67b51dc 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
@@ -1,6 +1,6 @@
-#include "MicrophoneArrayCoProcessor.h"
+#include "MicrophoneArraySimulationObserver.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include <mpi/Communicator.h>
 #include "D3Q27System.h"
@@ -12,17 +12,17 @@
 #include "Vector3D.h"
 #include <sstream>
 
-MicrophoneArrayCoProcessor::MicrophoneArrayCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+MicrophoneArraySimulationObserver::MicrophoneArraySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                        std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm)
+    : SimulationObserver(grid, s), path(path), comm(comm)
 {
     count = 0;
     micID = 0;
 }
 
-MicrophoneArrayCoProcessor::~MicrophoneArrayCoProcessor() = default;
+MicrophoneArraySimulationObserver::~MicrophoneArraySimulationObserver() = default;
 
-void MicrophoneArrayCoProcessor::process(real step)
+void MicrophoneArraySimulationObserver::update(real step)
 {
     if (microphones.size() > 0) {
         collectData(step);
@@ -31,10 +31,10 @@ void MicrophoneArrayCoProcessor::process(real step)
             writeFile(step);
     }
 
-    UBLOG(logDEBUG3, "MicrophoneArrayCoProcessor::process:" << step);
+    UBLOG(logDEBUG3, "MicrophoneArraySimulationObserver::update:" << step);
 }
 
-bool MicrophoneArrayCoProcessor::addMicrophone(Vector3D coords)
+bool MicrophoneArraySimulationObserver::addMicrophone(Vector3D coords)
 {
     micID++;
     //   UbTupleInt3 blockIndexes = grid->getBlockIndexes(coords[0], coords[1], coords[2]);
@@ -48,7 +48,7 @@ bool MicrophoneArrayCoProcessor::addMicrophone(Vector3D coords)
         if (block) {
             SPtr<ILBMKernel> kernel = block->getKernel();
             if (kernel) {
-                SPtr<BCArray3D> bcarray = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcarray = kernel->getBCSet()->getBCArray();
                 UbTupleInt3 nodes       = grid->getNodeIndexes(block, coords[0], coords[1], coords[2]);
                 if (!bcarray->isUndefined(val<1>(nodes), val<2>(nodes), val<3>(nodes))) {
 
@@ -89,7 +89,7 @@ bool MicrophoneArrayCoProcessor::addMicrophone(Vector3D coords)
     return false;
 }
 
-void MicrophoneArrayCoProcessor::collectData(real step)
+void MicrophoneArraySimulationObserver::collectData(real step)
 {
     for (std::size_t i = 0; i < microphones.size(); i++) {
         real f[D3Q27System::ENDF + 1];
@@ -102,7 +102,7 @@ void MicrophoneArrayCoProcessor::collectData(real step)
     }
 }
 
-void MicrophoneArrayCoProcessor::writeFile(real /*step*/)
+void MicrophoneArraySimulationObserver::writeFile(real /*step*/)
 {
     for (std::size_t i = 0; i < microphones.size(); i++) {
         std::string fname = path + "/mic/mic_" + UbSystem::toString(microphones[i]->id) + ".csv";
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
similarity index 72%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
index 140ac5a48405adb96b64941144a13fa6790a9e8c..e87954fa2902df3c27833729869a70abac348508 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
@@ -1,7 +1,7 @@
-#ifndef MicrophoneArrayCoProcessor_h__
-#define MicrophoneArrayCoProcessor_h__
+#ifndef MicrophoneArraySimulationObserver_h__
+#define MicrophoneArraySimulationObserver_h__
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 #include <array>
@@ -19,15 +19,15 @@ class DistributionArray3D;
 //! \author    Konstantin Kutscher
 //! \date      February 2019
 
-class MicrophoneArrayCoProcessor : public CoProcessor
+class MicrophoneArraySimulationObserver : public SimulationObserver
 {
 public:
-    MicrophoneArrayCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    MicrophoneArraySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MicrophoneArrayCoProcessor() override;
+    ~MicrophoneArraySimulationObserver() override;
 
     //! calls collectData.
-    void process(real step) override;
+    void update(real step) override;
 
     //! add microphone
     bool addMicrophone(Vector3D coords);
@@ -56,4 +56,4 @@ private:
     CalcMacrosFct calcMacros;
 };
 
-#endif // MicrophoneArrayCoProcessor_h__
+#endif // MicrophoneArraySimulationObserver_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
similarity index 86%
rename from src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
index af8cf408369454127a1fd246cf19f2e9fecefc96..3bd0bd6f888e64da0db8f492c872c4b15a518b4a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
@@ -26,20 +26,20 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NUPSCounterCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file NUPSCounterSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "NUPSCounterCoProcessor.h"
+#include "NUPSCounterSimulationObserver.h"
 
 #include <mpi/Communicator.h>
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
-NUPSCounterCoProcessor::NUPSCounterCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads,
+NUPSCounterSimulationObserver::NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads,
                                                std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), numOfThreads(numOfThreads), nup(0), nup_t(0), nupsStep(0.0), comm(comm)
+    : SimulationObserver(grid, s), numOfThreads(numOfThreads), nup(0), nup_t(0), nupsStep(0.0), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         timer.resetAndStart();
@@ -59,15 +59,15 @@ NUPSCounterCoProcessor::NUPSCounterCoProcessor(SPtr<Grid3D> grid, SPtr<UbSchedul
     }
 }
 //////////////////////////////////////////////////////////////////////////
-NUPSCounterCoProcessor::~NUPSCounterCoProcessor() = default;
+NUPSCounterSimulationObserver::~NUPSCounterSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void NUPSCounterCoProcessor::process(real step)
+void NUPSCounterSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void NUPSCounterCoProcessor::collectData(real step)
+void NUPSCounterSimulationObserver::collectData(real step)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         real time   = timer.stop();
@@ -76,7 +76,7 @@ void NUPSCounterCoProcessor::collectData(real step)
         real tnups  = nups / (real)numOfThreads;
         UBLOG(logINFO, "Calculation step = " << step);
         UBLOG(logINFO, "Total performance = " << nups_t << " NUPS");
-        UBLOG(logINFO, "Performance per process = " << nups << " NUPS");
+        UBLOG(logINFO, "Performance per update = " << nups << " NUPS");
         UBLOG(logINFO, "Performance per thread = " << tnups << " NUPS");
         UBLOG(logINFO, "Time for " << step - nupsStep << " steps = " << time << " s");
         nupsStep = step;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
similarity index 82%
rename from src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
index b178c97fe25647c7bec60883811a3263abc046bc..fdce1c4d67519b6d0a109e3cbd13e23b69d0fb19 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
@@ -26,38 +26,38 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NUPSCounterCoProcessor.h
-//! \ingroup CoProcessors
+//! \file NUPSCounterSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef NUPSCOUNTERCoProcessor_H_
-#define NUPSCOUNTERCoProcessor_H_
+#ifndef NUPSCOUNTERSimulationObserver_H_
+#define NUPSCOUNTERSimulationObserver_H_
 
 #include <PointerDefinitions.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "basics/utilities/UbTiming.h"
 
 namespace vf::mpi {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
-//! \class NUPSCounterCoProcessor
+//! \class NUPSCounterSimulationObserver
 //! \brief A class calculates Nodal Updates Per Second (NUPS)
-class NUPSCounterCoProcessor : public CoProcessor
+class NUPSCounterSimulationObserver : public SimulationObserver
 {
 public:
-    //! \brief Construct NUPSCounterCoProcessor object for grid object and scheduler object.
+    //! \brief Construct NUPSCounterSimulationObserver object for grid object and scheduler object.
     //! \pre The Grid3D and UbScheduler objects must exist.
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \param numOfThreads is number of threads
     //! \param comm is Communicator object
-    NUPSCounterCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~NUPSCounterCoProcessor() override;
+    NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~NUPSCounterSimulationObserver() override;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Collect data for calculation of NUPS
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
index 4197c5cfe7e9d8f0f9da618ff58f4b421ae3d4fa..7c9cd4b85e1404339b2c180bef93eafedff38c23 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
@@ -1,8 +1,8 @@
-#include "PressureCoefficientCoProcessor.h"
+#include "PressureCoefficientSimulationObserver.h"
 #include <WbWriterVtkXmlASCII.h>
 
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include <mpi/Communicator.h>
 #include "D3Q27Interactor.h"
@@ -12,26 +12,26 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-PressureCoefficientCoProcessor::PressureCoefficientCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+PressureCoefficientSimulationObserver::PressureCoefficientSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                GbCuboid3DPtr plane, const std::string &path,
                                                                std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), plane(plane), path(path), comm(comm)
+    : SimulationObserver(grid, s), plane(plane), path(path), comm(comm)
 {
     maxStep       = scheduler->getMaxEnd();
     numberOfSteps = int(maxStep - scheduler->getMinBegin());
 }
 //////////////////////////////////////////////////////////////////////////
-PressureCoefficientCoProcessor::~PressureCoefficientCoProcessor() = default;
+PressureCoefficientSimulationObserver::~PressureCoefficientSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::process(real step)
+void PressureCoefficientSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::collectData(real step)
+void PressureCoefficientSimulationObserver::collectData(real step)
 {
     calculateRho();
 
@@ -40,7 +40,7 @@ void PressureCoefficientCoProcessor::collectData(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::calculateRho()
+void PressureCoefficientSimulationObserver::calculateRho()
 {
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
@@ -54,7 +54,7 @@ void PressureCoefficientCoProcessor::calculateRho()
             std::set<std::vector<int>> &bcNodeIndicesSet = t.second;
 
             SPtr<ILBMKernel> kernel                 = block->getKernel();
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
 
             UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
@@ -120,7 +120,7 @@ void PressureCoefficientCoProcessor::calculateRho()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::writeValues(int step)
+void PressureCoefficientSimulationObserver::writeValues(int step)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         datanames.resize(0);
@@ -176,10 +176,10 @@ void PressureCoefficientCoProcessor::writeValues(int step)
 
         out.close();
 
-        UBLOG(logINFO, "PressureCoefficientCoProcessor::writeValues() step: " << (int)step);
+        UBLOG(logINFO, "PressureCoefficientSimulationObserver::writeValues() step: " << (int)step);
     }
 }
-void PressureCoefficientCoProcessor::readValues(int step)
+void PressureCoefficientSimulationObserver::readValues(int step)
 {
     if (comm->isRoot()) {
         std::string fname = path + UbSystem::toString(step) + ".bin";
@@ -199,11 +199,11 @@ void PressureCoefficientCoProcessor::readValues(int step)
 
         in.close();
 
-        UBLOG(logINFO, "PressureCoefficientCoProcessor::readValues() step: " << (int)step);
+        UBLOG(logINFO, "PressureCoefficientSimulationObserver::readValues() step: " << (int)step);
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::addInteractor(SPtr<D3Q27Interactor> interactor)
+void PressureCoefficientSimulationObserver::addInteractor(SPtr<D3Q27Interactor> interactor)
 {
     interactors.push_back(interactor);
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
similarity index 69%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
index 26b8117aea007671bc1d6b17104f015cd62ddda3..bfb56a65dd31fd6f434462471c6a236340b05db0 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef PressureCoefficientCoProcessor_h__
-#define PressureCoefficientCoProcessor_h__
+#ifndef PressureCoefficientSimulationObserver_h__
+#define PressureCoefficientSimulationObserver_h__
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -15,14 +15,14 @@ namespace vf::mpi {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
-class PressureCoefficientCoProcessor : public CoProcessor
+class PressureCoefficientSimulationObserver : public SimulationObserver
 {
 public:
-    PressureCoefficientCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbCuboid3D> plane,
+    PressureCoefficientSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbCuboid3D> plane,
                                    const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~PressureCoefficientCoProcessor() override;
+    ~PressureCoefficientSimulationObserver() override;
 
-    void process(real step) override;
+    void update(real step) override;
 
     void addInteractor(SPtr<D3Q27Interactor> interactor);
     void readValues(int step);
@@ -50,4 +50,4 @@ private:
     CalcMacrosFct calcMacros;
 };
 
-#endif // PressureDistributionCoProcessor_h__
+#endif // PressureDistributionSimulationObserver_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
index a486da249e5c2ce2eeaaf53fa4601d39bda689b0..9b3c63f407b9fac00de6177a369fec2cb3e74a82 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
@@ -1,11 +1,11 @@
 /*
- * D3Q27RhoCoProcessor.cpp
+ * D3Q27RhoSimulationObserver.cpp
  *
  *  Created on: 28.12.2010
  *      Author: kucher
  */
 
-#include "PressureDifferenceCoProcessor.h"
+#include "PressureDifferenceSimulationObserver.h"
 
 #include <fstream>
 
@@ -15,12 +15,12 @@
 #include "LBMUnitConverter.h"
 #include "UbScheduler.h"
 
-PressureDifferenceCoProcessor::PressureDifferenceCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+PressureDifferenceSimulationObserver::PressureDifferenceSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                              const std::string &path, SPtr<IntegrateValuesHelper> h1,
                                                              SPtr<IntegrateValuesHelper> h2, real rhoReal,
                                                              real uReal, real uLB, std::shared_ptr<vf::mpi::Communicator> comm)
 
-    : CoProcessor(grid, s), path(path), h1(h1), h2(h2), comm(comm)
+    : SimulationObserver(grid, s), path(path), h1(h1), h2(h2), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         std::ofstream ostr;
@@ -69,15 +69,15 @@ PressureDifferenceCoProcessor::PressureDifferenceCoProcessor(SPtr<Grid3D> grid,
     }
 }
 //////////////////////////////////////////////////////////////////////////
-PressureDifferenceCoProcessor::~PressureDifferenceCoProcessor() = default;
+PressureDifferenceSimulationObserver::~PressureDifferenceSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void PressureDifferenceCoProcessor::process(real step)
+void PressureDifferenceSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureDifferenceCoProcessor::collectData(real step)
+void PressureDifferenceSimulationObserver::collectData(real step)
 {
     h1->calculateMQ();
     h2->calculateMQ();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
similarity index 67%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
index 09523552289297b78fb59b66e86e7ba84e1ed00b..35356d25f9fa941500188fc75850d1bb7c8f86fb 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
@@ -1,17 +1,17 @@
 /*
- *  D3Q27PressureDifferenceCoProcessor.h
+ *  D3Q27PressureDifferenceSimulationObserver.h
  *
  *  Created on: 28.12.2010
  *  Author: kucher
  */
 
-#ifndef D3Q27PRESSUREDIFFERENCECoProcessor_H
-#define D3Q27PRESSUREDIFFERENCECoProcessor_H
+#ifndef D3Q27PRESSUREDIFFERENCESimulationObserver_H
+#define D3Q27PRESSUREDIFFERENCESimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 
 namespace vf::mpi {class Communicator;}
@@ -20,16 +20,16 @@ class UbScheduler;
 class LBMUnitConverter;
 class IntegrateValuesHelper;
 
-class PressureDifferenceCoProcessor : public CoProcessor
+class PressureDifferenceSimulationObserver : public SimulationObserver
 {
 public:
-    PressureDifferenceCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    PressureDifferenceSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                   SPtr<IntegrateValuesHelper> h1, SPtr<IntegrateValuesHelper> h2, real rhoReal,
                                   real uReal, real uLB,
                                   /*const SPtr<LBMUnitConverter> conv,*/ std::shared_ptr<vf::mpi::Communicator> comm);
-    ~PressureDifferenceCoProcessor() override;
+    ~PressureDifferenceSimulationObserver() override;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     SPtr<IntegrateValuesHelper> h1, h2;
@@ -43,4 +43,4 @@ protected:
                      //uReal in SI
 };
 
-#endif /* D3Q27RHODIFFERENCECoProcessor_H_ */
+#endif /* D3Q27RHODIFFERENCESimulationObserver_H_ */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
similarity index 91%
rename from src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
index 4e62a1c6bbb4c9f9a74968170c5821cc0f46fd23..010d9ff664e22519ceb169c549ecc05307655ed4 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
@@ -1,5 +1,5 @@
-#include "QCriterionCoProcessor.h"
-#include "BCProcessor.h"
+#include "QCriterionSimulationObserver.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
@@ -10,14 +10,14 @@
 #include <mpi/Communicator.h>
 #include "UbScheduler.h"
 
-QCriterionCoProcessor::QCriterionCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+QCriterionSimulationObserver::QCriterionSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                              SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm), writer(writer)
+    : SimulationObserver(grid, s), path(path), comm(comm), writer(writer)
 {
     init();
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::init()
+void QCriterionSimulationObserver::init()
 {
     gridRank     = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -28,19 +28,19 @@ void QCriterionCoProcessor::init()
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         grid->getBlocks(
             level, gridRank, true,
-            blockVector[level]); // grid: private variable in CoProcessor. Initialized by filling with blocks
+            blockVector[level]); // grid: private variable in SimulationObserver. Initialized by filling with blocks
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::process(real step)
+void QCriterionSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "QCriterionCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "QCriterionSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::collectData(real step)
+void QCriterionSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -59,7 +59,7 @@ void QCriterionCoProcessor::collectData(real step)
 
     std::vector<std::string> cellDataNames;
 
-    // distributed writing as in MacroscopicValuesCoProcessor.cpp
+    // distributed writing as in MacroscopicValuesSimulationObserver.cpp
     std::vector<std::string> pieces = comm->gather(piece); // comm: MPI-Wrapper
     if (comm->getProcessID() == comm->getRoot()) {
         std::string pname = WbWriterVtkXmlASCII::getInstance()->writeParallelFile(
@@ -67,19 +67,19 @@ void QCriterionCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(pname);
-        if (step == CoProcessor::scheduler->getMinBegin()) // first time in timeseries
+        if (step == SimulationObserver::scheduler->getMinBegin()) // first time in timeseries
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(path + "_collection", filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(path + "_collection", filenames, istep, false);
         }
-        UBLOG(logINFO, "QCriterionCoProcessor step: " << istep);
+        UBLOG(logINFO, "QCriterionSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::clearData()
+void QCriterionSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -87,7 +87,7 @@ void QCriterionCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::addData(const SPtr<Block3D> block)
+void QCriterionSimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //	UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -101,7 +101,7 @@ void QCriterionCoProcessor::addData(const SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
 
     int minX1 = 0;
@@ -200,11 +200,11 @@ void QCriterionCoProcessor::addData(const SPtr<Block3D> block)
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz, int ix1, int ix2, int ix3,
+void QCriterionSimulationObserver::getNeighborVelocities(int offx, int offy, int offz, int ix1, int ix2, int ix3,
                                                   const SPtr<Block3D> block, real *vE, real *vW)
 {
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
 
     bool compressible = block->getKernel()->getCompressible();
@@ -217,7 +217,7 @@ void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz,
     int maxX2 = (int)(distributions->getNX2());
     int maxX3 = (int)(distributions->getNX3());
     if (maxX1 < 3)
-        throw UbException(UB_EXARGS, "QCriterionCoProcessor: NX1 too small for FD stencils!");
+        throw UbException(UB_EXARGS, "QCriterionSimulationObserver: NX1 too small for FD stencils!");
     maxX1 -= 2;
     maxX2 -= 2;
     maxX3 -= 2;
@@ -280,7 +280,7 @@ void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz,
 
         if (!checkInterpolation || neighNodeIsBC) {
             SPtr<ILBMKernel> kernelW                 = blockNeighW->getKernel();
-            SPtr<BCArray3D> bcArrayW                 = kernelW->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArrayW                 = kernelW->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributionsW = kernelW->getDataSet()->getFdistributions();
             real fW2[27];
             real fW[27];
@@ -312,7 +312,7 @@ void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz,
             // throw UbException(UB_EXARGS,"Parallel or Non-Uniform Simulation -- not yet implemented");
         } else {
             SPtr<ILBMKernel> kernelW                 = blockNeighW->getKernel();
-            SPtr<BCArray3D> bcArrayW                 = kernelW->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArrayW                 = kernelW->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributionsW = kernelW->getDataSet()->getFdistributions();
             real fW[27];
 
@@ -343,7 +343,7 @@ void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz,
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-void QCriterionCoProcessor::computeVelocity(real *f, real *v, bool compressible)
+void QCriterionSimulationObserver::computeVelocity(real *f, real *v, bool compressible)
 {
     //////////////////////////////////////////////////////////////////////////
     // compute x,y,z-velocity components from distribution
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
index 38cd47fb890ffc79bb3f43ecc17bbe42885fa114..1d5aec23f9d4af9d9e232dd215fbde060a7c6f7c 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
@@ -1,15 +1,15 @@
-//! \file QCriterionCoProcessor.h
+//! \file QCriterionSimulationObserver.h
 //!  \brief Created on: 25.08.2013
 //!  \author: Sonja Uphoff
 
-#ifndef QCriterionCoProcessor_H
-#define QCriterionCoProcessor_H
+#ifndef QCriterionSimulationObserver_H
+#define QCriterionSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -25,13 +25,13 @@ class Block3D;
 //!			 Q-Criterion: Visualize Vorteces as regions where Vorticity is larger than strain rate (Hunt, 1988)
 //! \author  Sonja Uphoff
 
-class QCriterionCoProcessor : public CoProcessor
+class QCriterionSimulationObserver : public SimulationObserver
 {
 public:
-    QCriterionCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
+    QCriterionSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
                           std::shared_ptr<vf::mpi::Communicator> comm);
     //! Make update if timestep is write-timestep specified in SPtr<UbScheduler> s
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Prepare data and write in .vtk file
@@ -50,7 +50,7 @@ private:
     void init();
     std::vector<UbTupleFloat3> nodes;
     std::vector<UbTupleUInt8> cells;
-    std::vector<std::string> datanames; // only one entry for QKrit-CoProcessor: Q
+    std::vector<std::string> datanames; // only one entry for QKrit-SimulationObserver: Q
     std::vector<std::vector<real>> data;
     std::vector<std::vector<SPtr<Block3D>>> blockVector;
     int minInitLevel; // go through all levels for block vector of current process from minInitLevel to maxInitLevel
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
similarity index 96%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
index cd1f9c54cb50585b572a61cdc7d8c884386b864c..92c8f5f60344019cff472851104b86e5838302a8 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
@@ -1,5 +1,5 @@
-#include "ShearStressCoProcessor.h"
-#include "BCProcessor.h"
+#include "ShearStressSimulationObserver.h"
+#include "BCSet.h"
 #include "WbWriterVtkXmlASCII.h"
 
 #include "BCArray3D.h"
@@ -12,9 +12,9 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-ShearStressCoProcessor::ShearStressCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+ShearStressSimulationObserver::ShearStressSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                                SPtr<UbScheduler> s, SPtr<UbScheduler> rs)
-    : CoProcessor(grid, s), Resetscheduler(rs), path(path), writer(writer)
+    : SimulationObserver(grid, s), Resetscheduler(rs), path(path), writer(writer)
 {
     std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
     normals.push_back(0);
@@ -36,9 +36,9 @@ ShearStressCoProcessor::ShearStressCoProcessor(SPtr<Grid3D> grid, const std::str
     }
 }
 //////////////////////////////////////////////////////////////////////////
-ShearStressCoProcessor::~ShearStressCoProcessor() = default;
+ShearStressSimulationObserver::~ShearStressSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::process(real step)
+void ShearStressSimulationObserver::update(real step)
 {
     if (step == 0) {
         initDistance();
@@ -46,10 +46,10 @@ void ShearStressCoProcessor::process(real step)
     calculateShearStress(step);
     if (scheduler->isDue(step))
         collectData(step);
-    UBLOG(logDEBUG3, "D3Q27ShearStressCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "D3Q27ShearStressSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::collectData(real step)
+void ShearStressSimulationObserver::collectData(real step)
 {
     using namespace std;
 
@@ -71,7 +71,7 @@ void ShearStressCoProcessor::collectData(real step)
 
     //   vector<string> filenames;
     //   filenames.push_back(pname);
-    //   if (step == CoProcessor::scheduler->getMinBegin())
+    //   if (step == SimulationObserver::scheduler->getMinBegin())
     //   {
     //      WbWriterVtkXmlASCII::getInstance()->writeCollection(path+"__Shear_collection",filenames,istep,false);
     //   }
@@ -79,7 +79,7 @@ void ShearStressCoProcessor::collectData(real step)
     //   {
     //      WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(path+"__Shear_collection",filenames,istep,false);
     //   }
-    //   UBLOG(logINFO,"D3Q27ShearStressCoProcessor step: " << istep);
+    //   UBLOG(logINFO,"D3Q27ShearStressSimulationObserver step: " << istep);
     //}
 
     string pfilePath, partPath, subfolder, cfilePath;
@@ -104,25 +104,25 @@ void ShearStressCoProcessor::collectData(real step)
 
         vector<string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "D3Q27ShearStressCoProcessor step: " << istep);
+        UBLOG(logINFO, "D3Q27ShearStressSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::clearData()
+void ShearStressSimulationObserver::clearData()
 {
     nodes.clear();
     datanames.clear();
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::calculateShearStress(real timeStep)
+void ShearStressSimulationObserver::calculateShearStress(real timeStep)
 {
     using namespace vf::lbm::dir;
     using namespace D3Q27System;
@@ -137,7 +137,7 @@ void ShearStressCoProcessor::calculateShearStress(real timeStep)
             std::set<std::vector<int>> &transNodeIndicesSet = t.second;
 
             SPtr<ILBMKernel> kernel                 = block->getKernel();
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
             SPtr<ShearStressValuesArray3D> ssv      = kernel->getDataSet()->getShearStressValues();
 
@@ -231,7 +231,7 @@ void ShearStressCoProcessor::calculateShearStress(real timeStep)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::addData()
+void ShearStressSimulationObserver::addData()
 {
     // Diese Daten werden geschrieben:
     datanames.resize(0);
@@ -253,7 +253,7 @@ void ShearStressCoProcessor::addData()
             real dx                 = grid->getDeltaX(block);
 
             SPtr<ILBMKernel> kernel                 = block->getKernel();
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
             SPtr<ShearStressValuesArray3D> ssv      = kernel->getDataSet()->getShearStressValues();
 
@@ -345,15 +345,15 @@ void ShearStressCoProcessor::addData()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::reset(real step)
+void ShearStressSimulationObserver::reset(real step)
 {
     if (Resetscheduler->isDue(step))
         resetData(step);
 
-    UBLOG(logDEBUG3, "resetCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "resetSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::resetData(real /*step*/)
+void ShearStressSimulationObserver::resetData(real /*step*/)
 {
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         for (const auto &block : blockVector[level]) {
@@ -364,7 +364,7 @@ void ShearStressCoProcessor::resetData(real /*step*/)
                 //            double         dx           = grid->getDeltaX(block);
 
                 SPtr<ILBMKernel> kernel                 = block->getKernel();
-                SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                 SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                 SPtr<ShearStressValuesArray3D> ssv      = kernel->getDataSet()->getShearStressValues();
 
@@ -403,9 +403,9 @@ void ShearStressCoProcessor::resetData(real /*step*/)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
+void ShearStressSimulationObserver::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> grid, SPtr<Block3D> block, real &A,
+void ShearStressSimulationObserver::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> grid, SPtr<Block3D> block, real &A,
                                        real &B, real &C, real &D, real &ii)
 {
     using namespace vf::lbm::dir;
@@ -417,7 +417,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
     real dx                               = grid->getDeltaX(block);
     SPtr<ILBMKernel> kernel                 = block->getKernel();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     bcPtr                                   = bcArray->getBC(ix1, ix2, ix3);
     int x, y, z;
 
@@ -823,7 +823,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////
-bool ShearStressCoProcessor::checkUndefindedNodes(SPtr<BCArray3D> bcArray, int ix1, int ix2, int ix3)
+bool ShearStressSimulationObserver::checkUndefindedNodes(SPtr<BCArray3D> bcArray, int ix1, int ix2, int ix3)
 {
     for (int i = ix1; i <= ix1 + 1; i++) {
         for (int j = ix2; j <= ix2 + 1; j++) {
@@ -836,7 +836,7 @@ bool ShearStressCoProcessor::checkUndefindedNodes(SPtr<BCArray3D> bcArray, int i
     return false;
 }
 //////////////////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::initDistance()
+void ShearStressSimulationObserver::initDistance()
 {
     using namespace vf::lbm::dir;
 
@@ -852,7 +852,7 @@ void ShearStressCoProcessor::initDistance()
             //         double         dx           = grid->getDeltaX(block);
 
             SPtr<ILBMKernel> kernel                 = block->getKernel();
-            SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+            SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
             SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
             SPtr<ShearStressValuesArray3D> ssv      = kernel->getDataSet()->getShearStressValues();
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.h
similarity index 82%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.h
index 73fd42d6485321a26e11b2cf0b4b2a521a0881fd..66a76356d5a1fe8d7b096e3db0e1452dca8d613f 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.h
@@ -1,5 +1,5 @@
-#ifndef D3Q27ShearStressCoProcessor_H
-#define D3Q27ShearStressCoProcessor_H
+#ifndef D3Q27ShearStressSimulationObserver_H
+#define D3Q27ShearStressSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
@@ -7,7 +7,7 @@
 
 #include <basics/utilities/UbTuple.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 class Block3D;
 class Grid3D;
@@ -21,17 +21,17 @@ class WbWriter;
 //!          Take root to obtain  during post processing (paraview).
 //! \author  K. Kucher, S. Uphoff, M. Geier, E. Goraki Fard
 
-class ShearStressCoProcessor : public CoProcessor
+class ShearStressSimulationObserver : public SimulationObserver
 {
 public:
     //! Default constructor
-    ShearStressCoProcessor() = default;
+    ShearStressSimulationObserver() = default;
     //! Constructor
-    ShearStressCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
+    ShearStressSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
                            SPtr<UbScheduler> rs);
-    ~ShearStressCoProcessor() override;
+    ~ShearStressSimulationObserver() override;
 
-    void process(real step) override;
+    void update(real step) override;
 
     void addInteractor(SPtr<D3Q27Interactor> interactor);
 
@@ -82,4 +82,4 @@ private:
     };
 };
 
-#endif /* D3Q27ShearStressCoProcessor_H */
+#endif /* D3Q27ShearStressSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.cpp
index 6572ac8b5c6a21eb29c773f0da8bcd1d4fa2e286..cef156e5689ee19f99c756771341a81a46357323 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.cpp
@@ -26,18 +26,18 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file CoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file SimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
-CoProcessor::CoProcessor() = default;
+SimulationObserver::SimulationObserver() = default;
 
-CoProcessor::CoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : grid(grid), scheduler(s) {}
+SimulationObserver::SimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : grid(grid), scheduler(s) {}
 
-CoProcessor::~CoProcessor() = default;
+SimulationObserver::~SimulationObserver() = default;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.h
similarity index 82%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.h
index 7aae7505b02ed9248a31b2a009cdc75f09ecd73a..f0c8e0e2c6428c4093f5a94204851988af38a5cd 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.h
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file CoProcessor.h
-//! \ingroup CoProcessors
+//! \file SimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef CoProcessor_H
-#define CoProcessor_H
+#ifndef SimulationObserver_H
+#define SimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include "lbm/constants/D3Q27.h"
@@ -40,26 +40,26 @@
 class Grid3D;
 class UbScheduler;
 
-//! \class CoProcessor
+//! \class SimulationObserver
 //! \brief An abstract class implements observer design pettern
-class CoProcessor
+class SimulationObserver
 {
 public:
     //! Class default constructor
-    CoProcessor();
-    //! \brief Construct CoProcessor object for grid object and scheduler object.
+    SimulationObserver();
+    //! \brief Construct SimulationObserver object for grid object and scheduler object.
     //! \pre The Grid3D and UbScheduler objects must exist.
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \details
-    //! Class CoProcessor implements the observer design pettern. CoProcessor object is observer.  Grid3D object is
+    //! Class SimulationObserver implements the observer design pettern. SimulationObserver object is observer.  Grid3D object is
     //! observable.
-    CoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
+    SimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
     //! Class destructor
-    virtual ~CoProcessor();
+    virtual ~SimulationObserver();
     //! \brief Updates observer
     //! \param step is the actual time step
-    virtual void process(real step) = 0;
+    virtual void update(real step) = 0;
 
 protected:
     SPtr<Grid3D> grid;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
similarity index 95%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
index 8fa95c121ee61f419d778a636cacbb129ecdfe9e..ebd65f625600a1c68f48d00c33a79976ea6d1a5a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
@@ -1,6 +1,6 @@
-#include "TimeAveragedValuesCoProcessor.h"
+#include "TimeAveragedValuesSimulationObserver.h"
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 
 #include "Block3D.h"
@@ -12,31 +12,31 @@
 
 #include "BCArray3D.h"
 
-TimeAveragedValuesCoProcessor::TimeAveragedValuesCoProcessor() = default;
+TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-TimeAveragedValuesCoProcessor::TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path,
+TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                              WbWriter *const writer, SPtr<UbScheduler> s,
                                                              std::shared_ptr<vf::mpi::Communicator> comm, int options)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm), options(options)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm), options(options)
 {
     init();
     planarAveraging = false;
     timeAveraging   = true;
 }
 //////////////////////////////////////////////////////////////////////////
-TimeAveragedValuesCoProcessor::TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path,
+TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                              WbWriter *const writer, SPtr<UbScheduler> s,
                                                              std::shared_ptr<vf::mpi::Communicator> comm, int options,
                                                              std::vector<int> levels, std::vector<real> &levelCoords,
                                                              std::vector<real> &bounds, bool timeAveraging)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm), options(options), levels(levels),
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm), options(options), levels(levels),
       levelCoords(levelCoords), bounds(bounds), timeAveraging(timeAveraging)
 {
     init();
     planarAveraging = true;
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::init()
+void TimeAveragedValuesSimulationObserver::init()
 {
     root         = comm->isRoot();
     gridRank     = grid->getRank();
@@ -75,7 +75,7 @@ void TimeAveragedValuesCoProcessor::init()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::initData()
+void TimeAveragedValuesSimulationObserver::initData()
 {
     blockVector.clear();
     blockVector.resize(maxInitLevel + 1);
@@ -116,7 +116,7 @@ void TimeAveragedValuesCoProcessor::initData()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::process(real step)
+void TimeAveragedValuesSimulationObserver::update(real step)
 {
     if (step == minStep) {
         initData();
@@ -146,10 +146,10 @@ void TimeAveragedValuesCoProcessor::process(real step)
         }
     }
 
-    UBLOG(logDEBUG3, "AverageValuesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "AverageValuesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::collectData(real step)
+void TimeAveragedValuesSimulationObserver::collectData(real step)
 {
     int istep = int(step);
 
@@ -176,13 +176,13 @@ void TimeAveragedValuesCoProcessor::collectData(real step)
     if (root) {
         std::string pname =
             WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames);
-        UBLOG(logINFO, "TimeAveragedValuesCoProcessor::collectData() step: " << istep);
+        UBLOG(logINFO, "TimeAveragedValuesSimulationObserver::collectData() step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::clearData()
+void TimeAveragedValuesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -190,7 +190,7 @@ void TimeAveragedValuesCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::addData(const SPtr<Block3D> block)
+void TimeAveragedValuesSimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //   UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -244,7 +244,7 @@ void TimeAveragedValuesCoProcessor::addData(const SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     SPtr<AverageValuesArray3D> ar           = kernel->getDataSet()->getAverageDensity();
     SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageVelocity();
@@ -352,7 +352,7 @@ void TimeAveragedValuesCoProcessor::addData(const SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::calculateAverageValues(real timeSteps)
+void TimeAveragedValuesSimulationObserver::calculateAverageValues(real timeSteps)
 {
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         int i;
@@ -365,7 +365,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(real timeSteps)
             SPtr<Block3D> block = blockVector[level][i];
             if (block) {
                 SPtr<ILBMKernel> kernel                 = block->getKernel();
-                SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                 SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                 SPtr<AverageValuesArray3D> ar           = kernel->getDataSet()->getAverageDensity();
                 SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageVelocity();
@@ -463,7 +463,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(real timeSteps)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::calculateSubtotal(real step)
+void TimeAveragedValuesSimulationObserver::calculateSubtotal(real step)
 {
     if (scheduler->isDue(step)) {
 
@@ -487,7 +487,7 @@ void TimeAveragedValuesCoProcessor::calculateSubtotal(real step)
                     SPtr<Block3D> block = blockVector[level][i];
                     if (block) {
                         SPtr<ILBMKernel> kernel                 = block->getKernel();
-                        SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                        SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                         SPtr<AverageValuesArray3D> ar           = kernel->getDataSet()->getAverageDensity();
                         SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageVelocity();
@@ -574,7 +574,7 @@ void TimeAveragedValuesCoProcessor::calculateSubtotal(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::planarAverage(real step)
+void TimeAveragedValuesSimulationObserver::planarAverage(real step)
 {
     std::ofstream ostr;
 
@@ -692,11 +692,11 @@ void TimeAveragedValuesCoProcessor::planarAverage(real step)
 
     if (root) {
         ostr.close();
-        UBLOG(logINFO, "TimeAveragedValuesCoProcessor::planarAverage() step: " << (int)step);
+        UBLOG(logINFO, "TimeAveragedValuesSimulationObserver::planarAverage() step: " << (int)step);
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::reset()
+void TimeAveragedValuesSimulationObserver::reset()
 {
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         for (SPtr<Block3D> block : blockVector[level]) {
@@ -725,7 +725,7 @@ void TimeAveragedValuesCoProcessor::reset()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::setWithGhostLayer(bool val)
+void TimeAveragedValuesSimulationObserver::setWithGhostLayer(bool val)
 {
     withGhostLayer = val;
 
@@ -736,9 +736,9 @@ void TimeAveragedValuesCoProcessor::setWithGhostLayer(bool val)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-bool TimeAveragedValuesCoProcessor::getWithGhostLayer() { return withGhostLayer; }
+bool TimeAveragedValuesSimulationObserver::getWithGhostLayer() { return withGhostLayer; }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::calculateAverageValuesForPlane(
+void TimeAveragedValuesSimulationObserver::calculateAverageValuesForPlane(
     std::vector<IntegrateValuesHelper::CalcNodes> &cnodes)
 {
     saVx = 0;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
similarity index 89%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
index 72a0f6fe16ef3805ff496ccff924b8ecf541bfef..14a1f6354aa57ca588361299caf7a1d336001f9e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef TimeAveragedValuesCoProcessor_H
-#define TimeAveragedValuesCoProcessor_H
+#ifndef TimeAveragedValuesSimulationObserver_H
+#define TimeAveragedValuesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "IntegrateValuesHelper.h"
 #include "LBMSystem.h"
 
@@ -24,7 +24,7 @@ class Block3D;
 //! \author  Konstantin Kutscher
 // \f$ u_{mean}=\frac{1}{N}\sum\limits_{i=1}^n u_{i} \f$
 
-class TimeAveragedValuesCoProcessor : public CoProcessor
+class TimeAveragedValuesSimulationObserver : public SimulationObserver
 {
 public:
     enum Options {
@@ -39,15 +39,15 @@ public:
     };
 
 public:
-    TimeAveragedValuesCoProcessor();
-    TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+    TimeAveragedValuesSimulationObserver();
+    TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                   SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm, int options);
-    TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+    TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                   SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm, int options, std::vector<int> levels,
                                   std::vector<real> &levelCoords, std::vector<real> &bounds,
                                   bool timeAveraging = true);
     //! Make update
-    void process(real step) override;
+    void update(real step) override;
     //! Computes subtotal of velocity , fluctuations and triple correlations
     void calculateSubtotal(real step);
     void addLevelCoordinate(real c);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cedf228b665fff58a777f01aee8832c0e8e1cec4
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp
@@ -0,0 +1,22 @@
+#include "TimeDependentBCSimulationObserver.h"
+
+#include "Grid3D.h"
+#include "Interactor3D.h"
+#include "UbScheduler.h"
+
+TimeDependentBCSimulationObserver::TimeDependentBCSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : SimulationObserver(grid, s) {}
+//////////////////////////////////////////////////////////////////////////
+TimeDependentBCSimulationObserver::~TimeDependentBCSimulationObserver() = default;
+//////////////////////////////////////////////////////////////////////////
+void TimeDependentBCSimulationObserver::update(real step)
+{
+    if (scheduler->isDue(step)) {
+        for (SPtr<Interactor3D> inter : interactors)
+            inter->updateInteractor(step);
+        UBLOG(logDEBUG3, "TimeDependentBCSimulationObserver::update:" << step);
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+void TimeDependentBCSimulationObserver::addInteractor(SPtr<Interactor3D> interactor) { interactors.push_back(interactor); }
+
+//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h
new file mode 100644
index 0000000000000000000000000000000000000000..0c72054f2feadcaa6cf9792453d1e3389e7213bb
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h
@@ -0,0 +1,30 @@
+#ifndef TimeDependentBCSimulationObserver_H
+#define TimeDependentBCSimulationObserver_H
+
+#include <PointerDefinitions.h>
+#include <vector>
+
+#include "SimulationObserver.h"
+
+class Interactor3D;
+class Grid3D;
+
+//! \brief The class update interactors depend of time step.
+//! \details TimeDependentBCSimulationObserver update every time step information in BCs throw Interactors
+//! \author Sonja Uphoff, Kostyantyn Kucher
+class TimeDependentBCSimulationObserver : public SimulationObserver
+{
+public:
+    TimeDependentBCSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
+    ~TimeDependentBCSimulationObserver() override;
+
+    void update(real step) override;
+
+    //! add interactors to SimulationObserver
+    void addInteractor(SPtr<Interactor3D> interactor);
+
+private:
+    std::vector<SPtr<Interactor3D>> interactors;
+};
+
+#endif /* TimeDependentBCSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
similarity index 77%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
index b897d4df17ceb61d88f242c17de3e2030d01e120..e0560e2767b70dcc51db08f807a29e467efa6a2d 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
@@ -1,11 +1,11 @@
 /*
- *  TimeseriesWriterCoProcessor.h
+ *  TimeseriesWriterSimulationObserver.h
  *
  *  Created on: 08.05.2013
  *  Author: uphoff
  */
 
-#include "TimeseriesCoProcessor.h"
+#include "TimeseriesSimulationObserver.h"
 
 #include <fstream>
 
@@ -15,15 +15,15 @@
 #include "LBMUnitConverter.h"
 #include "UbScheduler.h"
 
-TimeseriesCoProcessor::TimeseriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
+TimeseriesSimulationObserver::TimeseriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
                                              const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), h1(h1), path(path), comm(comm)
+    : SimulationObserver(grid, s), h1(h1), path(path), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         std::ofstream ostr;
         // fname = path+"/timeseries/timeseries"+UbSystem::toString(grid->getTimeStep())+".csv";
         fname = path + ".csv";
-        UBLOG(logINFO, "TimeseriesWriterCoProcessor::fname:" << fname);
+        UBLOG(logINFO, "TimeseriesWriterSimulationObserver::fname:" << fname);
         ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);
         if (!ostr) {
             ostr.clear();
@@ -37,23 +37,23 @@ TimeseriesCoProcessor::TimeseriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler
         }
         ostr << "step;rho;vx;vy;vz;volume\n";
         ostr.close();
-        UBLOG(logINFO, "TimeseriesWriterCoProcessor::Constructor:end");
+        UBLOG(logINFO, "TimeseriesWriterSimulationObserver::Constructor:end");
     }
 }
 //////////////////////////////////////////////////////////////////////////
-TimeseriesCoProcessor::~TimeseriesCoProcessor() = default;
+TimeseriesSimulationObserver::~TimeseriesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void TimeseriesCoProcessor::process(real step)
+void TimeseriesSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeseriesCoProcessor::collectData(real step)
+void TimeseriesSimulationObserver::collectData(real step)
 {
     h1->calculateMQ();
 
-    UBLOG(logDEBUG3, "TimeseriesWriterCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "TimeseriesWriterSimulationObserver::update:" << step);
 
     if (comm->getProcessID() == comm->getRoot()) {
         int istep = static_cast<int>(step);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
similarity index 66%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
index 7cdc98fd02b2776e970e52ccacf9966a4411a309..db41bd2ecea38ac86e97740310ba9501f94caa4a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
@@ -1,17 +1,17 @@
 /*
- *  TimeseriesCoProcessor.h
+ *  TimeseriesSimulationObserver.h
  *
  *  Created on: 08.05.2013
  *  Author: uphoff
  */
 
-#ifndef TimeseriesCoProcessor_H
-#define TimeseriesCoProcessor_H
+#ifndef TimeseriesSimulationObserver_H
+#define TimeseriesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 namespace vf::mpi {class Communicator;}
 class Grid3D;
@@ -23,15 +23,15 @@ class IntegrateValuesHelper;
 //! \author    Sonja Uphoff
 //! \date      May 2013
 
-class TimeseriesCoProcessor : public CoProcessor
+class TimeseriesSimulationObserver : public SimulationObserver
 {
 public:
-    TimeseriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
+    TimeseriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
                           const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~TimeseriesCoProcessor() override;
+    ~TimeseriesSimulationObserver() override;
 
     //! calls collectData.
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     void collectData(real step);
@@ -45,4 +45,4 @@ private:
     std::string fname;
 };
 
-#endif /* TimeseriesCoProcessor_H */
+#endif /* TimeseriesSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
index 4714349a9c25ec2b5d427e3b64ad00be738915f6..47b865ed7b80fd1c420d59fa54144d5afa1471f5 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
@@ -1,7 +1,7 @@
-#include "TurbulenceIntensityCoProcessor.h"
+#include "TurbulenceIntensitySimulationObserver.h"
 
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include <mpi/Communicator.h>
 #include "DataSet3D.h"
@@ -12,15 +12,15 @@
 #include "basics/utilities/UbMath.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-TurbulenceIntensityCoProcessor::TurbulenceIntensityCoProcessor(SPtr<Grid3D> grid, const std::string &path,
+TurbulenceIntensitySimulationObserver::TurbulenceIntensitySimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                                WbWriter *const writer, SPtr<UbScheduler> s,
                                                                std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm), writer(writer)
+    : SimulationObserver(grid, s), path(path), comm(comm), writer(writer)
 {
     init();
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::init()
+void TurbulenceIntensitySimulationObserver::init()
 {
     gridRank     = grid->getRank();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -40,17 +40,17 @@ void TurbulenceIntensityCoProcessor::init()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::process(real step)
+void TurbulenceIntensitySimulationObserver::update(real step)
 {
     calculateAverageValues(int(step));
 
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "TurbulenceIntensityCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "TurbulenceIntensitySimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::collectData(real step)
+void TurbulenceIntensitySimulationObserver::collectData(real step)
 {
     int istep = int(step);
 
@@ -76,18 +76,18 @@ void TurbulenceIntensityCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(pname);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(path + "_collection", filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(path + "_collection", filenames, istep, false);
         }
-        UBLOG(logINFO, "TurbulenceIntensityCoProcessor step: " << istep);
+        UBLOG(logINFO, "TurbulenceIntensitySimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::clearData()
+void TurbulenceIntensitySimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -95,7 +95,7 @@ void TurbulenceIntensityCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::addData(const SPtr<Block3D> block)
+void TurbulenceIntensitySimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //   UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -109,7 +109,7 @@ void TurbulenceIntensityCoProcessor::addData(const SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageValues();
     // int ghostLayerWidth = kernel->getGhostLayerWidth();
@@ -179,7 +179,7 @@ void TurbulenceIntensityCoProcessor::addData(const SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::calculateAverageValues(real timeStep)
+void TurbulenceIntensitySimulationObserver::calculateAverageValues(real timeStep)
 {
     using namespace vf::lbm::dir;
     using namespace D3Q27System;
@@ -193,7 +193,7 @@ void TurbulenceIntensityCoProcessor::calculateAverageValues(real timeStep)
         for (SPtr<Block3D> block : blockVector[level]) {
             if (block) {
                 SPtr<ILBMKernel> kernel                 = block->getKernel();
-                SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+                SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
                 SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
                 SPtr<AverageValuesArray3D> av           = kernel->getDataSet()->getAverageValues();
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
similarity index 73%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
index 8f11e94b446050d2069f89dd8971fb3acc8fb787..c615bbda5cb58a522e6853fcf3f8475bc3320b52 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef TurbulenceIntensityCoProcessor_H
-#define TurbulenceIntensityCoProcessor_H
+#ifndef TurbulenceIntensitySimulationObserver_H
+#define TurbulenceIntensitySimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 
 namespace vf::mpi {class Communicator;}
@@ -14,12 +14,12 @@ class UbScheduler;
 class WbWriter;
 class Block3D;
 
-class TurbulenceIntensityCoProcessor : public CoProcessor
+class TurbulenceIntensitySimulationObserver : public SimulationObserver
 {
 public:
-    TurbulenceIntensityCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+    TurbulenceIntensitySimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                    SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm);
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     void collectData(real step);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
index de781d96b582f83e38e74ca0643a0d0c23b170c0..fd983bd02bd0bf3a7ae0cd0af96b2f169180f31b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
@@ -26,12 +26,12 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBlocksCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteBlocksSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteBlocksCoProcessor.h"
+#include "WriteBlocksSimulationObserver.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 #include <logger/Logger.h>
 
@@ -41,21 +41,21 @@
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
-WriteBlocksCoProcessor::WriteBlocksCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+WriteBlocksSimulationObserver::WriteBlocksSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-WriteBlocksCoProcessor::~WriteBlocksCoProcessor() = default;
+WriteBlocksSimulationObserver::~WriteBlocksSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void WriteBlocksCoProcessor::process(real step)
+void WriteBlocksSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBlocksCoProcessor::collectData(real step)
+void WriteBlocksSimulationObserver::collectData(real step)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         int istep = int(step);
@@ -173,7 +173,7 @@ void WriteBlocksCoProcessor::collectData(real step)
             path + "/blocks/blocks_" + UbSystem::toString(grid->getRank()) + "_" + UbSystem::toString(istep), nodes,
             cells, celldatanames, celldata));
 
-        if (istep == CoProcessor::scheduler->getMinBegin()) {
+        if (istep == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(path + "/blocks/blocks_collection", filenames, istep,
                                                                 false);
         } else {
@@ -181,6 +181,6 @@ void WriteBlocksCoProcessor::collectData(real step)
                                                                      istep, false);
         }
 
-        VF_LOG_INFO("WriteBlocksCoProcessor step: {}", istep);
+        VF_LOG_INFO("WriteBlocksSimulationObserver step: {}", istep);
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
index c94cd1e64861cead5d01becbd80e5b3381e6e159..805605b64564272c6a327545a4b01bc89926da38 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
@@ -26,41 +26,41 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBlocksCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteBlocksSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteBlocksCoProcessor_H_
-#define WriteBlocksCoProcessor_H_
+#ifndef WriteBlocksSimulationObserver_H_
+#define WriteBlocksSimulationObserver_H_
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 namespace vf::mpi {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
 
-//! \class WriteBlocksCoProcessor
+//! \class WriteBlocksSimulationObserver
 //! \brief A class writes a block grid to a VTK-file
-class WriteBlocksCoProcessor : public CoProcessor
+class WriteBlocksSimulationObserver : public SimulationObserver
 {
 public:
-    //! \brief Construct WriteBlocksCoProcessor object.
+    //! \brief Construct WriteBlocksSimulationObserver object.
     //! \pre The Grid3D and UbScheduler objects must exist.
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \param path is path of folder for output
     //! \param writer is WbWriter object
     //! \param comm is Communicator object
-    WriteBlocksCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
+    WriteBlocksSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
                            std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteBlocksCoProcessor() override;
+    ~WriteBlocksSimulationObserver() override;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Collect data for VTK-file
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
similarity index 89%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
index 4ed68397a7813314450ddd7dea33ca1824f54ac9..9d09db9e2c839f5db6bdd4c95e348e3ade094759 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBoundaryConditionsCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteBoundaryConditionsSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteBoundaryConditionsCoProcessor.h"
-#include "BCProcessor.h"
+#include "WriteBoundaryConditionsSimulationObserver.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
 #include <vector>
@@ -51,12 +51,12 @@
 
 using namespace std;
 
-WriteBoundaryConditionsCoProcessor::WriteBoundaryConditionsCoProcessor() = default;
+WriteBoundaryConditionsSimulationObserver::WriteBoundaryConditionsSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteBoundaryConditionsCoProcessor::WriteBoundaryConditionsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteBoundaryConditionsSimulationObserver::WriteBoundaryConditionsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                        const std::string &path, WbWriter *const writer,
                                                                        std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
     gridRank     = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -69,15 +69,15 @@ WriteBoundaryConditionsCoProcessor::WriteBoundaryConditionsCoProcessor(SPtr<Grid
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::process(real step)
+void WriteBoundaryConditionsSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteBoundaryConditionsCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteBoundaryConditionsSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::collectData(real step)
+void WriteBoundaryConditionsSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -111,18 +111,18 @@ void WriteBoundaryConditionsCoProcessor::collectData(real step)
 
         vector<string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        VF_LOG_INFO("WriteBoundaryConditionsCoProcessor step: {}", istep);
+        VF_LOG_INFO("WriteBoundaryConditionsSimulationObserver step: {}", istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::clearData()
+void WriteBoundaryConditionsSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -130,7 +130,7 @@ void WriteBoundaryConditionsCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block)
+void WriteBoundaryConditionsSimulationObserver::addDataGeo(SPtr<Block3D> block)
 {
     UbTupleDouble3 org        = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 nodeOffset = grid->getNodeOffset(block);
@@ -147,7 +147,7 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel = block->getKernel();
-    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
 
     int minX1 = 0;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
index 31f2a5c8e31820217d76745d371a8a812acb3b67..ad5b20df942748e065cebe926ba346581b9bf30b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBoundaryConditionsCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteBoundaryConditionsSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteBoundaryConditionsCoProcessor_H
-#define WriteBoundaryConditionsCoProcessor_H
+#ifndef WriteBoundaryConditionsSimulationObserver_H
+#define WriteBoundaryConditionsSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 
 namespace vf::mpi {class Communicator;}
@@ -49,22 +49,22 @@ class Block3D;
 class LBMUnitConverter;
 
 //! \brief A class writes boundary conditions information to a VTK-file
-class WriteBoundaryConditionsCoProcessor : public CoProcessor
+class WriteBoundaryConditionsSimulationObserver : public SimulationObserver
 {
 public:
-    WriteBoundaryConditionsCoProcessor();
-    //! \brief Construct WriteBoundaryConditionsCoProcessor object
+    WriteBoundaryConditionsSimulationObserver();
+    //! \brief Construct WriteBoundaryConditionsSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \param path is path of folder for output
     //! \param writer is WbWriter object
     //! \param comm is Communicator object
-    WriteBoundaryConditionsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteBoundaryConditionsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                        WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteBoundaryConditionsCoProcessor() override = default;
+    ~WriteBoundaryConditionsSimulationObserver() override = default;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Collect data for VTK-file
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
similarity index 73%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
index b47f1056172c07855eda232bede05eef475c4718..62178444f92abffebe8ce5d2ad1bd8a1f54960f0 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "WriteGbObjectsCoProcessor.h"
+#include "WriteGbObjectsSimulationObserver.h"
 #include <mpi/Communicator.h>
 #include "GbObject3D.h"
 #include "UbScheduler.h"
@@ -6,23 +6,23 @@
 #include "WbWriterVtkXmlBinary.h"
 #include <vector>
 
-WriteGbObjectsCoProcessor::WriteGbObjectsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+WriteGbObjectsSimulationObserver::WriteGbObjectsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                      WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-WriteGbObjectsCoProcessor::~WriteGbObjectsCoProcessor() = default;
+WriteGbObjectsSimulationObserver::~WriteGbObjectsSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void WriteGbObjectsCoProcessor::process(real step)
+void WriteGbObjectsSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteGbObjectsCoProcessor::addGbObject(SPtr<GbObject3D> object) { objects.push_back(object); }
+void WriteGbObjectsSimulationObserver::addGbObject(SPtr<GbObject3D> object) { objects.push_back(object); }
 //////////////////////////////////////////////////////////////////////////
-void WriteGbObjectsCoProcessor::collectData(real step)
+void WriteGbObjectsSimulationObserver::collectData(real step)
 {
     std::vector<UbTupleFloat3> nodes;
     std::vector<UbTupleInt3> triangles;
@@ -62,12 +62,12 @@ void WriteGbObjectsCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteGbObjectsCoProcessor number of objects: " << numObjcts);
-        UBLOG(logINFO, "WriteGbObjectsCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteGbObjectsSimulationObserver number of objects: " << numObjcts);
+        UBLOG(logINFO, "WriteGbObjectsSimulationObserver step: " << istep);
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
similarity index 63%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
index 5b502044f0556d2519afc23b72ea2b50bd664832..50f88c65ddbf87bb9960f2be61e380e9ad2d570b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
@@ -1,7 +1,7 @@
-#ifndef WriteGbObjectsCoProcessor_h__
-#define WriteGbObjectsCoProcessor_h__
+#ifndef WriteGbObjectsSimulationObserver_h__
+#define WriteGbObjectsSimulationObserver_h__
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 
 #include <vector>
@@ -17,14 +17,14 @@ class WbWriter;
 //! \author    Konstantin Kutscher
 //! \date      December 2018
 
-class WriteGbObjectsCoProcessor : public CoProcessor
+class WriteGbObjectsSimulationObserver : public SimulationObserver
 {
 public:
-    WriteGbObjectsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
+    WriteGbObjectsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
                               std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteGbObjectsCoProcessor() override;
+    ~WriteGbObjectsSimulationObserver() override;
     //! calls collectData.
-    void process(real step) override;
+    void update(real step) override;
     //! adds geometry object
     void addGbObject(SPtr<GbObject3D> object);
 
@@ -38,4 +38,4 @@ private:
     std::shared_ptr<vf::mpi::Communicator> comm;
 };
 
-#endif // WriteGbObjectsCoProcessor_h__
\ No newline at end of file
+#endif // WriteGbObjectsSimulationObserver_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
similarity index 89%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
index 2b49861af9fd53cdec491527f40f96b4f8bc0484..caf1e8c1ed2d4c43a219e1fd7a09b3a96e0e2370 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
@@ -1,5 +1,5 @@
-#include "WriteMQFromSelectionCoProcessor.h"
-#include "BCProcessor.h"
+#include "WriteMQFromSelectionSimulationObserver.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
 #include <vector>
@@ -14,13 +14,13 @@
 #include "UbScheduler.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-WriteMQFromSelectionCoProcessor::WriteMQFromSelectionCoProcessor() = default;
+WriteMQFromSelectionSimulationObserver::WriteMQFromSelectionSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMQFromSelectionCoProcessor::WriteMQFromSelectionCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMQFromSelectionSimulationObserver::WriteMQFromSelectionSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                  SPtr<GbObject3D> gbObject, const std::string &path,
                                                                  WbWriter *const writer, SPtr<LBMUnitConverter> conv,
                                                                  std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), gbObject(gbObject), path(path), writer(writer), conv(conv), comm(comm)
+    : SimulationObserver(grid, s), gbObject(gbObject), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank     = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -33,17 +33,17 @@ WriteMQFromSelectionCoProcessor::WriteMQFromSelectionCoProcessor(SPtr<Grid3D> gr
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::init() {}
+void WriteMQFromSelectionSimulationObserver::init() {}
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::process(real step)
+void WriteMQFromSelectionSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteMQFromSelectionCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteMQFromSelectionSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::collectData(real step)
+void WriteMQFromSelectionSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -90,25 +90,25 @@ void WriteMQFromSelectionCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteMQFromSelectionCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteMQFromSelectionSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::clearData()
+void WriteMQFromSelectionSimulationObserver::clearData()
 {
     nodes.clear();
     datanames.clear();
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMQFromSelectionSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     real level = (real)block->getLevel();
     //   double blockID = (double)block->getGlobalID();
@@ -126,7 +126,7 @@ void WriteMQFromSelectionCoProcessor::addDataMQ(SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
index 64e7572797a613815d62eec91a61d68120ee1a2e..e91fc369e1ddb33af68629d6aab75cf5b3756290 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef WriteMQFromSelectionCoProcessor_H
-#define WriteMQFromSelectionCoProcessor_H
+#ifndef WriteMQFromSelectionSimulationObserver_H
+#define WriteMQFromSelectionSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 #include "LBMSystem.h"
 #include "UbTuple.h"
@@ -18,16 +18,16 @@ class WbWriter;
 class Block3D;
 class GbObject3D;
 
-class WriteMQFromSelectionCoProcessor : public CoProcessor
+class WriteMQFromSelectionSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMQFromSelectionCoProcessor();
-    WriteMQFromSelectionCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbObject3D> gbObject,
+    WriteMQFromSelectionSimulationObserver();
+    WriteMQFromSelectionSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbObject3D> gbObject,
                                     const std::string &path, WbWriter *const writer, SPtr<LBMUnitConverter> conv,
                                     std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMQFromSelectionCoProcessor() override = default;
+    ~WriteMQFromSelectionSimulationObserver() override = default;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     void collectData(real step);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
index 5c4f80887349280856a2de3791d9d0fb9012f53b..142bcc52b053f0be71c8a1ca41eaf0dfeaf24f1b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteMacroscopicQuantitiesPlusMassCoProcessor.h"
-#include "BCProcessor.h"
+#include "WriteMacroscopicQuantitiesPlusMassSimulationObserver.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
 #include <vector>
@@ -46,14 +46,14 @@
 #include "UbScheduler.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor() = default;
+WriteMacroscopicQuantitiesPlusMassSimulationObserver::WriteMacroscopicQuantitiesPlusMassSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMacroscopicQuantitiesPlusMassSimulationObserver::WriteMacroscopicQuantitiesPlusMassSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
                                                                              std::shared_ptr<vf::mpi::Communicator> comm)
-        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+        : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -68,20 +68,20 @@ WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMas
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::init()
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::init()
 {}
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::process(real step)
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesPlusMassCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesPlusMassSimulationObserver::update:" << step);
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::collectData(real step)
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -118,21 +118,21 @@ void WriteMacroscopicQuantitiesPlusMassCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin())
+        if (step == SimulationObserver::scheduler->getMinBegin())
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else
         {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteMacroscopicQuantitiesPlusMassCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteMacroscopicQuantitiesPlusMassSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::clearData()
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -141,7 +141,7 @@ void WriteMacroscopicQuantitiesPlusMassCoProcessor::clearData()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     real level   = (real)block->getLevel();
 
@@ -160,7 +160,7 @@ void WriteMacroscopicQuantitiesPlusMassCoProcessor::addDataMQ(SPtr<Block3D> bloc
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
index 1815d480f392fa47cdbf64038791929dc32a2ff3..ce6946528269adec3374dff655991b4a8cb0aaf7 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMacroscopicQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteMacroscopicQuantitiesCoProcessor_H
-#define WriteMacroscopicQuantitiesCoProcessor_H
+#ifndef WriteMacroscopicQuantitiesPlusMassSimulationObserver_H
+#define WriteMacroscopicQuantitiesPlusMassSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -50,11 +50,11 @@ class WbWriter;
 class Block3D;
 
 //! \brief A class writes macroscopic quantities information to a VTK-file
-class WriteMacroscopicQuantitiesCoProcessor : public CoProcessor
+class WriteMacroscopicQuantitiesPlusMassSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMacroscopicQuantitiesCoProcessor();
-    //! \brief Construct WriteMacroscopicQuantitiesCoProcessor object
+    WriteMacroscopicQuantitiesPlusMassSimulationObserver();
+    //! \brief Construct WriteMacroscopicQuantitiesPlusMassSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
@@ -62,11 +62,11 @@ public:
     //! \param writer is WbWriter object
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
-    WriteMacroscopicQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteMacroscopicQuantitiesPlusMassSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                           WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMacroscopicQuantitiesCoProcessor() override = default;
+    ~WriteMacroscopicQuantitiesPlusMassSimulationObserver() override = default;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Collect data for VTK-file
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
similarity index 91%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
index 58ed15604f8937b0b33fca96dab69250a404242c..b87b5cfcfc5b10b3fc97d54b135a745c811f9e0e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMacroscopicQuantitiesCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteMacroscopicQuantitiesCoProcessor.h"
-#include "BCProcessor.h"
+#include "WriteMacroscopicQuantitiesSimulationObserver.h"
+#include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
 #include <vector>
@@ -46,14 +46,14 @@
 #include "UbScheduler.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor() = default;
+WriteMacroscopicQuantitiesSimulationObserver::WriteMacroscopicQuantitiesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMacroscopicQuantitiesSimulationObserver::WriteMacroscopicQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
                                                                              std::shared_ptr<vf::mpi::Communicator> comm)
-        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+        : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -68,20 +68,20 @@ WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor(SPt
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::init()
+void WriteMacroscopicQuantitiesSimulationObserver::init()
 {}
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::process(real step)
+void WriteMacroscopicQuantitiesSimulationObserver::update(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesSimulationObserver::update:" << step);
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::collectData(real step)
+void WriteMacroscopicQuantitiesSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -118,21 +118,21 @@ void WriteMacroscopicQuantitiesCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin())
+        if (step == SimulationObserver::scheduler->getMinBegin())
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else
         {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteMacroscopicQuantitiesCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteMacroscopicQuantitiesSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::clearData()
+void WriteMacroscopicQuantitiesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -141,7 +141,7 @@ void WriteMacroscopicQuantitiesCoProcessor::clearData()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMacroscopicQuantitiesSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     real level   = (real)block->getLevel();
 
@@ -160,7 +160,7 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     data.resize(datanames.size());
 
     SPtr<ILBMKernel> kernel                 = block->getKernel();
-    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCSet()->getBCArray();
     SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
index 9251bfc22549a7a366e57540ea8387e851d4756f..85de0336487a71774d63c86f4c6ba1b65b15fe2a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMacroscopicQuantitiesPlusMassCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteMacroscopicQuantitiesPlusMassCoProcessor_H
-#define WriteMacroscopicQuantitiesPlusMassCoProcessor_H
+#ifndef WriteMacroscopicQuantitiesSimulationObserver_H
+#define WriteMacroscopicQuantitiesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -50,11 +50,11 @@ class WbWriter;
 class Block3D;
 
 //! \brief A class writes macroscopic quantities information to a VTK-file
-class WriteMacroscopicQuantitiesPlusMassCoProcessor : public CoProcessor
+class WriteMacroscopicQuantitiesSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMacroscopicQuantitiesPlusMassCoProcessor();
-    //! \brief Construct WriteMacroscopicQuantitiesPlusMassCoProcessor object
+    WriteMacroscopicQuantitiesSimulationObserver();
+    //! \brief Construct WriteMacroscopicQuantitiesSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
@@ -62,11 +62,11 @@ public:
     //! \param writer is WbWriter object
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
-    WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteMacroscopicQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                           WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMacroscopicQuantitiesPlusMassCoProcessor() override = default;
+    ~WriteMacroscopicQuantitiesSimulationObserver() override = default;
 
-    void process(real step) override;
+    void update(real step) override;
 
 protected:
     //! Collect data for VTK-file
diff --git a/src/cpu/VirtualFluidsCore/Utilities/ChangeRandomQs.hpp b/src/cpu/VirtualFluidsCore/Utilities/ChangeRandomQs.hpp
index 3fbd3643d71409fe21aa800473310399757f3a44..dbfb8907dacdad96849812a1cf5b01ccb52e1483 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/ChangeRandomQs.hpp
+++ b/src/cpu/VirtualFluidsCore/Utilities/ChangeRandomQs.hpp
@@ -5,7 +5,7 @@
 #include "IntegrateValuesHelper.h"
 #include "BoundaryConditions.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 
 namespace Utilities
 {
@@ -16,7 +16,7 @@ namespace Utilities
       for(IntegrateValuesHelper::CalcNodes cn : cnodes)
       {
          SPtr<ILBMKernel> kernel = cn.block->getKernel();
-         SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+         SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
          for(UbTupleInt3 node : cn.nodes)
          {
             SPtr<BoundaryConditions> bc = bcArray->getBC(val<1>(node), val<2>(node), val<3>(node));
diff --git a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
index 53282294203213fe98b8867dfaf2fde523490bc5..358dabf437fb69325a905d968e8dc6547127fd8f 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
+++ b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
@@ -162,7 +162,7 @@ void CheckpointConverter::convertBlocks(int step, int procCount)
 
     // calculate the read offset
     procCount =
-        1; // readBlocks and writeBlocks in both MPIIORestartCoProcessor and MPIIOMigrationCoProcessor have size == 1!
+        1; // readBlocks and writeBlocks in both MPIIORestartSimulationObserver and MPIIOMigrationSimulationObserver have size == 1!
     MPI_Offset read_offset = (MPI_Offset)(procCount * sizeof(int));
 
     // read parameters of the grid and blocks
diff --git a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
index 6fe24772d574a6db67428a820027971b4c7fd230..bab67ae662c10e31158b47e1725788dc38794560 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
+++ b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
@@ -11,7 +11,7 @@ class Grid3D;
 namespace vf::mpi {class Communicator;}
 
 //! \class UtilConvertor
-//! \brief Converts timestep data from MPIIORestartCoProcessor format into MPIIOMigrationCoProcessor format
+//! \brief Converts timestep data from MPIIORestartSimulationObserver format into MPIIOMigrationSimulationObserver format
 class CheckpointConverter
 {
 public:
diff --git a/src/cpu/VirtualFluidsCore/Utilities/VoxelMatrixUtil.hpp b/src/cpu/VirtualFluidsCore/Utilities/VoxelMatrixUtil.hpp
index 7ac3aa19578b0735ffab354a8f45ec714bacd314..1903cba9b2318f094142bdd1f2562a845d05f069 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/VoxelMatrixUtil.hpp
+++ b/src/cpu/VirtualFluidsCore/Utilities/VoxelMatrixUtil.hpp
@@ -2,7 +2,7 @@
 #define VoxelMatrixUtil_h__
 
 #include "GbCuboid3D.h"
-#include "NoSlipBCAdapter.h"
+#include "NoSlipBC.h"
 #include "D3Q27Interactor.h"
 #include "SetBcBlocksBlockVisitor.h"
 #include "Block3D.h"
@@ -13,7 +13,7 @@ namespace Utilities
 {
    void voxelMatrixDiscretisation(SPtr<GbVoxelMatrix3D> matrix, std::string& pathname, int myid, int fileCounter, SPtr<Grid3D> grid, int bounceBackOption, bool vmFile)
    {
-      SPtr<BCAdapter> noSlipPM(new NoSlipBCAdapter(bounceBackOption));
+      SPtr<BC> noSlipPM(new NoSlipBC(bounceBackOption));
       SPtr<D3Q27Interactor> vmInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(matrix, grid, noSlipPM, Interactor3D::SOLID));
 
       if (vmFile)
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
index fbfbd1bcab135056fa6b62e31d50b63c898bb83a..db18f090ab566bad0f4bb39493216e8db7c7be2c 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
@@ -32,26 +32,19 @@
 //=======================================================================================
 
 #include "BoundaryConditionsBlockVisitor.h"
-#include "BCAdapter.h"
+#include "BC.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "D3Q27System.h"
-#include "BCAdapter.h"
+#include "BC.h"
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "ILBMKernel.h"
 
-#include "ThixotropyDensityBCAlgorithm.h"
-#include "ThixotropyVelocityBCAlgorithm.h"
-#include "ThixotropyNoSlipBCAlgorithm.h"
-#include "ThixotropyNonReflectingOutflowBCAlgorithm.h"
-#include "ThixotropyVelocityWithDensityBCAlgorithm.h"
-
-
 BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
 }
@@ -67,13 +60,13 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
             throw UbException(UB_EXARGS, "LBMKernel in " + block->toString() + "is not exist!");
         }
 
-        SPtr<BCProcessor> bcProcessor = kernel->getBCProcessor();
+        SPtr<BCSet> bcSet = kernel->getBCSet();
 
-        if (!bcProcessor) {
+        if (!bcSet) {
             throw UbException(UB_EXARGS, "Boundary Conditions Processor is not exist!");
         }
 
-        SPtr<BCArray3D> bcArray = bcProcessor->getBCArray();
+        SPtr<BCArray3D> bcArray = bcSet->getBCArray();
 
         bool compressible = kernel->getCompressible();
         real collFactor = kernel->getCollisionFactor();
@@ -86,7 +79,7 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         int maxX3 = (int)bcArray->getNX3();
         SPtr<BoundaryConditions> bcPtr;
 
-        bcProcessor->clearBC();
+        bcSet->clearBC();
 
         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
 
@@ -95,8 +88,8 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
                 for (int x1 = minX1; x1 < maxX1; x1++) {
                     if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
                         if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL) {
-                            char alg              = bcPtr->getBcAlgorithmType();
-                            SPtr<BCAlgorithm> bca = bcMap[alg];
+                            char alg              = bcPtr->getBCStrategyType();
+                            SPtr<BCStrategy> bca = bcMap[alg];
 
                             if (bca) {
                                 bca = bca->clone();
@@ -104,27 +97,10 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
                                 bca->setNodeIndex(x1, x2, x3);
                                 bca->setBcPointer(bcPtr);
                                 bca->addDistributions(distributions);
-
-                                if (alg == BCAlgorithm::ThixotropyVelocityBCAlgorithm)
-                                    std::static_pointer_cast<ThixotropyVelocityBCAlgorithm>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCAlgorithm::ThixotropyDensityBCAlgorithm)
-                                    std::static_pointer_cast<ThixotropyDensityBCAlgorithm>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCAlgorithm::ThixotropyNoSlipBCAlgorithm)
-                                    std::static_pointer_cast<ThixotropyNoSlipBCAlgorithm>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCAlgorithm::ThixotropyNonReflectingOutflowBCAlgorithm)
-                                    std::static_pointer_cast<ThixotropyNonReflectingOutflowBCAlgorithm>(bca)
-                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
-                                if (alg == BCAlgorithm::ThixotropyVelocityWithDensityBCAlgorithm)
-                                    std::static_pointer_cast<ThixotropyVelocityWithDensityBCAlgorithm>(bca)
-                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
-
                                 bca->setCollFactor(collFactor);
                                 bca->setCompressible(compressible);
                                 bca->setBcArray(bcArray);
-                                bcProcessor->addBC(bca);
+                                bcSet->addBC(bca);
                             }
                         }
                     }
@@ -134,7 +110,7 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::addBC(SPtr<BCAdapter> bc)
+void BoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
 {
-    bcMap.insert(std::make_pair(bc->getBcAlgorithmType(), bc->getAlgorithm()));
+    bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getAlgorithm()));
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
index 42eefd93077c56f12c2eec3282cb3f7a1e67c208..8954bf73a6a459a795e916f24192f5db698b1426 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
@@ -41,8 +41,8 @@
 
 class Grid3D;
 class Block3D;
-class BCAlgorithm;
-class BCAdapter;
+class BCStrategy;
+class BC;
 
 //! \brief set boundary conditions
 class BoundaryConditionsBlockVisitor : public Block3DVisitor
@@ -52,10 +52,10 @@ public:
     ~BoundaryConditionsBlockVisitor() override;
 
     void visit(SPtr<Grid3D> grid, SPtr<Block3D> block) override;
-    void addBC(SPtr<BCAdapter> bc);
+    void addBC(SPtr<BC> bc);
 
 protected:
 private:
-    std::map<char, SPtr<BCAlgorithm>> bcMap;
+    std::map<char, SPtr<BCStrategy>> bcMap;
 };
 #endif // BoundaryConditionBlockVisitor_h__
diff --git a/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp
index c541465183dd084135d60b7112182daae33e22ab..682f1d65b2475001d59d4fad57fb3b4f39eaa918 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp
@@ -1,6 +1,6 @@
 #include "ChangeBoundaryDensityBlockVisitor.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include "Grid3D.h"
@@ -19,7 +19,7 @@ void ChangeBoundaryDensityBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> b
 {
     if (block->getRank() == grid->getRank()) {
         SPtr<ILBMKernel> kernel = block->getKernel();
-        SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
 
         int minX1 = 0;
         int minX2 = 0;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
index 1c4860070a5ca8aefc4850a9b16dd7273c65f231..2e24a2e26d1709b5c1af33d2210f269ca59f2e40 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
@@ -33,7 +33,7 @@
 
 #include "InitDistributionsBlockVisitor.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
@@ -157,7 +157,7 @@ void InitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D>
       else                                                        
          calcFeqsFct   = &D3Q27System::calcIncompFeq; 
 
-      SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+      SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
       SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();  
 
       real o  = kernel->getCollisionFactor();
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp
index 2632f2c59db6d4982806c50dcc50f743cc5c2ad3..3a51f5532532e4ac116221a551a1d4ad9bb5e66c 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp
@@ -1,6 +1,6 @@
 #include "InitDistributionsFromFileBlockVisitor.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
@@ -73,7 +73,7 @@ void InitDistributionsFromFileBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<
 
         //      UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
 
-        SPtr<BCArray3D> bcArray        = kernel->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArray        = kernel->getBCSet()->getBCArray();
         SPtr<EsoTwist3D> distributions = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getFdistributions());
 
         real f[D3Q27System::ENDF + 1];
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp
index 6dd6976ca3cb250e720079031632b9b5e3902696..660363e22e7c315a40df596aa95137f5589fff72 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp
@@ -2,7 +2,7 @@
 
 #include "mpi.h"
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
@@ -178,7 +178,7 @@ void InitDistributionsWithInterpolationGridVisitor::interpolateLocalBlockCoarseT
 
     SPtr<EsoTwist3D> oldDistributions = dynamicPointerCast<EsoTwist3D>(oldKernel->getDataSet()->getFdistributions());
 
-    SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCSet()->getBCArray();
 
     SPtr<ILBMKernel> newKernel = newBlock->getKernel();
     if (!newKernel)
@@ -279,7 +279,7 @@ void InitDistributionsWithInterpolationGridVisitor::interpolateRemoteBlockCoarse
         MPI_Send(zeroDistributions->getStartAdressOfSortedArray(0, 0, 0),
                  (int)zeroDistributions->getDataVector().size(), MPI_DOUBLE, newBlockRank, 0, MPI_COMM_WORLD);
 
-        SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCSet()->getBCArray();
         std::vector<int> &bcDataVector  = bcArrayOldBlock->getBcindexmatrixDataVector();
         MPI_Send(&bcDataVector[0], (int)bcDataVector.size(), MPI_INT, newBlockRank, 0, MPI_COMM_WORLD);
     } else if (newBlockRank == newGridRank && newBlock->isActive()) {
@@ -408,7 +408,7 @@ void InitDistributionsWithInterpolationGridVisitor::interpolateLocalBlockFineToC
 
     SPtr<EsoTwist3D> oldDistributions = dynamicPointerCast<EsoTwist3D>(oldKernel->getDataSet()->getFdistributions());
 
-    SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCSet()->getBCArray();
 
     SPtr<ILBMKernel> newKernel = newBlock->getKernel();
     if (!newKernel)
@@ -510,7 +510,7 @@ void InitDistributionsWithInterpolationGridVisitor::interpolateRemoteBlockFineTo
         MPI_Send(zeroDistributions->getStartAdressOfSortedArray(0, 0, 0),
                  (int)zeroDistributions->getDataVector().size(), MPI_DOUBLE, newBlockRank, 0, MPI_COMM_WORLD);
 
-        SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCProcessor()->getBCArray();
+        SPtr<BCArray3D> bcArrayOldBlock = oldBlock->getKernel()->getBCSet()->getBCArray();
         std::vector<int> &bcDataVector  = bcArrayOldBlock->getBcindexmatrixDataVector();
         MPI_Send(&bcDataVector[0], (int)bcDataVector.size(), MPI_INT, newBlockRank, 0, MPI_COMM_WORLD);
     } else if (newBlockRank == newGridRank && newBlock->isActive()) {
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
index 0c666958912c7f73f74d91b179e19cf6d3b06dd1..be0c694bc733ff3b9ebd808d533757f98eefe73c 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
@@ -33,7 +33,7 @@
 
 #include "InitThixotropyBlockVisitor.h"
 #include "LBMKernel.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "D3Q27System.h"
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
@@ -250,7 +250,7 @@ void InitThixotropyBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
       else                                                        
          calcFeqsFct   = &D3Q27System::calcIncompFeq; 
 
-      SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+      SPtr<BCArray3D> bcArray = kernel->getBCSet()->getBCArray();
       SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getHdistributions();  
 
       real h[D3Q27System::ENDF+1];
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp
index 54271370c11700886f969eeef75a2389ef062828..fed80000c562b8aafdefd83ff2791781a8907f7a 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp
@@ -34,7 +34,7 @@
 
 #include "SetKernelBlockVisitor.h"
 
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
@@ -88,24 +88,24 @@ void SetKernelBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 
                 newKernel->setDataSet(dataSet);
 
-                SPtr<BCProcessor> bcProc = block->getKernel()->getBCProcessor();
+                SPtr<BCSet> bcProc = block->getKernel()->getBCSet();
                 if (!bcProc) {
                     UB_THROW(UbException(
                         UB_EXARGS,
-                        "It is not possible to change a BCProcessor in kernel! Old BCProcessor is not exist!"));
+                        "It is not possible to change a BCSet in kernel! Old BCSet is not exist!"));
                 }
-                newKernel->setBCProcessor(bcProc);
+                newKernel->setBCSet(bcProc);
                 block->setKernel(newKernel);
             } break;
 
             case SetKernelBlockVisitor::ChangeKernelWithData: {
-                SPtr<BCProcessor> bcProc = block->getKernel()->getBCProcessor();
+                SPtr<BCSet> bcProc = block->getKernel()->getBCSet();
                 if (!bcProc) {
                     UB_THROW(UbException(
                         UB_EXARGS,
-                        "It is not possible to change a BCProcessor in kernel! Old BCProcessor is not exist!"));
+                        "It is not possible to change a BCSet in kernel! Old BCSet is not exist!"));
                 }
-                newKernel->setBCProcessor(bcProc);
+                newKernel->setBCSet(bcProc);
                 block->setKernel(newKernel);
             } break;
         }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp
index bb6cc5dc6fe06b1a63647d83897bc1fe83066a1a..04f758d396b726c67a5e9a5797a3d65d3d26a36b 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp
@@ -1,6 +1,6 @@
 #include "SetUndefinedNodesBlockVisitor.h"
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
@@ -29,7 +29,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
     // int gl = kernel->getGhostLayerWidth();
     int gl = 0;
 
-    SPtr<BCArray3D> bcMatrix = kernel->getBCProcessor()->getBCArray();
+    SPtr<BCArray3D> bcMatrix = kernel->getBCSet()->getBCArray();
 
     int minX1 = gl;
     int minX2 = gl;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp
index 6183024279ce1753f2fd78bf20b72313b84662f1..4cdcfb80bb4aa3119f1e2ca4dfcd19c2abf381dd 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp
@@ -3,7 +3,7 @@
 #include "LBMSystem.h"
 
 #include "BCArray3D.h"
-#include "BCProcessor.h"
+#include "BCSet.h"
 #include "Block3D.h"
 #include "D3Q27System.h"
 #include "Grid3D.h"
@@ -58,12 +58,12 @@ void SpongeLayerBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 
             newKernel->setDataSet(dataSet);
 
-            SPtr<BCProcessor> bcProc = block->getKernel()->getBCProcessor();
+            SPtr<BCSet> bcProc = block->getKernel()->getBCSet();
             if (!bcProc) {
                 UB_THROW(UbException(
-                    UB_EXARGS, "It is not possible to change a BCProcessor in kernel! Old BCProcessor is not exist!"));
+                    UB_EXARGS, "It is not possible to change a BCSet in kernel! Old BCSet is not exist!"));
             }
-            newKernel->setBCProcessor(bcProc);
+            newKernel->setBCSet(bcProc);
 
             real oldCollFactor = newKernel->getCollisionFactor();
 
diff --git a/src/lbm/constants/NumericConstants.h b/src/lbm/constants/NumericConstants.h
index 1c81192a615d7b99fb90671b7a553247d166147f..6041988392cc289dfd1b074eb98693115c447435 100644
--- a/src/lbm/constants/NumericConstants.h
+++ b/src/lbm/constants/NumericConstants.h
@@ -9,46 +9,46 @@ namespace vf::lbm::constant
 #ifdef VF_DOUBLE_ACCURACY
 static constexpr double c1o2 = 0.5;
 static constexpr double c3o2 = 1.5;
-static constexpr double c1o3 = 0.333333333333333;
-static constexpr double c2o3 = 0.666666666666667;
+static constexpr double c1o3 = (1.0 / 3.0);// 0.333333333333333;
+static constexpr double c2o3 = (2.0 / 3.0);// 0.666666666666667;
 static constexpr double c1o4 = 0.25;
 static constexpr double c3o4 = 0.75;
-static constexpr double c1o6 = 0.166666666666667;
-static constexpr double c1o7 = 0.142857142857143;
+static constexpr double c1o6 = (1.0 / 6.0);// 0.166666666666667;
+static constexpr double c1o7 = (1.0 / 7.0);// 0.142857142857143;
 static constexpr double c1o8 = 0.125;
-static constexpr double c1o9 = 0.111111111111111;
-static constexpr double c2o9 = 0.222222222222222;
-static constexpr double c4o9 = 0.444444444444444;
+static constexpr double c1o9 = (1.0 / 9.0);// 0.111111111111111;
+static constexpr double c2o9 = (2.0 / 9.0);// 0.222222222222222;
+static constexpr double c4o9 = (4.0 / 9.0);// 0.444444444444444;
 static constexpr double c4o10 = 0.4;
 static constexpr double c1o10 = 0.1;
-static constexpr double c1o12 = 0.083333333333333;
-static constexpr double c1o16 = 0.0625;
-static constexpr double c3o16 = 0.1875;
-static constexpr double c9o16 = 0.5625;
-static constexpr double c1o18 = 0.055555555555556;
+static constexpr double c1o12 = (1.0 / 12.0);// 0.083333333333333;
+static constexpr double c1o16 = (1.0 / 16.0);// 0.0625;
+static constexpr double c3o16 = (3.0 / 16.0);// 0.1875;
+static constexpr double c9o16 = (9.0 / 16.0);// 0.5625;
+static constexpr double c1o18 = (1.0 / 18.0);// 0.055555555555556;
 static constexpr double c1o20 = 0.05;
-static constexpr double c19o20 = 0.95;
+static constexpr double c19o20 = (19.0 / 20.0);// 0.95;
 static constexpr double c21o20 = 1.05;
-static constexpr double c1o24 = 0.041666666666667;
-static constexpr double c1o27 = 0.037037037037037;
-static constexpr double c3o32 = 0.09375;
+static constexpr double c1o24 = (1.0 / 24.0);// 0.041666666666667;
+static constexpr double c1o27 = (1.0 / 27.0);// 0.037037037037037;
+static constexpr double c3o32 = (3.0 / 32.0);// 0.09375;
 static constexpr double c4o32 = 0.125;
-static constexpr double c1o36 = 0.027777777777778;
-static constexpr double c1o48 = 0.020833333333333;
-static constexpr double c1o64 = 0.015625;
-static constexpr double c3o64 = 0.046875;
-static constexpr double c9o64 = 0.140625;
-static constexpr double c27o64 = 0.421875;
-static constexpr double c1o66 = 0.015151515151515;
-static constexpr double c1o72 = 0.013888888888889;
-static constexpr double c1o264 = 0.003787878787879;
-static constexpr double c8o27 = 0.296296296296296;
-static constexpr double c2o27 = 0.074074074074074;
-static constexpr double c1o54 = 0.018518518518519;
+static constexpr double c1o36 = (1.0 / 36.0);// 0.027777777777778;
+static constexpr double c1o48 = (1.0 / 48.0);// 0.020833333333333;
+static constexpr double c1o64 = (1.0 / 64.0);// 0.015625;
+static constexpr double c3o64 = (3.0 / 64.0);// 0.046875;
+static constexpr double c9o64 = (9.0 / 64.0);// 0.140625;
+static constexpr double c27o64 = (27.0 / 64.0);// 0.421875;
+static constexpr double c1o66 = (1.0 / 66.0);// 0.015151515151515;
+static constexpr double c1o72 = (1.0 / 72.0);// 0.013888888888889;
+static constexpr double c1o264 = (1.0 / 264.0);// 0.003787878787879;
+static constexpr double c8o27 = (8.0 / 27.0);// 0.296296296296296;
+static constexpr double c2o27 = (2.0 / 27.0);// 0.074074074074074;
+static constexpr double c1o54 = (1.0 / 54.0);// 0.018518518518519;
 static constexpr double c1o100 = 0.01;
-static constexpr double c99o100 = 0.99;
-static constexpr double c1o126 = 0.007936507936508;
-static constexpr double c1o216 = 0.004629629629630;
+static constexpr double c99o100 = (99.0 / 100.0);// 0.99;
+static constexpr double c1o126 = (1.0 / 126.0);// 0.007936507936508;
+static constexpr double c1o216 = (1.0 / 216.0);// 0.004629629629630;
 static constexpr double c5o4 = 1.25;
 static constexpr double c4o3 = 1.333333333333333;
 static constexpr double c9o4 = 2.25;
@@ -117,10 +117,10 @@ static constexpr double c10eM30 = 1e-30;
 static constexpr double c10eM10 = 1e-10;
 static constexpr double smallSingle = 0.0000000002;
 
-static constexpr double cPi = 3.1415926535;
-static constexpr double c2Pi = 6.28318530717;
-static constexpr double cPio180 = 1.74532925199e-2;
-static constexpr double c180oPi = 57.2957795131;
+static const double cPi = 4.0 * std::atan(1.0);// 3.1415926535;
+static const double c2Pi = 2.0 * cPi;// 6.28318530717;
+static const double cPio180 = cPi / 180.0;// 1.74532925199e-2;
+static const double c180oPi = 180.0 / cPi;// 57.2957795131;
 
 static const double one_over_sqrt2 = 1.0 / sqrt(2.0); // 0.707106781
 static const double one_over_sqrt3 = 1.0 / sqrt(3.0); // 0.577350269
@@ -238,10 +238,10 @@ static constexpr float c10eM30 = 1e-30f;
 static constexpr float c10eM10 = 1e-10f;
 static constexpr float smallSingle = 0.0000000002f;
 
-static constexpr float cPi = 3.1415926535f;
-static constexpr double c2Pi = 6.2831853071f;
-static constexpr float cPio180 = 1.74532925199e-2f;
-static constexpr float c180oPi = 57.2957795131f;
+static const float cPi = 4.0f * std::atan(1.0f);// 3.1415926535f;
+static const double c2Pi = 2.0f * cPi;// 6.2831853071f;
+static const float cPio180 = cPi / 180.0f;// 1.74532925199e-2f;
+static const float c180oPi = 180.0f / cPi;// 57.2957795131f;
 
 static const float one_over_sqrt2 = 1.0 / sqrtf(2.0); // 0.707106781
 static const float one_over_sqrt3 = 1.0 / sqrtf(3.0); // 0.577350269