diff --git a/pythonbindings/src/cpu/submodules/boundaryconditions.cpp b/pythonbindings/src/cpu/submodules/boundaryconditions.cpp
index d7cd0b578a52c369923db0e31b01200f0389c9eb..8ab64a7a5037d134563eaac4e836f72e89c4ec77 100644
--- a/pythonbindings/src/cpu/submodules/boundaryconditions.cpp
+++ b/pythonbindings/src/cpu/submodules/boundaryconditions.cpp
@@ -30,16 +30,17 @@
 //! \ingroup submodules
 //! \author Sven Marcus, Henry Korb
 //=======================================================================================
+#include "BCStrategy.h"
 #include <pybind11/pybind11.h>
 #include <pybind11/stl.h>
-#include <BoundaryConditions/DensityBCAdapter.h>
-#include <BoundaryConditions/NonReflectingOutflowBCAlgorithm.h>
-#include <BoundaryConditions/BCAdapter.h>
-#include <BoundaryConditions/NoSlipBCAdapter.h>
-#include <BoundaryConditions/VelocityBCAdapter.h>
-#include <BoundaryConditions/NoSlipBCAlgorithm.h>
-#include <BoundaryConditions/VelocityBCAlgorithm.h>
-#include <BoundaryConditions/HighViscosityNoSlipBCAlgorithm.h>
+#include <BoundaryConditions/DensityBC.h>
+#include <BoundaryConditions/NonReflectingOutflowBCStrategy.h>
+#include <BoundaryConditions/BC.h>
+#include <BoundaryConditions/NoSlipBC.h>
+#include <BoundaryConditions/VelocityBC.h>
+#include <BoundaryConditions/NoSlipBCStrategy.h>
+#include <BoundaryConditions/VelocityBCStrategy.h>
+#include <BoundaryConditions/HighViscosityNoSlipBCStrategy.h>
 
 namespace boundaryconditions
 {
@@ -47,35 +48,35 @@ namespace boundaryconditions
     using namespace py::literals;
 
     template<class adapter, class algorithm,
-            class = std::enable_if_t<std::is_base_of<BCAdapter, adapter>::value>,
-            class = std::enable_if_t<std::is_base_of<BCAlgorithm, algorithm>::value>>
+            class = std::enable_if_t<std::is_base_of<BC, adapter>::value>,
+            class = std::enable_if_t<std::is_base_of<BCStrategy, algorithm>::value>>
     class PyBoundaryCondition : public adapter
     {
     public:
         template<typename ...Args>
         PyBoundaryCondition(Args &&... args) : adapter(std::forward<Args>(args)...)
         {
-            this->setBcAlgorithm(std::make_shared<algorithm>());
+            this->setBCStrategy(std::make_shared<algorithm>());
         }
     };
 
     template<class adapter, class algorithm>
-    using bc_class = py::class_<PyBoundaryCondition<adapter, algorithm>, BCAdapter,
+    using bc_class = py::class_<PyBoundaryCondition<adapter, algorithm>, BC,
             std::shared_ptr<PyBoundaryCondition<adapter, algorithm>>>;
 
     void makeModule(py::module_ &parentModule)
     {
         py::module_ bcModule = parentModule.def_submodule("boundaryconditions");
 
-        auto _ = py::class_<BCAdapter, std::shared_ptr<BCAdapter>>(bcModule, "BCAdapter");
+        auto _ = py::class_<BC, std::shared_ptr<BC>>(bcModule, "BC");
 
-        bc_class<NoSlipBCAdapter, NoSlipBCAlgorithm>(bcModule, "NoSlipBoundaryCondition")
+        bc_class<NoSlipBC, NoSlipBCStrategy>(bcModule, "NoSlipBoundaryCondition")
                 .def(py::init());
 
-        bc_class<NoSlipBCAdapter, HighViscosityNoSlipBCAlgorithm>(bcModule, "HighViscosityNoSlipBoundaryCondition")
+        bc_class<NoSlipBC, HighViscosityNoSlipBCStrategy>(bcModule, "HighViscosityNoSlipBoundaryCondition")
                 .def(py::init());
 
-        bc_class<VelocityBCAdapter, VelocityBCAlgorithm>(bcModule, "VelocityBoundaryCondition")
+        bc_class<VelocityBC, VelocityBCStrategy>(bcModule, "VelocityBoundaryCondition")
                 .def(py::init())
                 .def(py::init<bool &, bool &, bool &, mu::Parser &, real &, real &>(),
                      "vx1"_a, "vx2"_a, "vx3"_a,
@@ -89,7 +90,7 @@ namespace boundaryconditions
                      "vx2"_a, "vx2_start_time"_a, "vx2_end_time"_a,
                      "vx3"_a, "vx3_start_time"_a, "vx3_end_time"_a);
 
-        bc_class<DensityBCAdapter, NonReflectingOutflowBCAlgorithm>(bcModule, "NonReflectingOutflow")
+        bc_class<DensityBC, NonReflectingOutflowBCStrategy>(bcModule, "NonReflectingOutflow")
                 .def(py::init());
     }
 
diff --git a/pythonbindings/src/cpu/submodules/simulationconfig.cpp b/pythonbindings/src/cpu/submodules/simulationconfig.cpp
index 09d91f44e85f03c6150c56ce5762e7629212fba0..282b51fbfc986d20a27ee57c6f8e3b716ad34a06 100644
--- a/pythonbindings/src/cpu/submodules/simulationconfig.cpp
+++ b/pythonbindings/src/cpu/submodules/simulationconfig.cpp
@@ -39,16 +39,16 @@ namespace simulation
 
     void makeModule(py::module_ &parentModule)
     {
-        py::class_<Simulation, std::shared_ptr<Simulation>>(parentModule, "Simulation")
+        py::class_<CPUSimulation, std::shared_ptr<CPUSimulation>>(parentModule, "Simulation")
                 .def(py::init())
-                .def("set_writer", &Simulation::setWriterConfiguration)
-                .def("set_grid_parameters", &Simulation::setGridParameters)
-                .def("set_physical_parameters", &Simulation::setPhysicalParameters)
-                .def("set_runtime_parameters", &Simulation::setRuntimeParameters)
-                .def("set_kernel_config", &Simulation::setKernelConfiguration)
-                .def("add_object", &Simulation::addObject)
-                .def("add_bc_adapter", &Simulation::addBCAdapter)
-                .def("run_simulation", &Simulation::run);
+                .def("set_writer", &CPUSimulation::setWriterConfiguration)
+                .def("set_grid_parameters", &CPUSimulation::setGridParameters)
+                .def("set_physical_parameters", &CPUSimulation::setPhysicalParameters)
+                .def("set_runtime_parameters", &CPUSimulation::setRuntimeParameters)
+                .def("set_kernel_config", &CPUSimulation::setKernelConfiguration)
+                .def("add_object", &CPUSimulation::addObject)
+                .def("add_bc_adapter", &CPUSimulation::addBCAdapter)
+                .def("run_simulation", &CPUSimulation::run);
     }
 
 }
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
index 237097ed5fd48f29b0b2e236cc497bd42110e681..e8746ffda6e2b44d004b0d33136779be405b5a28 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
@@ -186,11 +186,11 @@ void D3Q27TriFaceMeshInteractor::setQs(const real &timeStep)
     assert(UbMath::equal(cblockDeltaX1 / (double)blocknx1, cblockDeltaX3 / (double)blocknx3));
 
     for (int level = coarsestInitLevel; level <= finestInitLevel; level++) {
-        double nodeDeltaX1 = cblockDeltaX1 / (double)(blocknx1 * (1 << (level - coarsestInitLevel)));
-        double nodeDeltaX2 = cblockDeltaX2 / (double)(blocknx2 * (1 << (level - coarsestInitLevel)));
-        double nodeDeltaX3 = cblockDeltaX3 / (double)(blocknx3 * (1 << (level - coarsestInitLevel)));
+        real nodeDeltaX1 = cblockDeltaX1 / (double)(blocknx1 * (1 << (level - coarsestInitLevel)));
+        real nodeDeltaX2 = cblockDeltaX2 / (double)(blocknx2 * (1 << (level - coarsestInitLevel)));
+        real nodeDeltaX3 = cblockDeltaX3 / (double)(blocknx3 * (1 << (level - coarsestInitLevel)));
 
-        std::vector<double> distNeigh(D3Q27System::FENDDIR + 1, 0.0);
+        std::vector<real> distNeigh(D3Q27System::FENDDIR + 1, 0.0);
         D3Q27System::calcDistanceToNeighbors(distNeigh, nodeDeltaX1, nodeDeltaX2, nodeDeltaX3);
         // D3Q27System::calcDistanceToNeighbors(distNeigh, nodeDeltaX1);
 
@@ -666,9 +666,9 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
     assert(UbMath::equal(cblockDeltaX1 / (double)blocknx1, cblockDeltaX3 / (double)blocknx3));
 
     for (int level = coarsestInitLevel; level <= finestInitLevel; level++) {
-        double nodeDelta = cblockDeltaX1 / (double)(blocknx1 * (1 << (level - coarsestInitLevel)));
+        real nodeDelta = cblockDeltaX1 / (double)(blocknx1 * (1 << (level - coarsestInitLevel)));
 
-        std::vector<double> distNeigh(D3Q27System::FENDDIR + 1, 0.0);
+        std::vector<real> distNeigh(D3Q27System::FENDDIR + 1, 0.0);
         D3Q27System::calcDistanceToNeighbors(distNeigh, nodeDelta);
 
         nodeDeltaToNeigh[level].resize(D3Q27System::ENDDIR + 1, 0.0);
@@ -1313,7 +1313,7 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const real &timeStep)
     //}
 }
 //////////////////////////////////////////////////////////////////////////
-void D3Q27TriFaceMeshInteractor::refineBlockGridToLevel(int level, double startDistance, double stopDistance)
+void D3Q27TriFaceMeshInteractor::refineBlockGridToLevel(int level, real startDistance, real stopDistance)
 {
     UBLOG(logDEBUG1, "D3Q27TriFaceMeshInteractor::refineBlockGridToLevel - start");
 
diff --git a/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h b/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h
index 156649c6fd3c060117e8247efab2765f56f7c77b..77ab8798da189b4eedc64eb736b2d92e2b4be1cc 100644
--- a/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h
+++ b/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h
@@ -2,7 +2,7 @@
 #define VIRTUALFLUIDSPYTHONBINDINGS_ABSTRACTLBMSYSTEM_H
 
 #include <Interactors/Interactor3D.h>
-#include <BoundaryConditions/BCAdapter.h>
+#include <BoundaryConditions/BC.h>
 #include <memory>
 
 class AbstractLBMSystem {
@@ -19,11 +19,11 @@ public:
 
     virtual std::shared_ptr<Interactor3D>
     makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid,
-                   std::shared_ptr<BCAdapter> bcAdapter, int type) = 0;
+                   std::shared_ptr<BC> bcAdapter, int type) = 0;
 
     virtual std::shared_ptr<Interactor3D>
     makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid,
-                   std::shared_ptr<BCAdapter> bcAdapter, int type, Interactor3D::Accuracy accuracy) = 0;
+                   std::shared_ptr<BC> bcAdapter, int type, Interactor3D::Accuracy accuracy) = 0;
 
 };
 
diff --git a/src/cpu/simulationconfig/include/simulationconfig/D3Q27LBMSystem.h b/src/cpu/simulationconfig/include/simulationconfig/D3Q27LBMSystem.h
index c9883a61a27aa3d44af61be11d5b809aaf7068ce..374d64318f1fe64308002af71b2b67d2edb3d1a4 100644
--- a/src/cpu/simulationconfig/include/simulationconfig/D3Q27LBMSystem.h
+++ b/src/cpu/simulationconfig/include/simulationconfig/D3Q27LBMSystem.h
@@ -16,10 +16,10 @@ public:
     makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid, int type) override;
 
     std::shared_ptr<Interactor3D> makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid,
-                                                 std::shared_ptr<BCAdapter> bcAdapter, int type) override;
+                                                 std::shared_ptr<BC> bcAdapter, int type) override;
 
     std::shared_ptr<Interactor3D> makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid,
-                                                 std::shared_ptr<BCAdapter> bcAdapter, int type,
+                                                 std::shared_ptr<BC> bcAdapter, int type,
                                                  Interactor3D::Accuracy accuracy) override;
 };
 
diff --git a/src/cpu/simulationconfig/include/simulationconfig/Simulation.h b/src/cpu/simulationconfig/include/simulationconfig/Simulation.h
index 63298db81741864b40c4b320fbe4bd72f688715c..b5f552bebf7edee1dfc2c085e666597dd715ee17 100644
--- a/src/cpu/simulationconfig/include/simulationconfig/Simulation.h
+++ b/src/cpu/simulationconfig/include/simulationconfig/Simulation.h
@@ -9,9 +9,9 @@
 
 #include <geometry3d/GbPoint3D.h>
 #include <Interactors/Interactor3D.h>
-#include <BoundaryConditions/BCAdapter.h>
+#include <BoundaryConditions/BC.h>
 #include <Visitors/BoundaryConditionsBlockVisitor.h>
-#include <CoProcessors/CoProcessor.h>
+#include <SimulationObservers/SimulationObserver.h>
 #include <LBM/LBMUnitConverter.h>
 #include "KernelFactory.h"
 #include "AbstractLBMSystem.h"
@@ -20,7 +20,9 @@
 #include "WriterConfiguration.h"
 
 
-class Simulation {
+
+class CPUSimulation
+{
 private:
     KernelFactory kernelFactory = KernelFactory();
 
@@ -31,7 +33,7 @@ private:
     std::shared_ptr<Grid3D> grid;
     std::vector<std::shared_ptr<Interactor3D>> interactors;
     BoundaryConditionsBlockVisitor bcVisitor;
-    std::set<std::shared_ptr<BCAdapter>> registeredAdapters;
+    std::set<std::shared_ptr<BC>> registeredAdapters;
 
     std::shared_ptr<LBMKernelConfiguration> kernelConfig;
     std::shared_ptr<RuntimeParameters> simulationParameters;
@@ -41,9 +43,9 @@ private:
     WriterConfiguration &writerConfig = *(new WriterConfiguration());
 
 public:
-    explicit Simulation();
+    explicit CPUSimulation();
 
-    ~Simulation();
+    ~CPUSimulation();
 
     WriterConfiguration &getWriterConfig();
 
@@ -57,10 +59,10 @@ public:
 
     void setKernelConfiguration(const std::shared_ptr<LBMKernelConfiguration> &kernel);
 
-    void addObject(const std::shared_ptr<GbObject3D> &object, const std::shared_ptr<BCAdapter> &bcAdapter, int state,
+    void addObject(const std::shared_ptr<GbObject3D> &object, const std::shared_ptr<BC> &bcAdapter, int state,
                    const std::string &folderPath);
 
-    void addBCAdapter(const std::shared_ptr<BCAdapter> &bcAdapter);
+    void addBCAdapter(const std::shared_ptr<BC> &bcAdapter);
 
     void run();
 
@@ -73,7 +75,7 @@ private:
 
     void writeBoundaryConditions() const;
 
-    std::shared_ptr<CoProcessor> makeMacroscopicQuantitiesCoProcessor(const std::shared_ptr<LBMUnitConverter> &converter,
+    std::shared_ptr<SimulationObserver> makeMacroscopicQuantitiesCoProcessor(const std::shared_ptr<LBMUnitConverter> &converter,
                                                            const std::shared_ptr<UbScheduler> &visualizationScheduler) const;
 
     static std::shared_ptr<LBMUnitConverter> makeLBMUnitConverter();
@@ -93,7 +95,8 @@ private:
 
     void initializeDistributions();
 
-    std::shared_ptr<CoProcessor> makeNupsCoProcessor() const;
+    std::shared_ptr<SimulationObserver> makeNupsCoProcessor() const;
 };
 
+
 #endif
\ No newline at end of file
diff --git a/src/cpu/simulationconfig/src/D3Q27LBMSystem.cpp b/src/cpu/simulationconfig/src/D3Q27LBMSystem.cpp
index b1a01ca7b05fedcbc7a66a0de3cdcfa33f3b0722..1e34e91c7a79d755b8670ff6e241e6b764548917 100644
--- a/src/cpu/simulationconfig/src/D3Q27LBMSystem.cpp
+++ b/src/cpu/simulationconfig/src/D3Q27LBMSystem.cpp
@@ -20,14 +20,14 @@ D3Q27LBMSystem::makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_p
 
 std::shared_ptr<Interactor3D>
 D3Q27LBMSystem::makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid,
-                               std::shared_ptr<BCAdapter> bcAdapter, int type)
+                               std::shared_ptr<BC> bcAdapter, int type)
 {
     return std::shared_ptr<Interactor3D>(new D3Q27Interactor(object, grid, bcAdapter, type));
 }
 
 std::shared_ptr<Interactor3D>
 D3Q27LBMSystem::makeInteractor(std::shared_ptr<GbObject3D> object, std::shared_ptr<Grid3D> grid,
-                               std::shared_ptr<BCAdapter> bcAdapter, int type, Interactor3D::Accuracy accuracy)
+                               std::shared_ptr<BC> bcAdapter, int type, Interactor3D::Accuracy accuracy)
 {
     return std::shared_ptr<Interactor3D>(new D3Q27Interactor(object, grid, bcAdapter, type, accuracy));
 }
diff --git a/src/cpu/simulationconfig/src/Simulation.cpp b/src/cpu/simulationconfig/src/Simulation.cpp
index 098f913d61a87b0dd2692faad07de691ca7e04a1..a890eb988ad4fb1154c7405f128c7ede65d8b4c6 100644
--- a/src/cpu/simulationconfig/src/Simulation.cpp
+++ b/src/cpu/simulationconfig/src/Simulation.cpp
@@ -10,15 +10,15 @@
 #include <geometry3d/GbCuboid3D.h>
 #include <geometry3d/GbSystem3D.h>
 
-#include <BoundaryConditions/BCProcessor.h>
-#include <CoProcessors/CoProcessor.h>
-#include <CoProcessors/NUPSCounterCoProcessor.h>
-#include <CoProcessors/WriteBlocksCoProcessor.h>
-#include <CoProcessors/WriteBoundaryConditionsCoProcessor.h>
-#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
-#include <Grid/BasicCalculator.h>
-#include <Grid/Calculator.h>
-#include <Grid/Grid3D.h>
+#include <BoundaryConditions/BCStrategy.h>
+#include <BoundaryConditions/BCSet.h>
+#include <SimulationObservers/NUPSCounterSimulationObserver.h>
+#include <SimulationObservers/WriteBlocksSimulationObserver.h>
+#include <SimulationObservers/WriteBoundaryConditionsSimulationObserver.h>
+#include <SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h>
+
+#include <Simulation/Simulation.h>
+#include <Simulation/Grid3D.h>
 #include <Interactors/InteractorsHelper.h>
 #include <LBM/CompressibleOffsetMomentsInterpolationProcessor.h>
 #include <LBM/LBMKernel.h>
@@ -36,32 +36,32 @@
 #include <lbm/constants/D3Q27.h>
 
 
-Simulation::Simulation()
+CPUSimulation::CPUSimulation()
 {
     this->communicator = vf::mpi::MPICommunicator::getInstance();
     this->grid = std::shared_ptr<Grid3D>(new Grid3D(communicator));
     this->interactors = std::vector<std::shared_ptr<Interactor3D>>();
     this->bcVisitor = BoundaryConditionsBlockVisitor();
-    this->registeredAdapters = std::set<std::shared_ptr<BCAdapter>>();
+    this->registeredAdapters = std::set<std::shared_ptr<BC>>();
 }
 
-void Simulation::setGridParameters(std::shared_ptr<GridParameters> parameters)
+void CPUSimulation::setGridParameters(std::shared_ptr<GridParameters> parameters)
 {
     this->gridParameters = std::move(parameters);
 }
 
-void Simulation::setPhysicalParameters(std::shared_ptr<PhysicalParameters> parameters)
+void CPUSimulation::setPhysicalParameters(std::shared_ptr<PhysicalParameters> parameters)
 {
     this->physicalParameters = std::move(parameters);
 }
 
-void Simulation::setRuntimeParameters(std::shared_ptr<RuntimeParameters> parameters)
+void CPUSimulation::setRuntimeParameters(std::shared_ptr<RuntimeParameters> parameters)
 {
     this->simulationParameters = std::move(parameters);
 }
 
 void
-Simulation::addObject(const std::shared_ptr<GbObject3D> &object, const std::shared_ptr<BCAdapter> &bcAdapter, int state,
+CPUSimulation::addObject(const std::shared_ptr<GbObject3D> &object, const std::shared_ptr<BC> &bcAdapter, int state,
                       const std::string &folderPath)
 {
     const bool is_in = registeredAdapters.find(bcAdapter) != registeredAdapters.end();
@@ -72,30 +72,30 @@ Simulation::addObject(const std::shared_ptr<GbObject3D> &object, const std::shar
     GbSystem3D::writeGeoObject(object, writerConfig.outputPath + folderPath, writerConfig.getWriter());
 }
 
-void Simulation::addBCAdapter(const std::shared_ptr<BCAdapter> &bcAdapter)
+void CPUSimulation::addBCAdapter(const std::shared_ptr<BC> &bcAdapter)
 {
     registeredAdapters.insert(bcAdapter);
     this->bcVisitor.addBC(bcAdapter);
 }
 
-void Simulation::setKernelConfiguration(const std::shared_ptr<LBMKernelConfiguration> &kernel)
+void CPUSimulation::setKernelConfiguration(const std::shared_ptr<LBMKernelConfiguration> &kernel)
 {
     this->kernelConfig = kernel;
     this->lbmKernel = kernelFactory.makeKernel(kernel->kernelType);
     this->lbmSystem = kernelFactory.makeLBMSystem(kernel->kernelType);
 }
 
-void Simulation::setWriterConfiguration(const WriterConfiguration &config)
+void CPUSimulation::setWriterConfiguration(const WriterConfiguration &config)
 {
     this->writerConfig = config;
 }
 
-WriterConfiguration &Simulation::getWriterConfig()
+WriterConfiguration &CPUSimulation::getWriterConfig()
 {
     return writerConfig;
 }
 
-void Simulation::run()
+void CPUSimulation::run()
 {
     UBLOG(logINFO, "Beginning simulation setup for MPI rank " << communicator->getProcessID())
     grid->setDeltaX(gridParameters->nodeDistance);
@@ -155,23 +155,23 @@ void Simulation::run()
 
     auto nupsCoProcessor = makeNupsCoProcessor();
 
-    auto calculator = std::make_shared<BasicCalculator>(grid, visualizationScheduler,
+    auto simulation = std::make_shared<Simulation>(grid, visualizationScheduler,
                                                         simulationParameters->numberOfTimeSteps);
-    calculator->addCoProcessor(nupsCoProcessor);
-    calculator->addCoProcessor(mqCoProcessor);
+    simulation->addSimulationObserver(nupsCoProcessor);
+    simulation->addSimulationObserver(mqCoProcessor);
 
     if (isMainProcess()) UBLOG(logINFO, "Simulation-start")
-    calculator->calculate();
+    simulation->run();
     if (isMainProcess()) UBLOG(logINFO, "Simulation-end")
 }
 
-bool Simulation::isMainProcess()
+bool CPUSimulation::isMainProcess()
 {
     return communicator->getProcessID() == 0;
 }
 
 void
-Simulation::setKernelForcing(const std::shared_ptr<LBMKernel> &kernel,
+CPUSimulation::setKernelForcing(const std::shared_ptr<LBMKernel> &kernel,
                              std::shared_ptr<LBMUnitConverter> &converter) const
 {
     kernel->setWithForcing(kernelConfig->useForcing);
@@ -180,28 +180,28 @@ Simulation::setKernelForcing(const std::shared_ptr<LBMKernel> &kernel,
     kernel->setForcingX3(kernelConfig->forcingX3 * converter->getFactorForceWToLb());
 }
 
-void Simulation::logSimulationData(const int &nodesInX1, const int &nodesInX2, const int &nodesInX3) const
+void CPUSimulation::logSimulationData(const int &nodesInX1, const int &nodesInX2, const int &nodesInX3) const
 {
     UBLOG(logINFO, "Domain size = " << nodesInX1 << " x " << nodesInX2 << " x " << nodesInX3)
     UBLOG(logINFO, "dx          = " << gridParameters->nodeDistance << " m")
     UBLOG(logINFO, "latticeViscosity    = " << physicalParameters->latticeViscosity)
 }
 
-void Simulation::generateBlockGrid(const std::shared_ptr<GbObject3D> &gridCube) const
+void CPUSimulation::generateBlockGrid(const std::shared_ptr<GbObject3D> &gridCube) const
 {
     UBLOG(logINFO, "Generate block grid")
     GenBlocksGridVisitor genBlocks(gridCube);
     grid->accept(genBlocks);
 }
 
-void Simulation::setBoundaryConditionProcessor(const std::shared_ptr<LBMKernel> &kernel)
+void CPUSimulation::setBoundaryConditionProcessor(const std::shared_ptr<LBMKernel> &kernel)
 {
     UBLOG(logINFO, "Create boundary conditions processor")
-    auto bcProc = std::make_shared<BCProcessor>();
-    kernel->setBCProcessor(bcProc);
+    auto bcProc = std::make_shared<BCSet>();
+    kernel->setBCSet(bcProc);
 }
 
-void Simulation::setBlockSize(const int &nodesInX1, const int &nodesInX2, const int &nodesInX3) const
+void CPUSimulation::setBlockSize(const int &nodesInX1, const int &nodesInX2, const int &nodesInX3) const
 {
     int blockSizeX1 = nodesInX1 / gridParameters->blocksPerDirection[0];
     int blockSizeX2 = nodesInX2 / gridParameters->blocksPerDirection[1];
@@ -213,36 +213,36 @@ void Simulation::setBlockSize(const int &nodesInX1, const int &nodesInX2, const
 }
 
 std::shared_ptr<LBMUnitConverter>
-Simulation::makeLBMUnitConverter()
+CPUSimulation::makeLBMUnitConverter()
 {
     return std::make_shared<LBMUnitConverter>();
 }
 
 
 
-void Simulation::writeBoundaryConditions() const
+void CPUSimulation::writeBoundaryConditions() const
 {
     auto geoSch = std::make_shared<UbScheduler>(1);
-    WriteBoundaryConditionsCoProcessor ppgeo(grid, geoSch, writerConfig.outputPath, writerConfig.getWriter(),
+    WriteBoundaryConditionsSimulationObserver ppgeo(grid, geoSch, writerConfig.outputPath, writerConfig.getWriter(),
                                              communicator);
-    ppgeo.process(0);
+    ppgeo.update(0);
 }
 
-void Simulation::writeBlocksToFile() const
+void CPUSimulation::writeBlocksToFile() const
 {
     UBLOG(logINFO, "Write block grid to VTK-file")
     auto scheduler = std::make_shared<UbScheduler>(1);
-    auto ppblocks = std::make_shared<WriteBlocksCoProcessor>(grid,
+    auto ppblocks = std::make_shared<WriteBlocksSimulationObserver>(grid,
                                                              scheduler,
                                                              writerConfig.outputPath,
                                                              writerConfig.getWriter(),
                                                              communicator);
-    ppblocks->process(0);
+    ppblocks->update(0);
     ppblocks.reset();
 }
 
 std::shared_ptr<GbObject3D>
-Simulation::makeSimulationBoundingBox()
+CPUSimulation::makeSimulationBoundingBox()
 {
     auto box = gridParameters->boundingBox();
     auto gridCube = std::make_shared<GbCuboid3D>(box->minX1, box->minX2, box->minX3, box->maxX1, box->maxX2,
@@ -260,38 +260,38 @@ Simulation::makeSimulationBoundingBox()
     return gridCube;
 }
 
-void Simulation::setConnectors()
+void CPUSimulation::setConnectors()
 {
     OneDistributionSetConnectorsBlockVisitor setConnsVisitor(communicator);
     grid->accept(setConnsVisitor);
 }
 
-void Simulation::initializeDistributions()
+void CPUSimulation::initializeDistributions()
 {
     InitDistributionsBlockVisitor initVisitor;
     grid->accept(initVisitor);
 }
 
-std::shared_ptr<CoProcessor>
-Simulation::makeMacroscopicQuantitiesCoProcessor(const std::shared_ptr<LBMUnitConverter> &converter,
+std::shared_ptr<SimulationObserver>
+CPUSimulation::makeMacroscopicQuantitiesCoProcessor(const std::shared_ptr<LBMUnitConverter> &converter,
                                                  const std::shared_ptr<UbScheduler> &visualizationScheduler) const
 {
-    auto mqCoProcessor = std::make_shared<WriteMacroscopicQuantitiesCoProcessor>(grid, visualizationScheduler,
+    auto mqCoProcessor = std::make_shared<WriteMacroscopicQuantitiesSimulationObserver>(grid, visualizationScheduler,
                                                                                  writerConfig.outputPath,
                                                                                  writerConfig.getWriter(),
                                                                                  converter,
                                                                                  communicator);
-    mqCoProcessor->process(0);
+    mqCoProcessor->update(0);
     return mqCoProcessor;
 }
 
-std::shared_ptr<CoProcessor> Simulation::makeNupsCoProcessor() const
+std::shared_ptr<SimulationObserver> CPUSimulation::makeNupsCoProcessor() const
 {
     auto scheduler = std::make_shared<UbScheduler>(100, 100);
-    return std::make_shared<NUPSCounterCoProcessor>(grid, scheduler,
+    return std::make_shared<NUPSCounterSimulationObserver>(grid, scheduler,
                                                     simulationParameters->numberOfThreads,
                                                     communicator);
 }
 
 
-Simulation::~Simulation() = default;
+CPUSimulation::~CPUSimulation() = default;
\ No newline at end of file