diff --git a/apps/cpu/MultiphaseSymmetryTest/droplet.cpp b/apps/cpu/MultiphaseSymmetryTest/droplet.cpp
index fc8d28363d683838ead7ce6941d0fd5c89ec4c87..17406ccc6176325c578def9967880de4f0fa8810 100644
--- a/apps/cpu/MultiphaseSymmetryTest/droplet.cpp
+++ b/apps/cpu/MultiphaseSymmetryTest/droplet.cpp
@@ -188,18 +188,22 @@ void run(string configname)
         kernel->setBCSet(bcProc);
 
         SPtr<BC> noSlipBC(new NoSlipBC());
-        noSlipBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNoSlipBCStrategy()));
+
+        SPtr<BCStrategy> noSlipStrategy = std::make_shared<MultiphaseNoSlipBCStrategy>();
+        noSlipBC->setBCStrategy(noSlipStrategy);
 
         SPtr<BC> outflowBC(new DensityBC(rhoLB));
         outflowBC->setBCStrategy(SPtr<BCStrategy>(new MultiphasePressureBCStrategy()));
         //outflowBC->setBCStrategy(SPtr<BCStrategy>(new MultiphaseNonReflectingOutflowBCStrategy()));
+        //outflowBC->setBCStrategy(SPtr<BCStrategy>(new ThixotropyNonReflectingOutflowBCStrategy()));
         
 
         //////////////////////////////////////////////////////////////////////////////////
         // BC visitor
         MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-        bcVisitor.addBC(noSlipBC);
-        bcVisitor.addBC(outflowBC);
+        //NonNewtonianBoundaryConditionsBlockVisitor bcVisitor;
+        //bcVisitor.addBC(noSlipBC);
+        //bcVisitor.addBC(outflowBC);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
         grid->setDeltaX(dx);
@@ -261,7 +265,7 @@ void run(string configname)
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
-            //intHelper.addInteractor(wallYminInt);
+            intHelper.addInteractor(wallYminInt);
             //intHelper.addInteractor(wallYmaxInt);
             intHelper.selectBlocks();
 
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h
new file mode 100644
index 0000000000000000000000000000000000000000..b2d114672e8d3cc103c2b085db12caa414ad8131
--- /dev/null
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h
@@ -0,0 +1,56 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseBCStrategy.h
+//! \ingroup BoundaryConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef MultiphaseBCStrategy_H
+#define MultiphaseBCStrategy_H
+
+#include "BCStrategy.h"
+
+class DistributionArray3D;
+
+class MultiphaseBCStrategy : public BCStrategy
+{
+public:
+    MultiphaseBCStrategy() = default;
+    virtual ~MultiphaseBCStrategy() = default;
+
+    virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
+    virtual void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) {}
+
+protected:
+    SPtr<DistributionArray3D> distributionsH;
+    SPtr<DistributionArray3D> distributionsH2;
+};
+
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
index ef2c7ac21d0ffb25172cba9730d2d1bc3ab527dc..b9e02f9b5f8eece868703e5823ebbb26937c2e7d 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.cpp
@@ -32,74 +32,71 @@
 //=======================================================================================
 
 #include "MultiphaseNoSlipBCStrategy.h"
-#include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
+#include "DistributionArray3D.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseNoSlipBCStrategy::MultiphaseNoSlipBCStrategy()
 {
-   BCStrategy::type = BCStrategy::MultiphaseNoSlipBCStrategy;
-   BCStrategy::preCollision = false;
+    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
 MultiphaseNoSlipBCStrategy::~MultiphaseNoSlipBCStrategy()
 {
-
 }
 //////////////////////////////////////////////////////////////////////////
 SPtr<BCStrategy> MultiphaseNoSlipBCStrategy::clone()
 {
-   SPtr<BCStrategy> bc(new MultiphaseNoSlipBCStrategy());
-   return bc;
+    SPtr<BCStrategy> bc(new MultiphaseNoSlipBCStrategy());
+    return bc;
 }
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distributions)
 {
-   this->distributions = distributions;
+    this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseNoSlipBCStrategy::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
 {
-	this->distributionsH = distributionsH;
+    this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseNoSlipBCStrategy::applyBC()
 {
-   real f[D3Q27System::ENDF+1];
-   real h[D3Q27System::ENDF+1];
-   real h2[D3Q27System::ENDF + 1];
-   //LBMReal feq[D3Q27System::ENDF+1];
-   //LBMReal heq[D3Q27System::ENDF+1];
-   distributions ->getDistributionInv(f, x1, x2, x3);
-   if (distributionsH2)
-       distributionsH2->getDistributionInv(h2, x1, x2, x3);
-   distributionsH->getDistributionInv(h, x1, x2, x3);
-  // LBMReal phi, vx1, vx2, vx3, p1;
-   
- //  D3Q27System::calcDensity(h, phi);
-   
- //  calcMacrosFct(f, p1, vx1, vx2, vx3);
- //  D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
- //  D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); 
+    real f[D3Q27System::ENDF + 1];
+    real h[D3Q27System::ENDF + 1];
+    real h2[D3Q27System::ENDF + 1];
+    // LBMReal feq[D3Q27System::ENDF+1];
+    // LBMReal heq[D3Q27System::ENDF+1];
+    distributions->getDistributionInv(f, x1, x2, x3);
+    if (distributionsH2) distributionsH2->getDistributionInv(h2, x1, x2, x3);
+    distributionsH->getDistributionInv(h, x1, x2, x3);
+    // LBMReal phi, vx1, vx2, vx3, p1;
+
+    //  D3Q27System::calcDensity(h, phi);
 
-   for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
-   {
-      if (bcPtr->hasNoSlipBoundaryFlag(fdir))
-      {
-         //quadratic bounce back
-         const int invDir = D3Q27System::INVDIR[fdir];
-		 real fReturn = f[invDir];
-         distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
-         //distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB 
-         real hReturn = h[invDir];
-		 distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
-         //distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB  
-         if (distributionsH2)
-         {
-             real h2Return = h2[invDir];
-             distributionsH2->setDistributionForDirection(h2Return, x1, x2, x3, invDir);//delay BB
-            // distributionsH2->setDistributionForDirection(h2Return, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+    //  calcMacrosFct(f, p1, vx1, vx2, vx3);
+    //  D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
+    //  D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3);
 
-         }
-      }
-   }
+    for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) {
+        if (bcPtr->hasNoSlipBoundaryFlag(fdir)) {
+            // quadratic bounce back
+            const int invDir = D3Q27System::INVDIR[fdir];
+            real fReturn = f[invDir];
+            distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir],
+                                                       x3 + D3Q27System::DX3[invDir], fdir);
+            // distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB
+            real hReturn = h[invDir];
+            distributionsH->setDistributionForDirection(hReturn, x1 + D3Q27System::DX1[invDir],
+                                                        x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+            // distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB
+            if (distributionsH2) {
+                real h2Return = h2[invDir];
+                distributionsH2->setDistributionForDirection(h2Return, x1, x2, x3, invDir); // delay BB
+                // distributionsH2->setDistributionForDirection(h2Return, x1 + D3Q27System::DX1[invDir], x2 +
+                // D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+            }
+        }
+    }
 }
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
index 390c2952e43398e7437ea61d1bc11890d454b9bc..f9a62a8a47041fd3f50ba350e8856fcde147c710 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNoSlipBCStrategy.h
@@ -34,10 +34,10 @@
 #ifndef MultiphaseNoSlipBCStrategy_h__
 #define MultiphaseNoSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 
 //! A class implements no-slip boundary condition for multiphase simulations
-class MultiphaseNoSlipBCStrategy : public BCStrategy
+class MultiphaseNoSlipBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphaseNoSlipBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
index 34fae58a7cd19d0b19996903ccd713acfadbf03c..1dc704630b56bcbdd8c3fd1337c19eab1e9ee540 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.cpp
@@ -35,11 +35,10 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseNonReflectingOutflowBCStrategy::MultiphaseNonReflectingOutflowBCStrategy()
 {
-    BCStrategy::type = BCStrategyType::NonReflectingOutflowBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
index 3aae2ce0384e67cd0024106fb7de3d9b1b1dd7a8..874a120790300eafffe98d5bf8511565322f83fe 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseNonReflectingOutflowBCStrategy.h
@@ -34,9 +34,9 @@
 #ifndef MultiphaseNonReflectingOutflowBCStrategy_h__
 #define MultiphaseNonReflectingOutflowBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 //! A class implements non reflecting outflow boundary condition for multiphase simulations
-class MultiphaseNonReflectingOutflowBCStrategy : public BCStrategy
+class MultiphaseNonReflectingOutflowBCStrategy : public MultiphaseBCStrategy
 {
 public:
     MultiphaseNonReflectingOutflowBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp
index 0ea532c2b766dbbb741267936599b23fabfaa61d..aa515067756d8dd67bed541d513dfda69b9a525b 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.cpp
@@ -34,12 +34,11 @@
 #include "MultiphasePressureBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 
 MultiphasePressureBCStrategy::MultiphasePressureBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::MultiphasePressureBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h
index cb6c6cf5e8570b40800a7d2bf1c076307d441738..f22efefdd9d7a33adee201061f56e8b298e9beb7 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h
@@ -34,9 +34,9 @@
 #ifndef MultiphasePressureBCStrategy_h__
 #define MultiphasePressureBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 //! A class implements velocity boundary condition for multiphase simulations
-class MultiphasePressureBCStrategy : public BCStrategy
+class MultiphasePressureBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphasePressureBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
index 92bc57c81b7bc5be3a4b5c95547b11f521bc820e..73edf8f99a4ac63f7ea0766c84d673bf44807656 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.cpp
@@ -34,11 +34,10 @@
 #include "MultiphaseSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseSlipBCStrategy::MultiphaseSlipBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::SlipBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
index 1eb25a958505eb2fca2509763acf2f14bdf93414..990615907c981ce0057d7933b72d955a0278d3b4 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h
@@ -34,10 +34,10 @@
 #ifndef MultiphaseSlipBCStrategy_h__
 #define MultiphaseSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 
 //! A class implements slip boundary condition for multiphase simulation
-class MultiphaseSlipBCStrategy : public BCStrategy
+class MultiphaseSlipBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphaseSlipBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
index 6a79904e6fecb1235cad7f3c55c0b48cf8044dd0..b71bb2135b634abe1e58a081be80cfd13eec9cbe 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBC.cpp
@@ -280,7 +280,7 @@ void MultiphaseVelocityBC::adaptBCForDirection( const D3Q27Interactor& interacto
 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->setBCStrategyType(strategyType);
+   bc->setBCStrategyKey(bcStrategyKey);
 }
 /*==========================================================*/
 void MultiphaseVelocityBC::setNodeVelocity( const D3Q27Interactor& interactor, SPtr<BoundaryConditions> bc, const real& worldX1, const real& worldX2, const real& worldX3, const real& timestep) 
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
index dd364e85ec62df4ac1296a21f4aafe8df1576f41..c4755f1789d3d649b79c2eeeea5facace65f8a66 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.cpp
@@ -34,11 +34,10 @@
 #include "MultiphaseVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
+#include "MultiphaseBCStrategyType.h"
 
 MultiphaseVelocityBCStrategy::MultiphaseVelocityBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::MultiphaseVelocityBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
index 4e99c876aca206eae0cae3bcf8c643d9ce930b87..217e141f516f3b409155e99516843c4844680ee7 100644
--- a/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
+++ b/src/cpu/MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h
@@ -34,9 +34,9 @@
 #ifndef MultiphaseVelocityBCStrategy_h__
 #define MultiphaseVelocityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "MultiphaseBCStrategy.h"
 //! A class implements velocity boundary condition for multiphase simulations
-class MultiphaseVelocityBCStrategy : public BCStrategy
+class MultiphaseVelocityBCStrategy : public MultiphaseBCStrategy
 {
 public:
    MultiphaseVelocityBCStrategy();
diff --git a/src/cpu/MultiphaseFlow/MultiphaseFlow.h b/src/cpu/MultiphaseFlow/MultiphaseFlow.h
index 79c2ce8066414bc3a96457e143c9552d6907b663..c7cceb2236bae9db5024dd7f4ea7e59e2c8fca0b 100644
--- a/src/cpu/MultiphaseFlow/MultiphaseFlow.h
+++ b/src/cpu/MultiphaseFlow/MultiphaseFlow.h
@@ -40,7 +40,8 @@
 #include "MultiphaseFlow/BoundaryConditions/MultiphaseVelocityBCStrategy.h"
 #include "MultiphaseFlow/BoundaryConditions/MultiphaseSlipBCStrategy.h"
 #include "MultiphaseFlow/BoundaryConditions/MultiphasePressureBCStrategy.h"
-          
+#include "MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h"
+
 #include "MultiphaseFlow/LBM/MultiphaseCumulantLBMKernel.h"
 #include "MultiphaseFlow/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h"
 #include "MultiphaseFlow/LBM/MultiphasePressureFilterLBMKernel.h"
diff --git a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
index ba8e9c4f1f4dfbdf29997eb81cacfee212044b80..cf2bc27006934b07552f901d3dc9f1c5607e2a59 100644
--- a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
@@ -44,6 +44,7 @@
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "LBMKernel.h"
+#include "MultiphaseFlow/BoundaryConditions/MultiphaseBCStrategy.h"
 
 MultiphaseBoundaryConditionsBlockVisitor::MultiphaseBoundaryConditionsBlockVisitor() :
 Block3DVisitor(0, D3Q27System::MAXLEVEL)
@@ -77,13 +78,6 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
       SPtr<BCArray3D> bcArray = bcSet->getBCArray();
 
       bool compressible = kernel->getCompressible();
-      real collFactorL = kernel->getCollisionFactorL();
-	  real collFactorG = kernel->getCollisionFactorG();
-	  real collFactorPh = 1.0/kernel->getPhaseFieldRelaxation();
-	  real densityRatio = kernel->getDensityRatio();
-	  real phiL = kernel->getPhiL();
-	  real phiH = kernel->getPhiH();
-      //int level = block->getLevel();
 
       int minX1 = 0;
       int minX2 = 0;
@@ -109,19 +103,19 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
                {
                   if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL)
                   {
-                     char alg = bcPtr->getBCStrategyType();
-                     SPtr<BCStrategy> bca = bcMap[alg];
+                     char bcStrategy = bcPtr->getBCStrategyKey();
+                     SPtr<BCStrategy> bca = BCStrategyRegister::getInstance()->getBCStrategy(bcStrategy);
                      
                      if (bca)
                      {
                         bca = bca->clone();
                         bca->setNodeIndex(x1, x2, x3);
                         bca->setBcPointer(bcPtr);
-                        //bca->addDistributions(distributions, distributionsH);
 						bca->addDistributions(distributions);
-						bca->addDistributionsH(distributionsH);
+                        if (distributionsH)
+                            dynamicPointerCast<MultiphaseBCStrategy>(bca)->addDistributionsH(distributionsH);
                         if (distributionsH2)
-                            bca->addDistributionsH2(distributionsH2);
+                            dynamicPointerCast<MultiphaseBCStrategy>(bca)->addDistributionsH2(distributionsH2);
                         bca->setCompressible(compressible);
                         bca->setBcArray(bcArray);
                         bcSet->addBC(bca);
@@ -133,11 +127,7 @@ void MultiphaseBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Blo
       }
    }
 }
-//////////////////////////////////////////////////////////////////////////
-void MultiphaseBoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
-{
-   bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getBCStrategy()));
-}
+
 
 
 
diff --git a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
index cc04246d411dfc91f225598c269c1a10893817f5..22878fb732bc5f4d57e34dc4e4245e1afd55dad6 100644
--- a/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
+++ b/src/cpu/MultiphaseFlow/Visitors/MultiphaseBoundaryConditionsBlockVisitor.h
@@ -35,10 +35,6 @@
 #define MultiphaseBoundaryConditionsBlockVisitor_h__
 
 #include "Block3DVisitor.h"
-#include <map>
-
-class BC;
-class BCStrategy;
 
 class MultiphaseBoundaryConditionsBlockVisitor : public Block3DVisitor
 {
@@ -47,9 +43,5 @@ public:
    virtual ~MultiphaseBoundaryConditionsBlockVisitor();
    
    void visit(SPtr<Grid3D> grid, SPtr<Block3D> block);
-   void addBC(SPtr<BC> bc);
-protected:
-private:
-   std::map<char, SPtr<BCStrategy>> bcMap;
 };
 #endif // MultiphaseBoundaryConditionsBlockVisitor_h__
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h
new file mode 100644
index 0000000000000000000000000000000000000000..0797ee70cb93adf2f8de66fda979cbc785daea1d
--- /dev/null
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h
@@ -0,0 +1,56 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 NonNewtonianBCStrategy.h
+//! \ingroup BoundaryConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef NonNewtonianBCStrategy_H
+#define NonNewtonianBCStrategy_H
+
+#include "BCStrategy.h"
+
+class DistributionArray3D;
+
+class NonNewtonianBCStrategy : public BCStrategy
+{
+public:
+    NonNewtonianBCStrategy() = default;
+    virtual ~NonNewtonianBCStrategy() = default;
+
+    virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
+    virtual void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) {}
+
+protected:
+    SPtr<DistributionArray3D> distributionsH;
+    SPtr<DistributionArray3D> distributionsH2;
+};
+
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
index 24c96da39c87a156574327fb92ad758d2025e639..7707c12d92b69fbceacee99509bd2ca34140c9f9 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelNoSlipBCStrategy.h
@@ -42,19 +42,18 @@ class RheologyBinghamModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 public:
    RheologyBinghamModelNoSlipBCStrategy()
    {
-      BCStrategy::type = BCStrategy::RheologyBinghamModelNoSlipBCStrategy;
-      BCStrategy::preCollision = true;
+       BCStrategy::preCollision = true;
    }
    ~RheologyBinghamModelNoSlipBCStrategy() {}
    SPtr<BCStrategy> clone() override
    {
-      SPtr<BCStrategy> bc(new RheologyBinghamModelNoSlipBCStrategy());
-      return bc;
+       SPtr<BCStrategy> bc(new RheologyBinghamModelNoSlipBCStrategy());
+       return bc;
    }
 protected:
    real getRheologyCollFactor(real omegaInf, real shearRate, real drho) const override 
    { 
-      return Rheology::getBinghamCollFactor(omegaInf, shearRate, drho);
+       return Rheology::getBinghamCollFactor(omegaInf, shearRate, drho);
    }
 };
 #endif // BinghamModelNoSlipBCStrategy_h__
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
index 9039d00addb3c517265dbbcd185bf0e8ce570a9e..f175cc6fb4cb42881809442a8b285cd20a8192c4 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyBinghamModelVelocityBCStrategy.h
@@ -36,14 +36,12 @@
 
 #include "RheologyVelocityBCStrategy.h"
 #include "cpu/NonNewtonianFluids/LBM/Rheology.h"
-#include "BCStrategyType.h"
 
 class RheologyBinghamModelVelocityBCStrategy : public RheologyVelocityBCStrategy
 {
 public:
    RheologyBinghamModelVelocityBCStrategy()
    {
-      BCStrategy::type = BCStrategyType::RheologyBinghamModelVelocityBCStrategy;
       BCStrategy::preCollision = true;
    }
    ~RheologyBinghamModelVelocityBCStrategy() {}
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
index d5aa651d1d57863d4d54f1807e0fc886abe4c9ae..45a9abc16aa53aca3738d6d5f449d3a17c780562 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyHerschelBulkleyModelNoSlipBCStrategy.h
@@ -35,14 +35,12 @@
 
 #include "RheologyNoSlipBCStrategy.h"
 #include "cpu/NonNewtonianFluids/LBM/Rheology.h"
-#include "BCStrategyType.h"
 
 class RheologyHerschelBulkleyModelNoSlipBCStrategy : public RheologyNoSlipBCStrategy
 {
 public:
    RheologyHerschelBulkleyModelNoSlipBCStrategy() 
    {
-      BCStrategy::type = BCStrategyType::RheologyHerschelBulkleyModelNoSlipBCStrategy;
       BCStrategy::preCollision = true;
    }
    ~RheologyHerschelBulkleyModelNoSlipBCStrategy() {}
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
index 611d87bcd3b6e275869b6ec430b7a1f349c0aa3e..ec2aef786d2404a8a885a887a58756446ffcfe2a 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyNoSlipBCStrategy.h
@@ -33,12 +33,12 @@
 #ifndef RheologyNoSlipBCStrategy_h__
 #define RheologyNoSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class RheologyNoSlipBCStrategy : public BCStrategy
+class RheologyNoSlipBCStrategy : public NonNewtonianBCStrategy
 {
 public:
    RheologyNoSlipBCStrategy() = default;
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
index f867ab1dc2df84bb8498728295a1f6d7cf734d83..09a2e906fc7a3a44f35d012d27554b1a08aa37ca 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyPowellEyringModelNoSlipBCStrategy.h
@@ -41,19 +41,18 @@ class RheologyPowellEyringModelNoSlipBCStrategy : public RheologyNoSlipBCStrateg
 public:
    RheologyPowellEyringModelNoSlipBCStrategy() 
    {
-      BCStrategy::type = BCStrategy::RheologyPowellEyringModelNoSlipBCStrategy;
-      BCStrategy::preCollision = true;
+       BCStrategy::preCollision = true;
    }
    ~RheologyPowellEyringModelNoSlipBCStrategy() {}
    SPtr<BCStrategy> clone() override
    {
-      SPtr<BCStrategy> bc(new RheologyPowellEyringModelNoSlipBCStrategy());
-      return bc;
+       SPtr<BCStrategy> bc(new RheologyPowellEyringModelNoSlipBCStrategy());
+       return bc;
    }
 protected:
    real getRheologyCollFactor(real omegaInf, real shearRate, real drho) const override
    {
-      return Rheology::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
+       return Rheology::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
    }
 };
 #endif // RheologyPowellEyringModelNoSlipBCStrategy_h__
\ No newline at end of file
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
index 00c08230cf19fd73bfa56b7949239e62be72fbd4..bb2846871f9f7c12a2d7d2c4a730dd1a5f0ae34a 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/RheologyVelocityBCStrategy.h
@@ -33,12 +33,12 @@
 #ifndef RheologyVelocityBCStrategy_h__
 #define RheologyVelocityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 #include <PointerDefinitions.h>
 
 class DistributionArray3D;
 
-class RheologyVelocityBCStrategy : public BCStrategy
+class RheologyVelocityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
    RheologyVelocityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
index f5db712e0347887805f7abb4ee508ffb047224f6..d9c393df348afd8fdb5133df27b1e239ae69d19d 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.cpp
@@ -34,13 +34,10 @@
 #include "ThixotropyDensityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyDensityBCStrategy::ThixotropyDensityBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyDensityBCStrategy;
 	BCStrategy::preCollision = false;
-	BCStrategy::thixotropy = true;
 	lambdaBC = 0.0;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
index a40500fe5b9e5ca2136bba71e3723e75db33bd50..5dddbefc6b97c27a62eaf53e6d6836a16ae66904 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyDensityBCStrategy.h
@@ -34,10 +34,10 @@
 #ifndef ThixotropyDensityBCStrategy_h__
 #define ThixotropyDensityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
 
-class ThixotropyDensityBCStrategy : public BCStrategy
+class ThixotropyDensityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyDensityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
index 57797d8b8a4525456d586305acff2b7132c6ab44..f8e86ca9d12cf183d43cd9e890a3a97466518a91 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.cpp
@@ -33,14 +33,10 @@
 #include "ThixotropyNoSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyNoSlipBCStrategy::ThixotropyNoSlipBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyNoSlipBCStrategy;
 	BCStrategy::preCollision = false;
-	BCStrategy::thixotropy = true;
-	
 }
 //////////////////////////////////////////////////////////////////////////
 ThixotropyNoSlipBCStrategy::~ThixotropyNoSlipBCStrategy()
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
index edd8952333f9607429e78ea917edf360768743c7..f406bad385766660f67c4dd7527fc22e6f8a2c9d 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNoSlipBCStrategy.h
@@ -33,9 +33,9 @@
 #ifndef ThixotropyNoSlipBCStrategy_h__
 #define ThixotropyNoSlipBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
-class ThixotropyNoSlipBCStrategy : public BCStrategy
+class ThixotropyNoSlipBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyNoSlipBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
index 74f483b41843387ad06d27738e5e60874fc7a3e2..ff71b99eda23c6fabfd73842d43c24dc67fb526a 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.cpp
@@ -33,13 +33,10 @@
 #include "ThixotropyNonReflectingOutflowBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyNonReflectingOutflowBCStrategy::ThixotropyNonReflectingOutflowBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyNonReflectingOutflowBCStrategy;
 	BCStrategy::preCollision = true;
-	BCStrategy::thixotropy = true;
 }
 //////////////////////////////////////////////////////////////////////////
 ThixotropyNonReflectingOutflowBCStrategy::~ThixotropyNonReflectingOutflowBCStrategy()
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
index 7ae90994a13ab1a0842a0abbad596d1762bd4927..5e466a5a55b809390f56c0be779460f2d0dab9b7 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyNonReflectingOutflowBCStrategy.h
@@ -33,10 +33,10 @@
 #ifndef ThixotropyNonReflectingOutflowBCStrategy_h__
 #define ThixotropyNonReflectingOutflowBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
 
-class ThixotropyNonReflectingOutflowBCStrategy : public BCStrategy
+class ThixotropyNonReflectingOutflowBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyNonReflectingOutflowBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
index ee1e75cb97fc32f5dfa5a8c6d79eb4a09f982462..2e69dbaf971350279f34101c783b7f03f9802209 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.cpp
@@ -33,13 +33,10 @@
 #include "ThixotropyVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 ThixotropyVelocityBCStrategy::ThixotropyVelocityBCStrategy()
 {
-	BCStrategy::type = BCStrategyType::ThixotropyVelocityBCStrategy;
 	BCStrategy::preCollision = false;
-	BCStrategy::thixotropy = true;
 	lambdaBC = vf::basics::constant::c0o1;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
index 93cf6d2206efe942c57024e979ef9a4f970c2807..aa08f4716079defc80256f57bb005c029af024b4 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityBCStrategy.h
@@ -33,10 +33,10 @@
 #ifndef ThixotropyVelocityBCStrategy_h__
 #define ThixotropyVelocityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.h"
 
 
-class ThixotropyVelocityBCStrategy : public BCStrategy
+class ThixotropyVelocityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
 	ThixotropyVelocityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
index 604260918c7e50095dcab865fb197417847f2add..fb43ccc69f94a203932e56fa1efae68ae4759475 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "ThixotropyVelocityWithDensityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BCArray3D.h"
-#include "BCStrategyType.h"
 
 ThixotropyVelocityWithDensityBCStrategy::ThixotropyVelocityWithDensityBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::ThixotropyVelocityWithDensityBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
index 74d33efc0a1dbb693280665d0d27e541081b2fd3..f590c9cffa62caebed9a7fc2ea5fa00c8b9a20ea 100644
--- a/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
+++ b/src/cpu/NonNewtonianFluids/BoundaryConditions/ThixotropyVelocityWithDensityBCStrategy.h
@@ -34,14 +34,14 @@
 #ifndef ThixotropyVelocityWithDensityBCStrategy_h__
 #define ThixotropyVelocityWithDensityBCStrategy_h__
 
-#include "BCStrategy.h"
+#include "NonNewtonianBCStrategy.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 ThixotropyVelocityWithDensityBCStrategy : public BCStrategy
+class ThixotropyVelocityWithDensityBCStrategy : public NonNewtonianBCStrategy
 {
 public:
    ThixotropyVelocityWithDensityBCStrategy();
diff --git a/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h b/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h
index 705a07af12b8ad8d32632d28dde5f4cd4b127173..de4bea429adcb1d919504fcb2fcbd0a224794419 100644
--- a/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h
+++ b/src/cpu/NonNewtonianFluids/NonNewtonianFluids.h
@@ -56,4 +56,6 @@
 #include "NonNewtonianFluids/LBM/RheologyK17LBMKernel.h"
 #include "NonNewtonianFluids/LBM/RheologyPowellEyringModelLBMKernel.h"
 
+#include "NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h"
+
 #endif
\ No newline at end of file
diff --git a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.cpp
similarity index 63%
rename from src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp
rename to src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.cpp
index 2bb8da69a578067d17d2590ebe18e4b2775718aa..77f064fb9e4ddc3e161c09c0155fb3caafe60333 100644
--- a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.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 BoundaryConditionsBlockVisitor.cpp
+//! \file NonNewtonianBoundaryConditionsBlockVisitor.cpp
 //! \ingroup Visitors
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "BoundaryConditionsBlockVisitor.h"
+#include "NonNewtonianBoundaryConditionsBlockVisitor.h"
 #include "BC.h"
 #include "BCArray3D.h"
 #include "BCSet.h"
@@ -44,22 +44,17 @@
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "ILBMKernel.h"
-#include "BCStrategyType.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"
 
+#include "NonNewtonianFluids/BoundaryConditions/NonNewtonianBCStrategy.h"
 
-BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
+NonNewtonianBoundaryConditionsBlockVisitor::NonNewtonianBoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-BoundaryConditionsBlockVisitor::~BoundaryConditionsBlockVisitor() = default;
+NonNewtonianBoundaryConditionsBlockVisitor::~NonNewtonianBoundaryConditionsBlockVisitor() = default;
 //////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
+void NonNewtonianBoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
     if (block->getRank() == grid->getRank()) {
         SPtr<ILBMKernel> kernel = block->getKernel();
@@ -90,14 +85,16 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         bcSet->clearBC();
 
         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
+        SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
+        SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions();
 
         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];
+                            char bcStrategy = bcPtr->getBCStrategyKey();
+                            SPtr<BCStrategy> bca = BCStrategyRegister::getInstance()->getBCStrategy(bcStrategy);
 
                             if (bca) {
                                 bca = bca->clone();
@@ -106,21 +103,10 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
                                 bca->setBcPointer(bcPtr);
                                 bca->addDistributions(distributions);
 
-                                if (alg == BCStrategyType::ThixotropyVelocityBCStrategy)
-                                    std::static_pointer_cast<ThixotropyVelocityBCStrategy>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyDensityBCStrategy)
-                                    std::static_pointer_cast<ThixotropyDensityBCStrategy>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyNoSlipBCStrategy)
-                                    std::static_pointer_cast<ThixotropyNoSlipBCStrategy>(bca)->addDistributionsH(
-                                        kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyNonReflectingOutflowBCStrategy)
-                                    std::static_pointer_cast<ThixotropyNonReflectingOutflowBCStrategy>(bca)
-                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
-                                if (alg == BCStrategyType::ThixotropyVelocityWithDensityBCStrategy)
-                                    std::static_pointer_cast<ThixotropyVelocityWithDensityBCStrategy>(bca)
-                                        ->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                                if (distributionsH)
+                                    dynamicPointerCast<NonNewtonianBCStrategy>(bca)->addDistributionsH(distributionsH);
+                                if (distributionsH2)
+                                    dynamicPointerCast<NonNewtonianBCStrategy>(bca)->addDistributionsH2(distributionsH2);
 
                                 bca->setCollFactor(collFactor);
                                 bca->setCompressible(compressible);
@@ -134,8 +120,3 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         }
     }
 }
-//////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
-{
-    bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getBCStrategy()));
-}
diff --git a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h
similarity index 85%
rename from src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h
rename to src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h
index 8954bf73a6a459a795e916f24192f5db698b1426..759fef3b89a58e123067a93b18c87f7db664ef19 100644
--- a/src/cpu/NonNewtonianFluids/Visitors/RheologyBoundaryConditionsBlockVisitor.h
+++ b/src/cpu/NonNewtonianFluids/Visitors/NonNewtonianBoundaryConditionsBlockVisitor.h
@@ -26,36 +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 BoundaryConditionsBlockVisitor.h
+//! \file NonNewtonianBoundaryConditionsBlockVisitor.h
 //! \ingroup Visitors
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef BoundaryConditionBlockVisitor_h__
-#define BoundaryConditionBlockVisitor_h__
+#ifndef NonNewtonianBoundaryConditionsBlockVisitor_h__
+#define NonNewtonianBoundaryConditionsBlockVisitor_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
+class NonNewtonianBoundaryConditionsBlockVisitor : public Block3DVisitor
 {
 public:
-    BoundaryConditionsBlockVisitor();
-    ~BoundaryConditionsBlockVisitor() override;
+    NonNewtonianBoundaryConditionsBlockVisitor();
+    ~NonNewtonianBoundaryConditionsBlockVisitor() 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/VirtualFluidsCore/BoundaryConditions/BC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f6bc5c635736d6faa7652303187899cee76349ea
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.cpp
@@ -0,0 +1,3 @@
+#include "BC.h"
+
+char BC::keyCounter = 0;
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
index 5c699bf28078d904d7540f129efe8051cda4935b..279b72d7a462a5f231676d97ba5bd85b72f3ea42 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BC.h
@@ -37,6 +37,7 @@
 
 #include "BCStrategy.h"
 #include "BoundaryConditions.h"
+#include "BCStrategyRegister.h"
 
 class D3Q27Interactor;
 
@@ -66,24 +67,27 @@ public:
                                      const real &worldX1, const real &worldX2, const real &worldX3,
                                      const real &q, const int &fdirection, const real &time = 0) = 0;
 
-    void setBCStrategy(SPtr<BCStrategy> alg)
+    void setBCStrategy(SPtr<BCStrategy> bcStrategy)
     {
-        strategyType = alg->getType();
-        strategy     = alg;
+        bcStrategyKey = keyCounter++; 
+        BCStrategyRegister::getInstance()->setBCStrategy(bcStrategyKey, bcStrategy);
     }
-    SPtr<BCStrategy> getBCStrategy() { return strategy; }
-    char getBCStrategyType() { return strategyType; }
+    //SPtr<BCStrategy> getBCStrategy() { return bcStrategy; }
+    //char getBCStrategyKey() { return bcStrategyKey; }
 
 protected:
     short secondaryBcOption{ 0 };
 
     char type{ 0 };
 
-    SPtr<BCStrategy> strategy;
-    char strategyType{ -1 };
+    char bcStrategyKey{ -1 };
 
     static const char TIMEDEPENDENT = 1 << 0; //'1';
     static const char TIMEPERIODIC  = 1 << 1; //'2';
+
+    static char keyCounter;
 };
 
+
+
 #endif // D3Q27BOUNDARYCONDITIONADAPTER_H
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
index e5c98ecb8a133b4fc83173ed6197287b1650d370..7308548c3e94ce1fc2354f2f211307f4b96688da 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.cpp
@@ -73,8 +73,6 @@ void BCStrategy::setCompressible(bool c)
 //////////////////////////////////////////////////////////////////////////
 void BCStrategy::setCollFactor(real cf) { collFactor = cf; }
 //////////////////////////////////////////////////////////////////////////
-char BCStrategy::getType() { return type; }
-//////////////////////////////////////////////////////////////////////////
 bool BCStrategy::isPreCollision() { return preCollision; }
 //////////////////////////////////////////////////////////////////////////
 SPtr<BCArray3D> BCStrategy::getBcArray() { return bcArray; }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
index 348b3b3d315d1707096dedb230cc092e4384d6f7..6d91cfebbcd95be3d6a7d49ef000642d704c52c7 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategy.h
@@ -47,64 +47,29 @@ class Block3D;
 //! \details  BCStrategy provides interface for implementation of diferent boundary conditions
 class BCStrategy
 {
-//public:
-//    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;
-//    static const char MultiphasePressureBCStrategy                 = 24;
-
 public:
     BCStrategy() = default;
     virtual ~BCStrategy() = default;
 
     virtual void addDistributions(SPtr<DistributionArray3D> distributions)   = 0;
-    virtual void addDistributionsH(SPtr<DistributionArray3D> distributionsH) {}
-    virtual void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) {}
     void setBlock(SPtr<Block3D> block);
     void setNodeIndex(int x1, int x2, int x3);
     void setBcPointer(SPtr<BoundaryConditions> bcPtr);
     void setCompressible(bool c);
     void setCollFactor(real cf);
 
-    char getType();
     bool isPreCollision();
     virtual SPtr<BCStrategy> clone() = 0;
     SPtr<BCArray3D> getBcArray();
     void setBcArray(SPtr<BCArray3D> bcarray);
     virtual void applyBC() = 0;
-    bool getThixotropy(){ return thixotropy; };
 
 protected:
     bool compressible { false };
-    char type;
     bool preCollision;
-    bool thixotropy { false };
 
     SPtr<BoundaryConditions> bcPtr;
     SPtr<DistributionArray3D> distributions;
-    SPtr<DistributionArray3D> distributionsH;
-    SPtr<DistributionArray3D> distributionsH2;
     SPtr<BCArray3D> bcArray;
     SPtr<Block3D> block;
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fafff9e248a11e094f39ef4284ebe8747893868d
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.cpp
@@ -0,0 +1,25 @@
+#include "BCStrategyRegister.h"
+#include "BC.h"
+#include "BCStrategy.h"
+
+std::mutex BCStrategyRegister::instantiation_mutex = std::mutex();
+std::shared_ptr<BCStrategyRegister> BCStrategyRegister::instance = std::shared_ptr<BCStrategyRegister>();
+
+std::shared_ptr<BCStrategyRegister> BCStrategyRegister::getInstance()
+{
+    std::lock_guard<std::mutex> myLock(instantiation_mutex);
+    if (!instance) {
+        instance = std::shared_ptr<BCStrategyRegister>(new BCStrategyRegister);
+    }
+    return instance;
+}
+
+void BCStrategyRegister::setBCStrategy(char strategyKey, std::shared_ptr<BCStrategy> bcStrategy)
+{
+    bcMap.insert(std::make_pair(strategyKey, bcStrategy));
+}
+
+std::shared_ptr<BCStrategy> BCStrategyRegister::getBCStrategy(char strategyKey)
+{
+    return bcMap[strategyKey];
+}
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyType.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.h
similarity index 58%
rename from src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyType.h
rename to src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.h
index fccdef64f3d7103d31369f04189d2bfa59a6e2e3..57cb089fefca2b48d7878eac0ab45aec0821811f 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyType.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCStrategyRegister.h
@@ -26,41 +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 BCStrategy.h
+//! \file BCStrategyRegister.h
 //! \ingroup BoundarConditions
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef BCStrategyType_H
-#define BCStrategyType_H
+#ifndef BCStrategyRegister_H
+#define BCStrategyRegister_H
 
-struct BCStrategyType
+#include <memory>
+#include <map>
+#include <mutex>
+
+class BC;
+class BCStrategy;
+
+class BCStrategyRegister
 {
-    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;
-    static const char MultiphasePressureBCStrategy = 24;
-};
+public:
+    BCStrategyRegister(const BCStrategyRegister &) = delete;
+    BCStrategyRegister &operator=(const BCStrategyRegister &rhs) = delete;
+    static std::shared_ptr<BCStrategyRegister> getInstance();
 
+    virtual ~BCStrategyRegister() = default;
+
+    void setBCStrategy(char bcStrategyKey, std::shared_ptr<BCStrategy> bcStrategy);
+    std::shared_ptr<BCStrategy> getBCStrategy(char type);
+
+private:
+    BCStrategyRegister() = default;
+    static std::mutex instantiation_mutex;
+    static std::shared_ptr<BCStrategyRegister> instance;
+  
+    std::map<char, std::shared_ptr<BCStrategy>> bcMap;
+};
 #endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
index 92cfb6f3cbf347eee7e8fec95c27d7a5646db3b5..cbcc2b0da82bfd44eaeb5ff090adb246fc27c815 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
@@ -311,8 +311,8 @@ public:
         return (((flag >> (optionDigits * direction)) & maxOptionVal) != 0);
     }
 
-    void setBCStrategyType(char alg) { algorithmType = alg; }
-    char getBCStrategyType() { return algorithmType; }
+    void setBCStrategyKey(char key) { bcStrategyKey = key; }
+    char getBCStrategyKey() { return bcStrategyKey; }
 
 public:
     static const int optionDigits = 2;   //--> 2 bits for secondary Option --> maxOptionVal = 7
@@ -335,7 +335,7 @@ protected:
 
     float nx1{ vf::basics::constant::c0o1 }, nx2{ vf::basics::constant::c0o1 }, nx3{ vf::basics::constant::c0o1 };
 
-    char algorithmType { -1 };
+    char bcStrategyKey { -1 };
 
 private:
     friend class MPIIORestartSimulationObserver;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
index 5dacf756ceaaf28771f1c748bc87283636621c99..1256cfc75af243d47b7b68a484300488acf66968 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityBC.cpp
@@ -149,7 +149,7 @@ void DensityBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditio
                                const real &worldX2, const real &worldX3, const real &time)
 {
     this->setNodeDensity(interactor, bc, worldX1, worldX2, worldX3, time);
-    bc->setBCStrategyType(strategyType);
+    bc->setBCStrategyKey(bcStrategyKey);
 }
 /*==========================================================*/
 void DensityBC::setNodeDensity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
index 720ad7cc37e23f78cfb21ead9c5212509d8ac152..26004e89bfbfa9e8c87e64199ad285593ecd61a9 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "EqDensityBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 EqDensityBCStrategy::EqDensityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::EqDensityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
index 1556be3eea5c4d64604db4bd5e6c0335af551087..cae6af9edb183d7bdff8208bf530a502cde9abf9 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/HighViscosityNoSlipBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "HighViscosityNoSlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 HighViscosityNoSlipBCStrategy::HighViscosityNoSlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::HighViscosityNoSlipBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h
new file mode 100644
index 0000000000000000000000000000000000000000..ae5d830b20b09e8a7707c45a56f73d2314f871dc
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseBCStrategyType.h
@@ -0,0 +1,73 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 BCStrategy.h
+//! \ingroup BoundarConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef MultiphaseBCStrategyType_H
+#define MultiphaseBCStrategyType_H
+
+struct MultiphaseBCStrategyType
+{
+    //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;
+    //static const char MultiphasePressureBCStrategy = 24;
+
+
+    static const char MultiphaseNoSlipBCStrategy = 0;
+    static const char MultiphaseVelocityBCStrategy = 1;
+    static const char MultiphasePressureBCStrategy = 2;
+    static const char MultiphaseNonReflectingOutflowBCStrategy = 3;
+    static const char MultiphaseSlipBCStrategy = 4;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
index fdb8e58542d6c3329a95fde10b1f668420870f50..28c1f2ed132b6c144f317044e021cf909e81efd8 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBC.h
@@ -56,7 +56,7 @@ public:
     void adaptBC(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc, const real & /*worldX1*/,
                  const real & /*worldX2*/, const real & /*worldX3*/, const real & /*time*/ = 0) override
     {
-        bc->setBCStrategyType(strategyType);
+        bc->setBCStrategyKey(bcStrategyKey);
     }
 
 private:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
index 1c3cef76320fb6806053356afff84c2642fb7888..45c2ea759bec8055a96761be6292ffa0577e91bb 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipBCStrategy.cpp
@@ -34,11 +34,9 @@
 #include "NoSlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NoSlipBCStrategy::NoSlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NoSlipBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
index fd2ed61b86c4b57d523dac2d5482eb32e5a5cae3..dd27f84e92e81cb775f575266d58e8d8220de50c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCStrategy.cpp
@@ -34,11 +34,9 @@
 
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonEqDensityBCStrategy::NonEqDensityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonEqDensityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
index a9abc090c0449bf46bdd89cb37b7c0d73fbeda3d..066f59c00d3dbfc20271b808ffa196037be0bb56 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingInflowBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonReflectingInflowBCStrategy::NonReflectingInflowBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonReflectingInflowBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
index 8885e6c614f5a80bca30abfa49739079f3930fb1..637787dc0f9dcac4a90d3f76cac8316effd9544f 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonReflectingOutflowBCStrategy::NonReflectingOutflowBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonReflectingOutflowBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
index c69d86ba30c76bd171be9555823f10808b54dcc6..0e7be0e3de4f53ee73233bfbced9f35a8c38f57a 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowWithRelaxationBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 NonReflectingOutflowWithRelaxationBCStrategy::NonReflectingOutflowWithRelaxationBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::NonReflectingOutflowWithRelaxationBCStrategy;
     BCStrategy::preCollision = true;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
index 79edfb8e76689e355a1bc97ab11603b73d927caa..c06725760720a6d1c0ac4d238e9171ca146031bc 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "SimpleSlipBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 SimpleSlipBCStrategy::SimpleSlipBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::SimpleSlipBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
index 03a3aeb1bb0a0316013eb89f3bed6ad156712a57..b37d04922d4df90674f9d6861cf1bfdf0496f9df 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCStrategy.cpp
@@ -34,11 +34,9 @@
 #include "SimpleVelocityBCStrategy.h"
 #include "DistributionArray3D.h"
 #include "BoundaryConditions.h"
-#include "BCStrategyType.h"
 
 SimpleVelocityBCStrategy::SimpleVelocityBCStrategy()
 {
-   BCStrategy::type = BCStrategyType::SimpleVelocityBCStrategy;
    BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
index 7f5e69835c803a898d8b9d4d6cff31b8be5f2a05..35b9e22ec44bbbda79f9c6d6b15ce84ca5107e16 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBC.cpp
@@ -71,5 +71,5 @@ void SlipBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditions>
     else if (bc->hasSlipBoundaryFlag(DIR_00M))
         bc->setNormalVector(vf::basics::constant::c0o1, vf::basics::constant::c0o1, -vf::basics::constant::c1o1);
 
-    bc->setBCStrategyType(strategyType);
+    bc->setBCStrategyKey(bcStrategyKey);
 }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
index f0e246e57e92df2a0004d077f38f5dc53aa0e04d..1c8938e984ad38eb85acde5c0995479fd2318d21 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCStrategy.cpp
@@ -1,11 +1,9 @@
 #include "SlipBCStrategy.h"
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 SlipBCStrategy::SlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::SlipBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
index b89b015c27c2e11a222b99bb1135edb39ba23536..f7413101a18b07ca4ab95cb128fb625470c1ed8c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallBCSet.cpp
@@ -35,7 +35,6 @@
 #include "ThinWallNoSlipBCStrategy.h"
 
 #include "LBMKernel.h"
-#include "BCStrategyType.h"
 
 //////////////////////////////////////////////////////////////////////////
 ThinWallBCSet::ThinWallBCSet(SPtr<ILBMKernel> kernel) : BCSet(kernel) {}
@@ -51,7 +50,7 @@ void ThinWallBCSet::applyPostCollisionBC()
     BCSet::applyPostCollisionBC();
 
     for (SPtr<BCStrategy> bc : postBC) {
-        if (bc->getType() == BCStrategyType::ThinWallNoSlipBCStrategy) {
+        if (dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->isThinWallNoSlipBCStrategy()) {
             dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->setPass(2);
             bc->applyBC();
             dynamicPointerCast<ThinWallNoSlipBCStrategy>(bc)->setPass(1);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
index 3d78fd9cc4c39933f3fa2c65b07e18ed6f88cc0c..01f0d6a4c2fb1fbf099cd0a3a8372fcd4eb5f16c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.cpp
@@ -34,11 +34,9 @@
 
 #include "BoundaryConditions.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
-#include "BCStrategyType.h"
 
 ThinWallNoSlipBCStrategy::ThinWallNoSlipBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::ThinWallNoSlipBCStrategy;
     BCStrategy::preCollision = false;
     pass                      = 1;
 }
@@ -91,4 +89,12 @@ void ThinWallNoSlipBCStrategy::addDistributions(SPtr<DistributionArray3D> distri
     this->distributions = distributions;
 }
 //////////////////////////////////////////////////////////////////////////
-void ThinWallNoSlipBCStrategy::setPass(int pass) { this->pass = pass; }
+void ThinWallNoSlipBCStrategy::setPass(int pass)
+{
+    this->pass = pass;
+}
+
+bool ThinWallNoSlipBCStrategy::isThinWallNoSlipBCStrategy()
+{
+    return true;
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
index deba685a3b2a4d28f32406c4f5048520a2c46959..441d575ddf76bc137299a6a2b28c994874798287 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThinWallNoSlipBCStrategy.h
@@ -46,6 +46,7 @@ public:
     SPtr<BCStrategy> clone() override;
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void setPass(int pass);
+    bool isThinWallNoSlipBCStrategy();
     void applyBC() override;
 
 protected:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
index 4318cfabb7619241003f279ccd1a29168d41e7b0..d88ab8934ce1ed10efe68efc6ebf89bb92ac009f 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBC.cpp
@@ -302,7 +302,7 @@ void VelocityBC::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryConditi
                                 const real &worldX2, const real &worldX3, const real &time)
 {
     this->setNodeVelocity(interactor, bc, worldX1, worldX2, worldX3, time);
-    bc->setBCStrategyType(strategyType);
+    bc->setBCStrategyKey(bcStrategyKey);
 }
 /*==========================================================*/
 void VelocityBC::setNodeVelocity(const D3Q27Interactor & /*interactor*/, SPtr<BoundaryConditions> bc,
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
index c5a15631f1488e0aea59de7c5d6c8a0e76d5ddb5..1b84b2de61ab3c5cb5e7927ff906cb26c2470753 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityBCStrategy.cpp
@@ -35,11 +35,9 @@
 #include "BoundaryConditions.h"
 #include "DistributionArray3D.h"
 #include "Block3D.h"
-#include "BCStrategyType.h"
 
 VelocityBCStrategy::VelocityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::VelocityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
index aa8dc479d406c7fface1cde028d3c2c5310ee13b..b6a2548ae4422acc87e95408c383e00c4b4fc847 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCStrategy.cpp
@@ -33,11 +33,9 @@
 #include "VelocityWithDensityBCStrategy.h"
 #include "BCArray3D.h"
 #include "DistributionArray3D.h"
-#include "BCStrategyType.h"
 
 VelocityWithDensityBCStrategy::VelocityWithDensityBCStrategy()
 {
-    BCStrategy::type         = BCStrategyType::VelocityWithDensityBCStrategy;
     BCStrategy::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
index dd5b9935a99e6ad1da05cb48a18b0c5ef12090ac..cb0ed85782f9b8bbdda8b4243f622cc4407df519 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
+++ b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
@@ -124,7 +124,7 @@ struct BoundaryCondition {
     float nx1, nx2, nx3;    //  not double!!!
     float  q[26];           //  not double!!!
 
-    char algorithmType;
+    char bcStrategyKey;
 };
 
 //! \struct boundCondParam
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
index 456c92eb08414655764bcd41f90c6f1973aa4fc8..068390833729d9877220614f2db1e59500519ac8 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
@@ -705,7 +705,7 @@ void MPIIOMigrationBESimulationObserver::writeBoundaryConds(int step)
                     bouCond->nx3                    = bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
+                    bouCond->bcStrategyKey = bcArr->bcvector[bc]->getBCStrategyKey();
                 }
 
                 bcVector[ic].push_back(*bouCond);
@@ -1668,7 +1668,7 @@ void MPIIOMigrationBESimulationObserver::readBoundaryConds(int step)
                     bc->nx3 = bcArray[ibc].nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bc->setQ(bcArray[ibc].q[iq], iq);
-                    bc->setBCStrategyType(bcArray[ibc].algorithmType);
+                    bc->setBCStrategyKey(bcArray[ibc].bcStrategyKey);
                 }
 
                 bcVector.push_back(bc);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
index 590a2812be5ad2a211200023dc14da17ecae1619..b6ea1bbf6b8bc0135330f70f9847743e16086d42 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
@@ -786,7 +786,7 @@ void MPIIOMigrationSimulationObserver::writeBoundaryConds(int step)
                     bouCond->nx3                    = bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
+                    bouCond->bcStrategyKey = bcArr->bcvector[bc]->getBCStrategyKey();
                 }
 
                 bcVector[ic].push_back(*bouCond);
@@ -1477,7 +1477,7 @@ void MPIIOMigrationSimulationObserver::readBoundaryConds(int step)
                     bc->nx3 = bcArray[ibc].nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bc->setQ(bcArray[ibc].q[iq], iq);
-                    bc->setBCStrategyType(bcArray[ibc].algorithmType);
+                    bc->setBCStrategyKey(bcArray[ibc].bcStrategyKey);
                 }
 
                 bcVector.push_back(bc);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
index 07a63a48bee9d81d467af672c290a7528008a7eb..87de527b6e7c0af133f18f861e121c8f806a0a44 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
@@ -859,7 +859,7 @@ void MPIIORestartSimulationObserver::writeBoundaryConds(int step)
                     bouCond->nx3                    = bcArr->bcvector[bc]->nx3;
                     for (int iq = 0; iq < 26; iq++)
                         bouCond->q[iq] = bcArr->bcvector[bc]->getQ(iq);
-                    bouCond->algorithmType = bcArr->bcvector[bc]->getBCStrategyType();
+                    bouCond->bcStrategyKey = bcArr->bcvector[bc]->getBCStrategyKey();
                 }
 
                 bcVector.push_back(*bouCond);
@@ -1546,7 +1546,7 @@ void MPIIORestartSimulationObserver::readBoundaryConds(int step)
                 bc->nx3 = bcArray[index].nx3;
                 for (int iq = 0; iq < 26; iq++)
                     bc->setQ(bcArray[index].q[iq], iq);
-                bc->setBCStrategyType(bcArray[index].algorithmType);
+                bc->setBCStrategyKey(bcArray[index].bcStrategyKey);
             }
 
             bcVector.push_back(bc);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
index af0fb29ca6fb43ea6727e2cabed6482f7ed9f512..d379284f06967b8d170debe85e88f3f4cf184c05 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
@@ -88,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->getBCStrategyType();
-                            SPtr<BCStrategy> bca = bcMap[alg];
+                            char bcStrategyKey = bcPtr->getBCStrategyKey();
+                            SPtr<BCStrategy> bca = BCStrategyRegister::getInstance()->getBCStrategy(bcStrategyKey);
 
                             if (bca) {
                                 bca = bca->clone();
@@ -109,8 +109,4 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
         }
     }
 }
-//////////////////////////////////////////////////////////////////////////
-void BoundaryConditionsBlockVisitor::addBC(SPtr<BC> bc)
-{
-    bcMap.insert(std::make_pair(bc->getBCStrategyType(), bc->getBCStrategy()));
-}
+
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
index 8954bf73a6a459a795e916f24192f5db698b1426..61697735b617ec5480c138286dd4146e56f0b1f2 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.h
@@ -35,14 +35,11 @@
 #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
@@ -52,10 +49,6 @@ public:
     ~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__