From 205774ffde4e4cf66a2887d22914f0208fce8063 Mon Sep 17 00:00:00 2001
From: Kutscher <kutscher@irmb.tu-bs.de>
Date: Wed, 15 Mar 2023 16:08:27 +0100
Subject: [PATCH] rename CoProcessor to SimulationObserver

---
 apps/cpu/ConvectionOfVortex/cov.cpp           |  20 +--
 apps/cpu/CouetteFlow/cflow.cpp                |  20 +--
 apps/cpu/FlowAroundCylinder/cylinder.cpp      |  22 +--
 apps/cpu/HerschelBulkleyModel/hbflow.cpp      |  28 ++--
 apps/cpu/HerschelBulkleySphere/hbsphere.cpp   |  34 ++---
 apps/cpu/JetBreakup/JetBreakup.cpp            |  24 ++--
 apps/cpu/LaminarTubeFlow/ltf.cpp              |  34 ++---
 apps/cpu/Multiphase/Multiphase.cpp            |  26 ++--
 apps/cpu/MultiphaseDropletTest/droplet.cpp    |  20 +--
 apps/cpu/PoiseuilleFlow/pf1.cpp               |  48 +++----
 apps/cpu/RisingBubble2D/RisingBubble2D.cpp    |  20 +--
 apps/cpu/ViskomatXL/viskomat.cpp              |  48 +++----
 apps/cpu/rheometer/rheometer.cpp              |  38 +++---
 apps/cpu/sphere/sphere.cpp                    |  18 +--
 .../geometry3d/CoordinateTransformation3D.h   |   8 +-
 ...=> LiggghtsCouplingSimulationObserver.cpp} |  32 ++---
 ...h => LiggghtsCouplingSimulationObserver.h} |  16 +--
 src/cpu/VirtualFluids.h                       |  68 +++++-----
 .../BoundaryConditions/BCArray3D.h            |   6 +-
 .../BoundaryConditions/BoundaryConditions.h   |   6 +-
 src/cpu/VirtualFluidsCore/CMakeLists.txt      |   2 +-
 .../CoProcessors/EmergencyExitCoProcessor.h   |  43 ------
 .../TimeDependentBCCoProcessor.cpp            |  22 ---
 .../CoProcessors/TimeDependentBCCoProcessor.h |  30 -----
 .../Data/D3Q27EsoTwist3DSplittedVector.h      |   4 +-
 src/cpu/VirtualFluidsCore/Grid/Calculator.cpp |   6 +-
 src/cpu/VirtualFluidsCore/Grid/Calculator.h   |   6 +-
 .../Parallel/MPIIODataStructures.h            |  12 +-
 .../AdjustForcingSimulationObserver.cpp}      |  14 +-
 .../AdjustForcingSimulationObserver.h}        |  12 +-
 .../AverageValuesSimulationObserver.cpp}      |  32 ++---
 .../AverageValuesSimulationObserver.h}        |  12 +-
 .../CalculateForcesSimulationObserver.cpp}    |  24 ++--
 .../CalculateForcesSimulationObserver.h}      |  16 +--
 .../CalculateTorqueSimulationObserver.cpp}    |  22 +--
 .../CalculateTorqueSimulationObserver.h}      |  16 +--
 .../DecreaseViscositySimulationObserver.cpp}  |  16 +--
 .../DecreaseViscositySimulationObserver.h}    |  18 +--
 .../EmergencyExitSimulationObserver.cpp}      |  26 ++--
 .../EmergencyExitSimulationObserver.h         |  43 ++++++
 .../ForceCalculator.cpp                       |   0
 .../ForceCalculator.h                         |   0
 .../InSituCatalystSimulationObserver.cpp}     |  24 ++--
 .../InSituCatalystSimulationObserver.h}       |  16 +--
 .../InSituVTKSimulationObserver.cpp}          |  22 +--
 .../InSituVTKSimulationObserver.h}            |  16 +--
 .../IntegrateValuesHelper.cpp                 |   0
 .../IntegrateValuesHelper.h                   |   0
 .../LineTimeSeriesSimulationObserver.cpp}     |  18 +--
 .../LineTimeSeriesSimulationObserver.h}       |  14 +-
 .../MPIIOMigrationBESimulationObserver.cpp}   | 126 +++++++++---------
 .../MPIIOMigrationBESimulationObserver.h}     |  14 +-
 .../MPIIOMigrationSimulationObserver.cpp}     |  98 +++++++-------
 .../MPIIOMigrationSimulationObserver.h}       |  14 +-
 .../MPIIORestartSimulationObserver.cpp}       |  96 ++++++-------
 .../MPIIORestartSimulationObserver.h}         |  14 +-
 .../MPIIOSimulationObserver.cpp}              |  32 ++---
 .../MPIIOSimulationObserver.h}                |  18 +--
 .../MicrophoneArraySimulationObserver.cpp}    |  18 +--
 .../MicrophoneArraySimulationObserver.h}      |  14 +-
 .../NUPSCounterSimulationObserver.cpp}        |  16 +--
 .../NUPSCounterSimulationObserver.h}          |  20 +--
 ...PressureCoefficientSimulationObserver.cpp} |  26 ++--
 .../PressureCoefficientSimulationObserver.h}  |  14 +-
 .../PressureDifferenceSimulationObserver.cpp} |  14 +-
 .../PressureDifferenceSimulationObserver.h}   |  16 +--
 .../QCriterionSimulationObserver.cpp}         |  32 ++---
 .../QCriterionSimulationObserver.h}           |  14 +-
 .../ShearStressSimulationObserver.cpp}        |  42 +++---
 .../ShearStressSimulationObserver.h}          |  16 +--
 .../SimulationObserver.cpp}                   |  12 +-
 .../SimulationObserver.h}                     |  22 +--
 .../TimeAveragedValuesSimulationObserver.cpp} |  44 +++---
 .../TimeAveragedValuesSimulationObserver.h}   |  14 +-
 .../TimeDependentBCSimulationObserver.cpp     |  22 +++
 .../TimeDependentBCSimulationObserver.h       |  30 +++++
 .../TimeseriesSimulationObserver.cpp}         |  20 +--
 .../TimeseriesSimulationObserver.h}           |  16 +--
 ...TurbulenceIntensitySimulationObserver.cpp} |  24 ++--
 .../TurbulenceIntensitySimulationObserver.h}  |  10 +-
 .../WriteBlocksSimulationObserver.cpp}        |  20 +--
 .../WriteBlocksSimulationObserver.h}          |  20 +--
 ...eBoundaryConditionsSimulationObserver.cpp} |  26 ++--
 ...iteBoundaryConditionsSimulationObserver.h} |  20 +--
 .../WriteGbObjectsSimulationObserver.cpp}     |  20 +--
 .../WriteGbObjectsSimulationObserver.h}       |  14 +-
 ...riteMQFromSelectionSimulationObserver.cpp} |  24 ++--
 .../WriteMQFromSelectionSimulationObserver.h} |  14 +-
 ...cQuantitiesPlusMassSimulationObserver.cpp} |  28 ++--
 ...picQuantitiesPlusMassSimulationObserver.h} |  20 +--
 ...croscopicQuantitiesSimulationObserver.cpp} |  28 ++--
 ...MacroscopicQuantitiesSimulationObserver.h} |  20 +--
 ...ultiphaseQuantitiesSimulationObserver.cpp} |  40 +++---
 ...eMultiphaseQuantitiesSimulationObserver.h} |  20 +--
 ...hixotropyQuantitiesSimulationObserver.cpp} |  26 ++--
 ...eThixotropyQuantitiesSimulationObserver.h} |  18 +--
 .../Utilities/CheckpointConverter.cpp         |   2 +-
 .../Utilities/CheckpointConverter.h           |   2 +-
 98 files changed, 1126 insertions(+), 1126 deletions(-)
 rename src/cpu/LiggghtsCoupling/{LiggghtsCouplingCoProcessor.cpp => LiggghtsCouplingSimulationObserver.cpp} (90%)
 rename src/cpu/LiggghtsCoupling/{LiggghtsCouplingCoProcessor.h => LiggghtsCouplingSimulationObserver.h} (90%)
 delete mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h
 delete mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp
 delete mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h
 rename src/cpu/VirtualFluidsCore/{CoProcessors/AdjustForcingCoProcessor.cpp => SimulationObservers/AdjustForcingSimulationObserver.cpp} (90%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/AdjustForcingCoProcessor.h => SimulationObservers/AdjustForcingSimulationObserver.h} (81%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/AverageValuesCoProcessor.cpp => SimulationObservers/AverageValuesSimulationObserver.cpp} (95%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/AverageValuesCoProcessor.h => SimulationObservers/AverageValuesSimulationObserver.h} (89%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/CalculateForcesCoProcessor.cpp => SimulationObservers/CalculateForcesSimulationObserver.cpp} (88%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/CalculateForcesCoProcessor.h => SimulationObservers/CalculateForcesSimulationObserver.h} (74%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/CalculateTorqueCoProcessor.cpp => SimulationObservers/CalculateTorqueSimulationObserver.cpp} (87%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/CalculateTorqueCoProcessor.h => SimulationObservers/CalculateTorqueSimulationObserver.h} (72%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/DecreaseViscosityCoProcessor.cpp => SimulationObservers/DecreaseViscositySimulationObserver.cpp} (76%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/DecreaseViscosityCoProcessor.h => SimulationObservers/DecreaseViscositySimulationObserver.h} (63%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/EmergencyExitCoProcessor.cpp => SimulationObservers/EmergencyExitSimulationObserver.cpp} (60%)
 create mode 100644 src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
 rename src/cpu/VirtualFluidsCore/{CoProcessors => SimulationObservers}/ForceCalculator.cpp (100%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors => SimulationObservers}/ForceCalculator.h (100%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/InSituCatalystCoProcessor.cpp => SimulationObservers/InSituCatalystSimulationObserver.cpp} (94%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/InSituCatalystCoProcessor.h => SimulationObservers/InSituCatalystSimulationObserver.h} (74%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/InSituVTKCoProcessor.cpp => SimulationObservers/InSituVTKSimulationObserver.cpp} (93%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/InSituVTKCoProcessor.h => SimulationObservers/InSituVTKSimulationObserver.h} (71%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors => SimulationObservers}/IntegrateValuesHelper.cpp (100%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors => SimulationObservers}/IntegrateValuesHelper.h (100%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/LineTimeSeriesCoProcessor.cpp => SimulationObservers/LineTimeSeriesSimulationObserver.cpp} (90%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/LineTimeSeriesCoProcessor.h => SimulationObservers/LineTimeSeriesSimulationObserver.h} (74%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIOMigrationBECoProcessor.cpp => SimulationObservers/MPIIOMigrationBESimulationObserver.cpp} (92%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIOMigrationBECoProcessor.h => SimulationObservers/MPIIOMigrationBESimulationObserver.h} (88%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIOMigrationCoProcessor.cpp => SimulationObservers/MPIIOMigrationSimulationObserver.cpp} (93%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIOMigrationCoProcessor.h => SimulationObservers/MPIIOMigrationSimulationObserver.h} (85%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIORestartCoProcessor.cpp => SimulationObservers/MPIIORestartSimulationObserver.cpp} (94%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIORestartCoProcessor.h => SimulationObservers/MPIIORestartSimulationObserver.h} (87%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIOCoProcessor.cpp => SimulationObservers/MPIIOSimulationObserver.cpp} (95%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MPIIOCoProcessor.h => SimulationObservers/MPIIOSimulationObserver.h} (68%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MicrophoneArrayCoProcessor.cpp => SimulationObservers/MicrophoneArraySimulationObserver.cpp} (87%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/MicrophoneArrayCoProcessor.h => SimulationObservers/MicrophoneArraySimulationObserver.h} (74%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/NUPSCounterCoProcessor.cpp => SimulationObservers/NUPSCounterSimulationObserver.cpp} (87%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/NUPSCounterCoProcessor.h => SimulationObservers/NUPSCounterSimulationObserver.h} (83%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/PressureCoefficientCoProcessor.cpp => SimulationObservers/PressureCoefficientSimulationObserver.cpp} (87%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/PressureCoefficientCoProcessor.h => SimulationObservers/PressureCoefficientSimulationObserver.h} (71%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/PressureDifferenceCoProcessor.cpp => SimulationObservers/PressureDifferenceSimulationObserver.cpp} (88%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/PressureDifferenceCoProcessor.h => SimulationObservers/PressureDifferenceSimulationObserver.h} (70%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/QCriterionCoProcessor.cpp => SimulationObservers/QCriterionSimulationObserver.cpp} (92%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/QCriterionCoProcessor.h => SimulationObservers/QCriterionSimulationObserver.h} (86%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/ShearStressCoProcessor.cpp => SimulationObservers/ShearStressSimulationObserver.cpp} (96%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/ShearStressCoProcessor.h => SimulationObservers/ShearStressSimulationObserver.h} (83%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/CoProcessor.cpp => SimulationObservers/SimulationObserver.cpp} (87%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/CoProcessor.h => SimulationObservers/SimulationObserver.h} (83%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/TimeAveragedValuesCoProcessor.cpp => SimulationObservers/TimeAveragedValuesSimulationObserver.cpp} (95%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/TimeAveragedValuesCoProcessor.h => SimulationObservers/TimeAveragedValuesSimulationObserver.h} (90%)
 create mode 100644 src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h
 rename src/cpu/VirtualFluidsCore/{CoProcessors/TimeseriesCoProcessor.cpp => SimulationObservers/TimeseriesSimulationObserver.cpp} (77%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/TimeseriesCoProcessor.h => SimulationObservers/TimeseriesSimulationObserver.h} (69%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/TurbulenceIntensityCoProcessor.cpp => SimulationObservers/TurbulenceIntensitySimulationObserver.cpp} (93%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/TurbulenceIntensityCoProcessor.h => SimulationObservers/TurbulenceIntensitySimulationObserver.h} (75%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteBlocksCoProcessor.cpp => SimulationObservers/WriteBlocksSimulationObserver.cpp} (92%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteBlocksCoProcessor.h => SimulationObservers/WriteBlocksSimulationObserver.h} (84%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteBoundaryConditionsCoProcessor.cpp => SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp} (90%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteBoundaryConditionsCoProcessor.h => SimulationObservers/WriteBoundaryConditionsSimulationObserver.h} (85%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteGbObjectsCoProcessor.cpp => SimulationObservers/WriteGbObjectsSimulationObserver.cpp} (73%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteGbObjectsCoProcessor.h => SimulationObservers/WriteGbObjectsSimulationObserver.h} (66%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMQFromSelectionCoProcessor.cpp => SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp} (90%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMQFromSelectionCoProcessor.h => SimulationObservers/WriteMQFromSelectionSimulationObserver.h} (73%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp => SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp} (91%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h => SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h} (84%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp => SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp} (91%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h => SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h} (85%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp => SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp} (94%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h => SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h} (86%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp => SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp} (90%)
 rename src/cpu/VirtualFluidsCore/{CoProcessors/WriteThixotropyQuantitiesCoProcessor.h => SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h} (82%)

diff --git a/apps/cpu/ConvectionOfVortex/cov.cpp b/apps/cpu/ConvectionOfVortex/cov.cpp
index a7affc552..8d53d608a 100644
--- a/apps/cpu/ConvectionOfVortex/cov.cpp
+++ b/apps/cpu/ConvectionOfVortex/cov.cpp
@@ -133,7 +133,7 @@ void run()
          if (myid==0) UBLOG(logINFO, "Refinement - end");
       }
 
-      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
       //outflow
       GbCuboid3DPtr geoOutflow1(new GbCuboid3D(g_minX1-blockLength, g_minX2-blockLength, g_minX3-blockLength, g_minX1, g_maxX2+blockLength, g_maxX3+blockLength));
@@ -264,7 +264,7 @@ void run()
 
       //Postrozess
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      SPtr<CoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      SPtr<SimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
       ppgeo->process(0);
       ppgeo.reset();
 
@@ -278,22 +278,22 @@ void run()
       }
 
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-      writeMQCoProcessor->process(0);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+      writeMQSimulationObserver->process(0);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      std::shared_ptr<NUPSCounterCoProcessor> nupsCoProcessor(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      std::shared_ptr<NUPSCounterSimulationObserver> nupsSimulationObserver(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //SPtr<UbScheduler> tavSch(new UbScheduler(1, 0, endTime));
-      //SPtr<TimeAveragedValuesCoProcessor> tav(new TimeAveragedValuesCoProcessor(grid, pathname, WbWriterVtkXmlBinary::getInstance(), tavSch, comm,
-      //   TimeAveragedValuesCoProcessor::Density | TimeAveragedValuesCoProcessor::Velocity | TimeAveragedValuesCoProcessor::Fluctuations));
+      //SPtr<TimeAveragedValuesSimulationObserver> tav(new TimeAveragedValuesSimulationObserver(grid, pathname, WbWriterVtkXmlBinary::getInstance(), tavSch, comm,
+      //   TimeAveragedValuesSimulationObserver::Density | TimeAveragedValuesSimulationObserver::Velocity | TimeAveragedValuesSimulationObserver::Fluctuations));
       //tav->setWithGhostLayer(true);
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(nupsCoProcessor);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      //calculator->addCoProcessor(tav);
+      calculator->addSimulationObserver(nupsSimulationObserver);
+      calculator->addSimulationObserver(writeMQSimulationObserver);
+      //calculator->addSimulationObserver(tav);
 
       //omp_set_num_threads(1);
 
diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp
index 184571e09..774150eec 100644
--- a/apps/cpu/CouetteFlow/cflow.cpp
+++ b/apps/cpu/CouetteFlow/cflow.cpp
@@ -199,7 +199,7 @@ void bflow(string configname)
       if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
       //////////////////////////////////////
 
-      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
       ppblocks->process(0);
 
       unsigned long nob = grid->getNumberOfBlocks();
@@ -252,26 +252,26 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
       ppgeo.process(1);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname,
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname,
          WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      //calculator->addCoProcessor(migCoProcessor);
-      //calculator->addCoProcessor(restartCoProcessor);
+      calculator->addSimulationObserver(npr);
+      calculator->addSimulationObserver(writeMQSimulationObserver);
+      calculator->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      //calculator->addSimulationObserver(migSimulationObserver);
+      //calculator->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp b/apps/cpu/FlowAroundCylinder/cylinder.cpp
index 73929a3ee..b98eb01b6 100644
--- a/apps/cpu/FlowAroundCylinder/cylinder.cpp
+++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp
@@ -101,8 +101,8 @@ void run(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-      //RestartCoProcessor rp(grid, rSch, comm, pathOut, RestartCoProcessor::BINARY);
-      MPIIORestartCoProcessor rcp(grid, rSch, pathOut, comm);
+      //RestartSimulationObserver rp(grid, rSch, comm, pathOut, RestartSimulationObserver::BINARY);
+      MPIIORestartSimulationObserver rcp(grid, rSch, pathOut, comm);
       //////////////////////////////////////////////////////////////////////////
 
       ////cylinder
@@ -181,7 +181,7 @@ void run(string configname)
          GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2-blockLength, g_minX3-blockLength, g_maxX1+blockLength, g_maxX2+blockLength, g_maxX3+blockLength));
          if (myid==0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathOut+"/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
 
          if (refineLevel>0)
          {
@@ -275,8 +275,8 @@ void run(string configname)
 
          //Postrozess
          SPtr<UbScheduler> geoSch(new UbScheduler(1));
-         SPtr<CoProcessor> ppgeo(
-            new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppgeo(
+            new WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
          ppgeo->process(0);
          ppgeo.reset();
 
@@ -302,23 +302,23 @@ void run(string configname)
 
       SPtr<UbScheduler> stepSch(new UbScheduler(outTime));
 
-	  SPtr<CoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, pathOut, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+	  SPtr<SimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, stepSch, pathOut, WbWriterVtkXmlBinary::getInstance(), conv, comm));
 
       real area = (2.0*radius*H)/(dx*dx);
       real v    = 4.0*uLB/9.0;
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, pathOut + "/results/forces.txt", comm, v, area);
+      SPtr<CalculateForcesSimulationObserver> fp = make_shared<CalculateForcesSimulationObserver>(grid, forceSch, pathOut + "/results/forces.txt", comm, v, area);
       fp->addInteractor(cylinderInt);
 
 	  SPtr<UbScheduler> nupsSch(new UbScheduler(nupsStep[0], nupsStep[1], nupsStep[2]));
-	  std::shared_ptr<CoProcessor> nupsCoProcessor(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+	  std::shared_ptr<SimulationObserver> nupsSimulationObserver(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
 	  omp_set_num_threads(numOfThreads);
 	  SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
 	  SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-	  calculator->addCoProcessor(nupsCoProcessor);
-     calculator->addCoProcessor(fp);
-     calculator->addCoProcessor(writeMQCoProcessor);
+	  calculator->addSimulationObserver(nupsSimulationObserver);
+     calculator->addSimulationObserver(fp);
+     calculator->addSimulationObserver(writeMQSimulationObserver);
 
       if(myid == 0) UBLOG(logINFO,"Simulation-start");
 	  calculator->calculate();
diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
index 985ad8fce..85ac6681a 100644
--- a/apps/cpu/HerschelBulkleyModel/hbflow.cpp
+++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
@@ -246,7 +246,7 @@ void bflow(string configname)
       if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
       //////////////////////////////////////
 
-      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+      SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
       ppblocks->process(0);
 
       unsigned long nob = grid->getNumberOfBlocks();
@@ -299,36 +299,36 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
       ppgeo.process(1);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       SPtr<UbScheduler> forceSch(new UbScheduler(1000));
       //real dummy = 1;
-      SPtr<CalculateTorqueCoProcessor> fp = std::make_shared<CalculateTorqueCoProcessor>(grid, forceSch, pathname + "/forces/forces.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp = std::make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, pathname + "/forces/forces.csv", comm);
       fp->addInteractor(addWallYminInt);
 
-      SPtr<CalculateTorqueCoProcessor> fp2 = std::make_shared<CalculateTorqueCoProcessor>(grid, forceSch, pathname + "/forces/forces2.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp2 = std::make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, pathname + "/forces/forces2.csv", comm);
       fp2->addInteractor(addWallYmaxInt);
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname,
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname,
          WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(fp2);
-      //calculator->addCoProcessor(migCoProcessor);
-      //calculator->addCoProcessor(restartCoProcessor);
+      calculator->addSimulationObserver(npr);
+      calculator->addSimulationObserver(writeMQSimulationObserver);
+      calculator->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      calculator->addSimulationObserver(fp);
+      calculator->addSimulationObserver(fp2);
+      //calculator->addSimulationObserver(migSimulationObserver);
+      //calculator->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
index 7af2587b8..83da2bae9 100644
--- a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
+++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
@@ -168,10 +168,10 @@ void bflow(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
-      restartCoProcessor->setLBMKernel(kernel);
-      restartCoProcessor->setBCSet(bcProc);
-      //restartCoProcessor->setNu(k);
+      SPtr<MPIIOMigrationSimulationObserver> restartSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, outputPath, comm));
+      restartSimulationObserver->setLBMKernel(kernel);
+      restartSimulationObserver->setBCSet(bcProc);
+      //restartSimulationObserver->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
       if (myid == 0)
@@ -261,7 +261,7 @@ void bflow(string configname)
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
          ppblocks->process(0);
 
          unsigned long nob = grid->getNumberOfBlocks();
@@ -310,7 +310,7 @@ void bflow(string configname)
       }
       else
       {
-         restartCoProcessor->restart((int)restartStep);
+         restartSimulationObserver->restart((int)restartStep);
          grid->setTimeStep(restartStep);
          SetBcBlocksBlockVisitor v(sphereInt);
          grid->accept(v);
@@ -331,32 +331,32 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
       ppgeo.process(0);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-      //writeMQCoProcessor->process(0);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //writeMQSimulationObserver->process(0);
 
       real area = UbMath::PI*radius*radius;
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area);
+      SPtr<CalculateForcesSimulationObserver> fp = make_shared<CalculateForcesSimulationObserver>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area);
       fp->addInteractor(sphereInt);
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      calculator->addCoProcessor(restartCoProcessor);
+      calculator->addSimulationObserver(npr);
+      calculator->addSimulationObserver(fp);
+      calculator->addSimulationObserver(writeMQSimulationObserver);
+      calculator->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      calculator->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp b/apps/cpu/JetBreakup/JetBreakup.cpp
index 4a046bc39..828d52051 100644
--- a/apps/cpu/JetBreakup/JetBreakup.cpp
+++ b/apps/cpu/JetBreakup/JetBreakup.cpp
@@ -226,9 +226,9 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        // SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        // SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        // SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        // SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         // rcp->setNu(nuLB);
         // rcp->setNuLG(nuL, nuG);
         // rcp->setDensityRatio(densityRatio);
@@ -370,7 +370,7 @@ void run(string configname)
             GenBlocksGridVisitor genBlocks(gridCube);
             grid->accept(genBlocks);
 
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBC,
@@ -548,7 +548,7 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
                 ppgeo->process(0);
                 ppgeo.reset();
@@ -580,15 +580,15 @@ void run(string configname)
         t_ast = 7.19;
         t = (int)(t_ast/(U_LB/(D_LB)));
         visSch->addSchedule(t,t,t); //t=7.19
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
         pp->process(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-        auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+        auto timeDepBC = make_shared<TimeDependentBCSimulationObserver>(TimeDependentBCSimulationObserver(grid, timeBCSch));
         timeDepBC->addInteractor(inflowInt);
 
 #ifdef _OPENMP
@@ -597,10 +597,10 @@ void run(string configname)
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
         SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(timeDepBC);
-        calculator->addCoProcessor(rcp);
+        calculator->addSimulationObserver(npr);
+        calculator->addSimulationObserver(pp);
+        calculator->addSimulationObserver(timeDepBC);
+        calculator->addSimulationObserver(rcp);
 
         if (myid == 0)
             UBLOG(logINFO, "Simulation-start");
diff --git a/apps/cpu/LaminarTubeFlow/ltf.cpp b/apps/cpu/LaminarTubeFlow/ltf.cpp
index 14af41b7c..2be4793c9 100644
--- a/apps/cpu/LaminarTubeFlow/ltf.cpp
+++ b/apps/cpu/LaminarTubeFlow/ltf.cpp
@@ -113,13 +113,13 @@ void run(string configname)
       SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, DIR_00M));
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      //SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm));
-      SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm));
-      migCoProcessor->setLBMKernel(kernel);
-      migCoProcessor->setBCSet(bcProc);
-      migCoProcessor->setNu(nuLB);
-      migCoProcessor->setNuLG(0.01, 0.01);
-      migCoProcessor->setDensityRatio(1);
+      //SPtr<MPIIOMigrationSimulationObserver> migSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, pathname + "/mig", comm));
+      SPtr<MPIIOMigrationBESimulationObserver> migSimulationObserver(new MPIIOMigrationBESimulationObserver(grid, mSch, metisVisitor, pathname + "/mig", comm));
+      migSimulationObserver->setLBMKernel(kernel);
+      migSimulationObserver->setBCSet(bcProc);
+      migSimulationObserver->setNu(nuLB);
+      migSimulationObserver->setNuLG(0.01, 0.01);
+      migSimulationObserver->setDensityRatio(1);
       //////////////////////////////////////////////////////////////////////////
 
       SPtr<D3Q27Interactor> inflowInt;
@@ -189,7 +189,7 @@ void run(string configname)
          GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2-blockLength, g_minX3-blockLength, g_maxX1+blockLength, g_maxX2+blockLength, g_maxX3+blockLength));
          if (myid==0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname+"/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
          ppblocks->process(0);
 
@@ -280,7 +280,7 @@ void run(string configname)
          //boundary conditions grid
          {
             SPtr<UbScheduler> geoSch(new UbScheduler(1));
-            SPtr<CoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+            SPtr<SimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
             ppgeo->process(0);
             ppgeo.reset();
          }
@@ -302,7 +302,7 @@ void run(string configname)
             VF_LOG_INFO("path = {}", pathname);
          }
 
-         migCoProcessor->restart((int)restartStep);
+         migSimulationObserver->restart((int)restartStep);
          grid->setTimeStep(restartStep);
 
          if (myid == 0) VF_LOG_INFO("Restart - end");
@@ -316,23 +316,23 @@ void run(string configname)
       grid->accept(setInterConnsVisitor);
 
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-      SPtr<CoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+      SPtr<SimulationObserver> pp(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(100, 100, 100000000));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-      //auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+      //auto timeDepBC = make_shared<TimeDependentBCSimulationObserver>(TimeDependentBCSimulationObserver(grid, timeBCSch));
       //timeDepBC->addInteractor(inflowInt);
 
       omp_set_num_threads(numOfThreads);
       numOfThreads = 1;
       SPtr<UbScheduler> stepGhostLayer(visSch);
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, int(endTime)));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(pp);
-      calculator->addCoProcessor(migCoProcessor);
-      //calculator->addCoProcessor(timeDepBC);
+      calculator->addSimulationObserver(npr);
+      calculator->addSimulationObserver(pp);
+      calculator->addSimulationObserver(migSimulationObserver);
+      //calculator->addSimulationObserver(timeDepBC);
 
       if (myid == 0) VF_LOG_INFO("Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/Multiphase/Multiphase.cpp b/apps/cpu/Multiphase/Multiphase.cpp
index e1ee8d15f..753a6528d 100644
--- a/apps/cpu/Multiphase/Multiphase.cpp
+++ b/apps/cpu/Multiphase/Multiphase.cpp
@@ -129,9 +129,9 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        //SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         //rcp->setNu(nuLB);
         //rcp->setNuLG(nuL, nuG);
         //rcp->setDensityRatio(densityRatio);
@@ -265,7 +265,7 @@ void run(string configname)
             GenBlocksGridVisitor genBlocks(gridCube);
             grid->accept(genBlocks);
 
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBC, Interactor3D::SOLID, Interactor3D::POINTS));
@@ -415,7 +415,7 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
                 ppgeo->process(0);
                 ppgeo.reset();
@@ -455,16 +455,16 @@ void run(string configname)
         grid->accept(setConnsVisitor);
 
         SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
-            //SPtr<WriteMacroscopicQuantitiesCoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
+            //SPtr<WriteMacroscopicQuantitiesSimulationObserver> pp(new WriteMacroscopicQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
         pp->process(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-        auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+        auto timeDepBC = make_shared<TimeDependentBCSimulationObserver>(TimeDependentBCSimulationObserver(grid, timeBCSch));
         timeDepBC->addInteractor(cylInt);
 
 #ifdef _OPENMP
@@ -473,10 +473,10 @@ void run(string configname)
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
         SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(timeDepBC);
-        calculator->addCoProcessor(rcp);
+        calculator->addSimulationObserver(npr);
+        calculator->addSimulationObserver(pp);
+        calculator->addSimulationObserver(timeDepBC);
+        calculator->addSimulationObserver(rcp);
 
 
 
diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp
index 7d7423ccb..7686f87f9 100644
--- a/apps/cpu/MultiphaseDropletTest/droplet.cpp
+++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp
@@ -194,9 +194,9 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        //SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         // rcp->setNu(nuLB);
         // rcp->setNuLG(nuL, nuG);
         // rcp->setDensityRatio(densityRatio);
@@ -236,7 +236,7 @@ void run(string configname)
             SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBC, Interactor3D::SOLID));
  
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
@@ -317,7 +317,7 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
                 ppgeo->process(0);
                 ppgeo.reset();
@@ -380,21 +380,21 @@ void run(string configname)
         t = (int)(t_ast/std::sqrt(g_y/D));         
         visSch->addSchedule(t,t,t); //t=9
 
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
         if(grid->getTimeStep() == 0) 
             pp->process(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         omp_set_num_threads(numOfThreads);
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
         SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(rcp);
+        calculator->addSimulationObserver(npr);
+        calculator->addSimulationObserver(pp);
+        calculator->addSimulationObserver(rcp);
 
 
         if (myid == 0)
diff --git a/apps/cpu/PoiseuilleFlow/pf1.cpp b/apps/cpu/PoiseuilleFlow/pf1.cpp
index 987978a5b..c4503ea64 100644
--- a/apps/cpu/PoiseuilleFlow/pf1.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf1.cpp
@@ -84,7 +84,7 @@ void pf1()
    intHelper.selectBlocks();
 
    //write data for visualization of block grid
-   SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
+   SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm));
    ppblocks->process(0);
    //ppblocks.reset();
 
@@ -143,18 +143,18 @@ void pf1()
    grid->accept(setConnsVisitor);
 
    SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-   //SPtr<MPIIORestartCoProcessor> restartCoProcessor(new MPIIORestartCoProcessor(grid, mSch, pathOut, comm));
-   //restartCoProcessor->setLBMKernel(kernel);
-   //restartCoProcessor->setBCSet(bcProc);
+   //SPtr<MPIIORestartSimulationObserver> restartSimulationObserver(new MPIIORestartSimulationObserver(grid, mSch, pathOut, comm));
+   //restartSimulationObserver->setLBMKernel(kernel);
+   //restartSimulationObserver->setBCSet(bcProc);
 
-   /*SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, pathOut + "/mig", comm));
-   migCoProcessor->setLBMKernel(kernel);
-   migCoProcessor->setBCSet(bcProc);*/
+   /*SPtr<MPIIOMigrationSimulationObserver> migSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, pathOut + "/mig", comm));
+   migSimulationObserver->setLBMKernel(kernel);
+   migSimulationObserver->setBCSet(bcProc);*/
 
-   //SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, pathOut + "/mig", comm));
-   //migCoProcessor->setLBMKernel(kernel);
-   //migCoProcessor->setBCSet(bcProc);
-   //migCoProcessor->setNu(nuLB);
+   //SPtr<MPIIOMigrationBESimulationObserver> migSimulationObserver(new MPIIOMigrationBESimulationObserver(grid, mSch, pathOut + "/mig", comm));
+   //migSimulationObserver->setLBMKernel(kernel);
+   //migSimulationObserver->setBCSet(bcProc);
+   //migSimulationObserver->setNu(nuLB);
 
    //SPtr<UtilConvertor> convertProcessor(new UtilConvertor(grid, pathOut, comm));
    //convertProcessor->convert(300, 4);
@@ -163,39 +163,39 @@ void pf1()
    //write data for visualization of boundary conditions
    {
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), /*SPtr<LBMUnitConverter>(new LBMUnitConverter()),*/ comm);
+      WriteBoundaryConditionsSimulationObserver ppgeo(grid, geoSch, pathOut, WbWriterVtkXmlBinary::getInstance(), /*SPtr<LBMUnitConverter>(new LBMUnitConverter()),*/ comm);
       ppgeo.process(0);
    }
    
    if (myid == 0) UBLOG(logINFO, "Preprocess - end");
 
    //grid=SPtr<Grid3D>(new Grid3D(comm));
-   //restartCoProcessor->restart(200);
-   //SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathOut + "/mig", comm));
-   //migCoProcessor->setLBMKernel(kernel);
-   //migCoProcessor->setBCSet(bcProc);
-   //migCoProcessor->setNu(nuLB);
-   //migCoProcessor->restart(10);
+   //restartSimulationObserver->restart(200);
+   //SPtr<MPIIOMigrationBESimulationObserver> migSimulationObserver(new MPIIOMigrationBESimulationObserver(grid, mSch, metisVisitor, pathOut + "/mig", comm));
+   //migSimulationObserver->setLBMKernel(kernel);
+   //migSimulationObserver->setBCSet(bcProc);
+   //migSimulationObserver->setNu(nuLB);
+   //migSimulationObserver->restart(10);
 
    ppblocks->process(1);
 
    //write data for visualization of macroscopic quantities
    SPtr<UbScheduler> visSch(new UbScheduler(outTime));
-   SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathOut, 
+   SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, pathOut, 
       WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
    //performance control
    SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-   SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+   SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
    //start simulation 
    //omp_set_num_threads(numOfThreads);
    SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
    SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-   calculator->addCoProcessor(npr);
-   calculator->addCoProcessor(writeMQCoProcessor);
-   //calculator->addCoProcessor(migCoProcessor);
-   //calculator->addCoProcessor(restartCoProcessor);
+   calculator->addSimulationObserver(npr);
+   calculator->addSimulationObserver(writeMQSimulationObserver);
+   //calculator->addSimulationObserver(migSimulationObserver);
+   //calculator->addSimulationObserver(restartSimulationObserver);
 
    if (myid == 0) UBLOG(logINFO, "Simulation-start");
    calculator->calculate();
diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
index 629aaeca2..be1153696 100644
--- a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
+++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
@@ -196,9 +196,9 @@ void run(string configname)
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        //SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
-        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        SPtr<MPIIORestartSimulationObserver> rcp(new MPIIORestartSimulationObserver(grid, rSch, pathname, comm));
+        //SPtr<MPIIOMigrationSimulationObserver> rcp(new MPIIOMigrationSimulationObserver(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBESimulationObserver> rcp(new MPIIOMigrationBESimulationObserver(grid, rSch, pathname, comm));
         // rcp->setNu(nuLB);
        //  rcp->setNuLG(nuL, nuG);
         //rcp->setDensityRatio(densityRatio);
@@ -246,7 +246,7 @@ void run(string configname)
             SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBC, Interactor3D::SOLID));
             SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBC, Interactor3D::SOLID));
  
-            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+            SPtr<WriteBlocksSimulationObserver> ppblocks(new WriteBlocksSimulationObserver(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
             InteractorsHelper intHelper(grid, metisVisitor, true);
@@ -329,7 +329,7 @@ void run(string configname)
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
-                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                SPtr<WriteBoundaryConditionsSimulationObserver> ppgeo(new WriteBoundaryConditionsSimulationObserver(
                     grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
                 ppgeo->process(0);
                 ppgeo.reset();
@@ -395,21 +395,21 @@ void run(string configname)
         //visSch->addSchedule(t,t,t); //t=9
 
 
-        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+        SPtr<WriteMultiphaseQuantitiesSimulationObserver> pp(new WriteMultiphaseQuantitiesSimulationObserver(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
         if(grid->getTimeStep() == 0) 
             pp->process(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+        SPtr<NUPSCounterSimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
         //omp_set_num_threads(numOfThreads);
 
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
         SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-        calculator->addCoProcessor(npr);
-        calculator->addCoProcessor(pp);
-        calculator->addCoProcessor(rcp);
+        calculator->addSimulationObserver(npr);
+        calculator->addSimulationObserver(pp);
+        calculator->addSimulationObserver(rcp);
 
 
         if (myid == 0)
diff --git a/apps/cpu/ViskomatXL/viskomat.cpp b/apps/cpu/ViskomatXL/viskomat.cpp
index 1f4686e94..2ec6f365a 100644
--- a/apps/cpu/ViskomatXL/viskomat.cpp
+++ b/apps/cpu/ViskomatXL/viskomat.cpp
@@ -198,11 +198,11 @@ void bflow(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
-      //SPtr<MPIIORestartCoProcessor> restartCoProcessor(new MPIIORestartCoProcessor(grid, mSch, outputPath, comm));
-      restartCoProcessor->setLBMKernel(kernel);
-      restartCoProcessor->setBCSet(bcProc);
-      //restartCoProcessor->setNu(k);
+      SPtr<MPIIOMigrationSimulationObserver> restartSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, outputPath, comm));
+      //SPtr<MPIIORestartSimulationObserver> restartSimulationObserver(new MPIIORestartSimulationObserver(grid, mSch, outputPath, comm));
+      restartSimulationObserver->setLBMKernel(kernel);
+      restartSimulationObserver->setBCSet(bcProc);
+      //restartSimulationObserver->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
       ////stator
@@ -320,7 +320,7 @@ void bflow(string configname)
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
          ppblocks->process(0);
 
          unsigned long nob = grid->getNumberOfBlocks();
@@ -365,18 +365,18 @@ void bflow(string configname)
          grid->accept(initVisitor);
 
          SPtr<UbScheduler> geoSch(new UbScheduler(1));
-         WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
+         WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
          ppgeo.process(0);
 
          if (myid == 0) UBLOG(logINFO, "Preprozess - end");
       }
       else
       {
-         restartCoProcessor->restart((int)restartStep);
+         restartSimulationObserver->restart((int)restartStep);
          
-         //restartCoProcessor->readBlocks((int)restartStep);
-         //restartCoProcessor->readDataSet((int)restartStep);
-         ////restartCoProcessor->readBoundaryConds((int)restartStep);
+         //restartSimulationObserver->readBlocks((int)restartStep);
+         //restartSimulationObserver->readDataSet((int)restartStep);
+         ////restartSimulationObserver->readBoundaryConds((int)restartStep);
          //grid->setTimeStep((int)restartStep);
          
          SetBcBlocksBlockVisitor v2(wallXmaxInt);
@@ -395,7 +395,7 @@ void bflow(string configname)
          grid->accept(v1);
          wallXminInt->initInteractor();
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
                                                                WbWriterVtkXmlBinary::getInstance(), comm));
          ppblocks->process(1);
       }
@@ -414,30 +414,30 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-      //writeMQCoProcessor->process(100);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //writeMQSimulationObserver->process(100);
 
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueRotor.csv", comm);
       fp->addInteractor(rotorInt);
-      SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.csv", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp2 = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueStator.csv", comm);
       fp2->addInteractor(statorInt);
 
-      //SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      //calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(fp2);
-      //calculator->addCoProcessor(writeMQCoProcessor);
-      //calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      calculator->addCoProcessor(restartCoProcessor);
+      calculator->addSimulationObserver(npr);
+      //calculator->addSimulationObserver(fp);
+      calculator->addSimulationObserver(fp2);
+      //calculator->addSimulationObserver(writeMQSimulationObserver);
+      //calculator->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      calculator->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp
index 19ca56314..a707b0899 100644
--- a/apps/cpu/rheometer/rheometer.cpp
+++ b/apps/cpu/rheometer/rheometer.cpp
@@ -230,10 +230,10 @@ void bflow(string configname)
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
-      restartCoProcessor->setLBMKernel(kernel);
-      restartCoProcessor->setBCSet(bcProc);
-      //restartCoProcessor->setNu(k);
+      SPtr<MPIIOMigrationSimulationObserver> restartSimulationObserver(new MPIIOMigrationSimulationObserver(grid, mSch, metisVisitor, outputPath, comm));
+      restartSimulationObserver->setLBMKernel(kernel);
+      restartSimulationObserver->setBCSet(bcProc);
+      //restartSimulationObserver->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
       ////stator
@@ -328,7 +328,7 @@ void bflow(string configname)
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
          ppblocks->process(0);
 
          unsigned long nob = grid->getNumberOfBlocks();
@@ -377,7 +377,7 @@ void bflow(string configname)
       }
       else
       {
-         restartCoProcessor->restart((int)restartStep);
+         restartSimulationObserver->restart((int)restartStep);
          grid->setTimeStep(restartStep);
          SetBcBlocksBlockVisitor v1(rotorInt);
          grid->accept(v1);
@@ -401,34 +401,34 @@ void bflow(string configname)
       grid->accept(bcVisitor);
 
       SPtr<UbScheduler> geoSch(new UbScheduler(1));
-      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
+      WriteBoundaryConditionsSimulationObserver ppgeo = WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlASCII::getInstance(), comm);
       ppgeo.process(0);
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       //write data for visualization of macroscopic quantities
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
-      //writeMQCoProcessor->process(0);
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      //writeMQSimulationObserver->process(0);
 
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.txt", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueRotor.txt", comm);
       fp->addInteractor(rotorInt);
-      SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.txt", comm);
+      SPtr<CalculateTorqueSimulationObserver> fp2 = make_shared<CalculateTorqueSimulationObserver>(grid, forceSch, outputPath + "/torque/TorqueStator.txt", comm);
       fp2->addInteractor(statorInt);
 
-      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      SPtr<WriteThixotropyQuantitiesSimulationObserver> writeThixotropicMQSimulationObserver(new WriteThixotropyQuantitiesSimulationObserver(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(fp2);
-      calculator->addCoProcessor(writeMQCoProcessor);
-      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
-      //calculator->addCoProcessor(restartCoProcessor);
+      calculator->addSimulationObserver(npr);
+      calculator->addSimulationObserver(fp);
+      calculator->addSimulationObserver(fp2);
+      calculator->addSimulationObserver(writeMQSimulationObserver);
+      calculator->addSimulationObserver(writeThixotropicMQSimulationObserver);
+      //calculator->addSimulationObserver(restartSimulationObserver);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/sphere/sphere.cpp b/apps/cpu/sphere/sphere.cpp
index c01388374..c1fe99267 100644
--- a/apps/cpu/sphere/sphere.cpp
+++ b/apps/cpu/sphere/sphere.cpp
@@ -164,7 +164,7 @@ void run(string configname)
          GbCuboid3DPtr geoOutflow(new GbCuboid3D(d_maxX1, d_minX2 - 4.0*blockLength, d_minX3 - 4.0*blockLength, d_maxX1 + 4.0*blockLength, d_maxX2 + 4.0*blockLength, d_maxX3 + 4.0*blockLength));
          if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), outputPath + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
 
-         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppblocks(new WriteBlocksSimulationObserver(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
 
          //walls
          SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, slipBC, Interactor3D::SOLID));
@@ -251,8 +251,8 @@ void run(string configname)
 
          //Postrozess
          SPtr<UbScheduler> geoSch(new UbScheduler(1));
-         SPtr<CoProcessor> ppgeo(
-            new WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         SPtr<SimulationObserver> ppgeo(
+            new WriteBoundaryConditionsSimulationObserver(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
          ppgeo->process(0);
          ppgeo.reset();
 
@@ -282,21 +282,21 @@ void run(string configname)
 
       SPtr<UbScheduler> stepSch(new UbScheduler(outstep));
       //stepSch->addSchedule(10000, 0, 1000000);
-      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, outputPath, WbWriterVtkXmlBinary::getInstance(), conv,comm));
+      SPtr<WriteMacroscopicQuantitiesSimulationObserver> writeMQSimulationObserver(new WriteMacroscopicQuantitiesSimulationObserver(grid, stepSch, outputPath, WbWriterVtkXmlBinary::getInstance(), conv,comm));
 
       SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
-      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+      SPtr<SimulationObserver> npr(new NUPSCounterSimulationObserver(grid, nupsSch, numOfThreads, comm));
 
       real area = UbMath::PI * radius * radius;
       SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, uLB, area);
+      SPtr<CalculateForcesSimulationObserver> fp = make_shared<CalculateForcesSimulationObserver>(grid, forceSch, outputPath + "/forces/forces.txt", comm, uLB, area);
       fp->addInteractor(sphereInt);
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endstep));
-      calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
-      calculator->addCoProcessor(writeMQCoProcessor);
+      calculator->addSimulationObserver(npr);
+      calculator->addSimulationObserver(fp);
+      calculator->addSimulationObserver(writeMQSimulationObserver);
 
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
diff --git a/src/basics/geometry3d/CoordinateTransformation3D.h b/src/basics/geometry3d/CoordinateTransformation3D.h
index a0f88c1f6..d5560e84c 100644
--- a/src/basics/geometry3d/CoordinateTransformation3D.h
+++ b/src/basics/geometry3d/CoordinateTransformation3D.h
@@ -137,10 +137,10 @@ private:
     bool active;
     bool transformation;
 
-    friend class MPIIOCoProcessor;
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
-    friend class MPIIOMigrationBECoProcessor;
+    friend class MPIIOSimulationObserver;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
+    friend class MPIIOMigrationBESimulationObserver;
     friend class CheckpointConverter;
 };
 
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.cpp
similarity index 90%
rename from src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp
rename to src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.cpp
index bf923b2a2..3c4a021cc 100644
--- a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.cpp
@@ -1,7 +1,7 @@
-#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingSimulationObserver.h"
 #include "GbSphere3D.h"
 #include "mpi/MPICommunicator.h"
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LiggghtsCouplingWrapper.h"
 #include "Grid3D.h"
 #include "Block3D.h"
@@ -12,23 +12,23 @@
 #include "LBMUnitConverter.h"
 #include "fix_lb_coupling_onetoone.h"
 
-LiggghtsCouplingCoProcessor::LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+LiggghtsCouplingSimulationObserver::LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                          SPtr<vf::mpi::Communicator> comm,
                                                          LiggghtsCouplingWrapper &wrapper, int demSteps,
                                                          SPtr<LBMUnitConverter> units)
-    : CoProcessor(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units)
+    : SimulationObserver(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units)
 {
 
 }
 
-LiggghtsCouplingCoProcessor::~LiggghtsCouplingCoProcessor()
+LiggghtsCouplingSimulationObserver::~LiggghtsCouplingSimulationObserver()
 {
 }
 
-void LiggghtsCouplingCoProcessor::process(double actualTimeStep)
+void LiggghtsCouplingSimulationObserver::process(double actualTimeStep)
 { 
     if (comm->getProcessID() == 0)
-        std::cout << "LiggghtsCouplingCoProcessor step: " << actualTimeStep << "\n";
+        std::cout << "LiggghtsCouplingSimulationObserver step: " << actualTimeStep << "\n";
     
     //comm->barrier();
 
@@ -45,7 +45,7 @@ void LiggghtsCouplingCoProcessor::process(double actualTimeStep)
     //comm->barrier();
 }
 
-void LiggghtsCouplingCoProcessor::setSpheresOnLattice()
+void LiggghtsCouplingSimulationObserver::setSpheresOnLattice()
 {
     std::vector<int> excludeType;
 
@@ -88,7 +88,7 @@ void LiggghtsCouplingCoProcessor::setSpheresOnLattice()
     }
 }
 
-void LiggghtsCouplingCoProcessor::setSingleSphere3D(double *x, double *v, double *omega, /* double *com,*/ double r,
+void LiggghtsCouplingSimulationObserver::setSingleSphere3D(double *x, double *v, double *omega, /* double *com,*/ double r,
                                                     int id /*, bool initVelFlag*/)
 {
     int level = 0;
@@ -172,7 +172,7 @@ void LiggghtsCouplingCoProcessor::setSingleSphere3D(double *x, double *v, double
 
 }
 
-double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double const dy_, double const dz_,
+double LiggghtsCouplingSimulationObserver::calcSolidFraction(double const dx_, double const dy_, double const dz_,
                                                       double const r_)
 {
     static int const slicesPerDim = 5;
@@ -219,7 +219,7 @@ double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double c
     return fraction * ((double)n);
 }
 
-  void LiggghtsCouplingCoProcessor::setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega)
+  void LiggghtsCouplingSimulationObserver::setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega)
 {
     p.uPart[0] = v[0];
     p.uPart[1] = v[1];
@@ -235,7 +235,7 @@ double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double c
 }
 
 
-void LiggghtsCouplingCoProcessor::setToZero(IBdynamicsParticleData &p)
+void LiggghtsCouplingSimulationObserver::setToZero(IBdynamicsParticleData &p)
 {
     p.uPart[0]      = 0;
     p.uPart[1]      = 0;
@@ -244,7 +244,7 @@ void LiggghtsCouplingCoProcessor::setToZero(IBdynamicsParticleData &p)
     p.partId        = 0;
 }
 
-void LiggghtsCouplingCoProcessor::getForcesFromLattice()
+void LiggghtsCouplingSimulationObserver::getForcesFromLattice()
 {
     static std::vector<double> force, torque;
     static typename ParticleData::ParticleDataArrayVector x_lb;
@@ -319,7 +319,7 @@ void LiggghtsCouplingCoProcessor::getForcesFromLattice()
     couplingFix->comm_force_torque();
 }
 
-void LiggghtsCouplingCoProcessor::SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque)
+void LiggghtsCouplingSimulationObserver::SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque)
 {
     int nx = grid->getNX1(), ny = grid->getNX2(), nz = grid->getNX3();
 
@@ -402,12 +402,12 @@ void LiggghtsCouplingCoProcessor::SumForceTorque3D(ParticleData::ParticleDataArr
     }
  }
 
-void LiggghtsCouplingCoProcessor::addForce(int const partId, int const coord, double const value, double *force)
+void LiggghtsCouplingSimulationObserver::addForce(int const partId, int const coord, double const value, double *force)
 {
     force[3 * partId + coord] += value;
 }
 
-void LiggghtsCouplingCoProcessor::addTorque(int const partId, int const coord, double const value, double *torque)
+void LiggghtsCouplingSimulationObserver::addTorque(int const partId, int const coord, double const value, double *torque)
 {
     torque[3 * partId + coord] += value;
 }
\ No newline at end of file
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.h
similarity index 90%
rename from src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h
rename to src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.h
index 3e87c89d2..796208653 100644
--- a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingSimulationObserver.h
@@ -26,15 +26,15 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file LiggghtsCouplingCoProcessor.h
+//! \file LiggghtsCouplingSimulationObserver.h
 //! \ingroup LiggghtsCoupling
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef LiggghtsCouplingCoProcessor_h
-#define LiggghtsCouplingCoProcessor_h
+#ifndef LiggghtsCouplingSimulationObserver_h
+#define LiggghtsCouplingSimulationObserver_h
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 #include "lammps.h"
 #include "input.h"
@@ -45,7 +45,7 @@
 #include <vector>
 
 
-class CoProcessor;
+class SimulationObserver;
 namespace vf::mpi {class Communicator;}
 class LiggghtsCouplingWrapper;
 class Grid3D;
@@ -58,12 +58,12 @@ struct ParticleData {
     typedef typename std::vector<double> ParticleDataScalarVector;
 };
 
-class LiggghtsCouplingCoProcessor : public CoProcessor
+class LiggghtsCouplingSimulationObserver : public SimulationObserver
 {
 public:
-    LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm,
+    LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm,
                                 LiggghtsCouplingWrapper &wrapper, int demSteps, SPtr<LBMUnitConverter> units);
-    virtual ~LiggghtsCouplingCoProcessor();
+    virtual ~LiggghtsCouplingSimulationObserver();
 
     void process(double actualTimeStep) override;
 
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index 458cd4733..69b768e98 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -183,41 +183,41 @@
 #include <Interactors/Interactor3D.h>
 #include <Interactors/InteractorsHelper.h>
 
-#include <CoProcessors/AdjustForcingCoProcessor.h>
-#include <CoProcessors/CalculateForcesCoProcessor.h>
-#include <CoProcessors/CalculateTorqueCoProcessor.h>
-#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
-#include <CoProcessors/WriteMQFromSelectionCoProcessor.h>
-#include <CoProcessors/WriteBoundaryConditionsCoProcessor.h>
-#include <CoProcessors/WriteMQFromSelectionCoProcessor.h>
-#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
-#include <WriteBlocksCoProcessor.h>
-//#include <CoProcessors/PathLineCoProcessor.h>
-//#include <CoProcessors/PathLineCoProcessorMcpart.h>
-#include <CoProcessors/EmergencyExitCoProcessor.h>
-#include <CoProcessors/NUPSCounterCoProcessor.h>
-#include <CoProcessors/PressureDifferenceCoProcessor.h>
-//#include <CoProcessors/Particles.h>
-#include <CoProcessors/AverageValuesCoProcessor.h>
-#include <CoProcessors/CoProcessor.h>
-#include <CoProcessors/DecreaseViscosityCoProcessor.h>
-#include <CoProcessors/InSituVTKCoProcessor.h>
-#include <CoProcessors/QCriterionCoProcessor.h>
-#include <CoProcessors/ShearStressCoProcessor.h>
-#include <CoProcessors/TimeseriesCoProcessor.h>
-#include <CoProcessors/TurbulenceIntensityCoProcessor.h>
-#include <CoProcessors/TimeAveragedValuesCoProcessor.h>
+#include <SimulationObservers/AdjustForcingSimulationObserver.h>
+#include <SimulationObservers/CalculateForcesSimulationObserver.h>
+#include <SimulationObservers/CalculateTorqueSimulationObserver.h>
+#include <SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h>
+#include <SimulationObservers/WriteMQFromSelectionSimulationObserver.h>
+#include <SimulationObservers/WriteBoundaryConditionsSimulationObserver.h>
+#include <SimulationObservers/WriteMQFromSelectionSimulationObserver.h>
+#include <SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h>
+#include <WriteBlocksSimulationObserver.h>
+//#include <SimulationObservers/PathLineSimulationObserver.h>
+//#include <SimulationObservers/PathLineSimulationObserverMcpart.h>
+#include <SimulationObservers/EmergencyExitSimulationObserver.h>
+#include <SimulationObservers/NUPSCounterSimulationObserver.h>
+#include <SimulationObservers/PressureDifferenceSimulationObserver.h>
+//#include <SimulationObservers/Particles.h>
+#include <SimulationObservers/AverageValuesSimulationObserver.h>
+#include <SimulationObservers/SimulationObserver.h>
+#include <SimulationObservers/DecreaseViscositySimulationObserver.h>
+#include <SimulationObservers/InSituVTKSimulationObserver.h>
+#include <SimulationObservers/QCriterionSimulationObserver.h>
+#include <SimulationObservers/ShearStressSimulationObserver.h>
+#include <SimulationObservers/TimeseriesSimulationObserver.h>
+#include <SimulationObservers/TurbulenceIntensitySimulationObserver.h>
+#include <SimulationObservers/TimeAveragedValuesSimulationObserver.h>
 
-//#include <CoProcessors/MeanValuesCoProcessor.h>
-#include <CoProcessors/InSituCatalystCoProcessor.h>
-#include <CoProcessors/LineTimeSeriesCoProcessor.h>
-#include <CoProcessors/MPIIOMigrationBECoProcessor.h>
-#include <CoProcessors/MPIIOMigrationCoProcessor.h>
-#include <CoProcessors/MPIIORestartCoProcessor.h>
-#include <CoProcessors/MicrophoneArrayCoProcessor.h>
-#include <WriteThixotropyQuantitiesCoProcessor.h>
-#include <WriteMultiphaseQuantitiesCoProcessor.h>
-#include <TimeDependentBCCoProcessor.h>
+//#include <SimulationObservers/MeanValuesSimulationObserver.h>
+#include <SimulationObservers/InSituCatalystSimulationObserver.h>
+#include <SimulationObservers/LineTimeSeriesSimulationObserver.h>
+#include <SimulationObservers/MPIIOMigrationBESimulationObserver.h>
+#include <SimulationObservers/MPIIOMigrationSimulationObserver.h>
+#include <SimulationObservers/MPIIORestartSimulationObserver.h>
+#include <SimulationObservers/MicrophoneArraySimulationObserver.h>
+#include <WriteThixotropyQuantitiesSimulationObserver.h>
+#include <WriteMultiphaseQuantitiesSimulationObserver.h>
+#include <TimeDependentBCSimulationObserver.h>
 
 #include <IntegrateValuesHelper.h>
 //#include <LBM/D3Q27CompactInterpolationProcessor.h>
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h
index b9d08f711..13d8fbad8 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h
@@ -130,9 +130,9 @@ private:
     //////////////////////////////////////////////////////////////////////////
     void deleteBC(std::size_t x1, std::size_t x2, std::size_t x3);
 
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
-    friend class MPIIOMigrationBECoProcessor;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
+    friend class MPIIOMigrationBESimulationObserver;
 
 protected:
     //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
index e3f42c29b..963c2df62 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
@@ -338,9 +338,9 @@ protected:
     char algorithmType { -1 };
 
 private:
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
-    friend class MPIIOMigrationBECoProcessor;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
+    friend class MPIIOMigrationBESimulationObserver;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt
index 0485e00ec..75db42ccb 100644
--- a/src/cpu/VirtualFluidsCore/CMakeLists.txt
+++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt
@@ -42,7 +42,7 @@ target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/LB
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Parallel)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Grid)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Visitors)
-target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/CoProcessors)
+target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/SimulationObservers)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Utilities)
 
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h
deleted file mode 100644
index 13eaa7832..000000000
--- a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  EmergencyExitCoProcessor.h
- *
- *  Created on: 05.10.2012
- *  Author: K. Kucher
- */
-
-#ifndef EmergencyExitCoProcessor_H
-#define EmergencyExitCoProcessor_H
-
-#include <PointerDefinitions.h>
-#include <string>
-
-#include "CoProcessor.h"
-
-class MPIIORestartCoProcessor;
-namespace vf::mpi {class Communicator;}
-class Grid3D;
-class UbScheduler;
-
-class EmergencyExitCoProcessor : public CoProcessor
-{
-public:
-    EmergencyExitCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                             SPtr<MPIIORestartCoProcessor> rp, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~EmergencyExitCoProcessor() override;
-
-    void process(real step) override;
-
-protected:
-    void collectData(real step);
-    void writeMetafile(int status);
-    bool readMetafile();
-    void checkMetafile();
-
-private:
-    std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
-    SPtr<MPIIORestartCoProcessor> rp;
-    std::string metafile;
-};
-
-#endif /* EmergencyExitCoProcessor_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp
deleted file mode 100644
index 22158269d..000000000
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "TimeDependentBCCoProcessor.h"
-
-#include "Grid3D.h"
-#include "Interactor3D.h"
-#include "UbScheduler.h"
-
-TimeDependentBCCoProcessor::TimeDependentBCCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : CoProcessor(grid, s) {}
-//////////////////////////////////////////////////////////////////////////
-TimeDependentBCCoProcessor::~TimeDependentBCCoProcessor() = default;
-//////////////////////////////////////////////////////////////////////////
-void TimeDependentBCCoProcessor::process(real step)
-{
-    if (scheduler->isDue(step)) {
-        for (SPtr<Interactor3D> inter : interactors)
-            inter->updateInteractor(step);
-        UBLOG(logDEBUG3, "TimeDependentBCCoProcessor::update:" << step);
-    }
-}
-//////////////////////////////////////////////////////////////////////////
-void TimeDependentBCCoProcessor::addInteractor(SPtr<Interactor3D> interactor) { interactors.push_back(interactor); }
-
-//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h
deleted file mode 100644
index e8f7d3e0f..000000000
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeDependentBCCoProcessor.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef TimeDependentBCCoProcessor_H
-#define TimeDependentBCCoProcessor_H
-
-#include <PointerDefinitions.h>
-#include <vector>
-
-#include "CoProcessor.h"
-
-class Interactor3D;
-class Grid3D;
-
-//! \brief The class update interactors depend of time step.
-//! \details TimeDependentBCCoProcessor update every time step information in BCs throw Interactors
-//! \author Sonja Uphoff, Kostyantyn Kucher
-class TimeDependentBCCoProcessor : public CoProcessor
-{
-public:
-    TimeDependentBCCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
-    ~TimeDependentBCCoProcessor() override;
-
-    void process(real step) override;
-
-    //! add interactors to CoProcessor
-    void addInteractor(SPtr<Interactor3D> interactor);
-
-private:
-    std::vector<SPtr<Interactor3D>> interactors;
-};
-
-#endif /* TimeDependentBCCoProcessor_H */
diff --git a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h
index 060e2cb3a..21f161064 100644
--- a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h
+++ b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.h
@@ -103,8 +103,8 @@ protected:
     CbArray3D<real, IndexerX3X2X1>::CbArray3DPtr zeroDistributions;
     size_t NX1, NX2, NX3;
 
-    friend class MPIIORestartCoProcessor;
-    friend class MPIIOMigrationCoProcessor;
+    friend class MPIIORestartSimulationObserver;
+    friend class MPIIOMigrationSimulationObserver;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp b/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp
index 85235867a..a0b55fc79 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp
+++ b/src/cpu/VirtualFluidsCore/Grid/Calculator.cpp
@@ -35,7 +35,7 @@
 
 #include "Block3D.h"
 #include "Block3DConnector.h"
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
@@ -75,11 +75,11 @@ Calculator::Calculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayer
 //////////////////////////////////////////////////////////////////////////
 Calculator::~Calculator() = default;
 //////////////////////////////////////////////////////////////////////////
-void Calculator::addCoProcessor(SPtr<CoProcessor> coProcessor) { coProcessors.push_back(coProcessor); }
+void Calculator::addSimulationObserver(SPtr<SimulationObserver> coProcessor) { coProcessors.push_back(coProcessor); }
 //////////////////////////////////////////////////////////////////////////
 void Calculator::coProcess(real step)
 {
-    for (SPtr<CoProcessor> cp : coProcessors) {
+    for (SPtr<SimulationObserver> cp : coProcessors) {
         cp->process(step);
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/Grid/Calculator.h b/src/cpu/VirtualFluidsCore/Grid/Calculator.h
index 759541dd5..8ae810c7e 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Calculator.h
+++ b/src/cpu/VirtualFluidsCore/Grid/Calculator.h
@@ -42,7 +42,7 @@ class Grid3D;
 class UbScheduler;
 class Block3D;
 class Block3DConnector;
-class CoProcessor;
+class SimulationObserver;
 
 //! \class Calculator
 //! \brief A base class for main calculation loop
@@ -53,7 +53,7 @@ public:
     Calculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps);
     virtual ~Calculator();
     //! control of coProcessors
-    void addCoProcessor(SPtr<CoProcessor> coProcessor);
+    void addSimulationObserver(SPtr<SimulationObserver> coProcessor);
     void coProcess(real step);
 
     virtual void calculate() = 0;
@@ -86,7 +86,7 @@ protected:
     std::vector<std::vector<SPtr<Block3DConnector>>> localInterConns;
     std::vector<std::vector<SPtr<Block3DConnector>>> remoteInterConns;
 
-    std::vector<SPtr<CoProcessor>> coProcessors;
+    std::vector<SPtr<SimulationObserver>> coProcessors;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
index bbc4face9..e84d4b7cd 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
+++ b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
@@ -56,7 +56,7 @@ struct dataSetParam {
 };
 
 //! \struct DataSetRestart
-//! \brief Structure describes parameters of the dataSet in MPIIORestartCoProcessor format
+//! \brief Structure describes parameters of the dataSet in MPIIORestartSimulationObserver format
 //! \details The structure is used when reading from the file
 struct DataSetRestart {
     real collFactor;
@@ -74,7 +74,7 @@ struct DataSetRestart {
 };
 
 //! \struct DataSetMigration
-//! \brief Structure describes parameters of the dataSet in MPIIOMigrationCoProcessor format
+//! \brief Structure describes parameters of the dataSet in MPIIOMigrationSimulationObserver format
 //! \details The structure is used to find the needed block in the grid when restoring a dataSet
 struct DataSetMigration {
     real collFactor;
@@ -89,7 +89,7 @@ struct DataSetMigration {
 };
 
 //! \struct DataSetSmallRead
-//! \brief Structure describes parameters of the DataSetSmall in MPIIORestartCoProcessor format
+//! \brief Structure describes parameters of the DataSetSmall in MPIIORestartSimulationObserver format
 //! \details The structure is used when reading from the file
 struct DataSetSmallRestart {
     int x1;
@@ -98,7 +98,7 @@ struct DataSetSmallRestart {
     int level;
 };
 //! \struct dataSetSmall
-//! \brief Structure containes information identifying the block in MPIIOMigrationCoProcessor format
+//! \brief Structure containes information identifying the block in MPIIOMigrationSimulationObserver format
 //! \details The structure is used to find the needed block in the grid when restoring a dataSet arrays
 struct DataSetSmallMigration {
     int globalID;
@@ -138,7 +138,7 @@ struct boundCondParam {
 };
 
 //! \struct BCAddRead
-//! \brief Structure describes parameters of the BCAdd in MPIIORestartCoProcessor format
+//! \brief Structure describes parameters of the BCAdd in MPIIORestartSimulationObserver format
 //! \details The structure is used when reading from the file
 struct BCAddRestart {
     int x1; //	to find the right block
@@ -151,7 +151,7 @@ struct BCAddRestart {
 
 //! \struct BCAdd
 //! \brief Structure containes information identifying the block and some parameters of the arrays
-//! \of boundary conditions that are equal in all blocks in MPIIOMigrationCoProcessor format
+//! \of boundary conditions that are equal in all blocks in MPIIOMigrationSimulationObserver format
 //! \details The structure is used to find the needed block in the grid when restoring a dataSet
 //! and to set common parameters
 struct BCAddMigration {
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
index f3137e5f6..af91e66fb 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
@@ -1,8 +1,8 @@
 /*
- * D3Q27AdjustForcingCoProcessor.cpp
+ * D3Q27AdjustForcingSimulationObserver.cpp
  *  Author: Konstantin Kutscher
  */
-#include "AdjustForcingCoProcessor.h"
+#include "AdjustForcingSimulationObserver.h"
 
 #include <fstream>
 
@@ -12,11 +12,11 @@
 #include "UbScheduler.h"
 #include <SetForcingBlockVisitor.h>
 
-AdjustForcingCoProcessor::AdjustForcingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+AdjustForcingSimulationObserver::AdjustForcingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                    SPtr<IntegrateValuesHelper> integrateValues, real vTarged,
                                                    std::shared_ptr<vf::mpi::Communicator> comm)
 
-    : CoProcessor(grid, s), path(path), integrateValues(integrateValues), comm(comm), vx1Targed(vTarged)
+    : SimulationObserver(grid, s), path(path), integrateValues(integrateValues), comm(comm), vx1Targed(vTarged)
 {
     // cnodes = integrateValues->getCNodes();
     root = comm->isRoot();
@@ -71,13 +71,13 @@ AdjustForcingCoProcessor::AdjustForcingCoProcessor(SPtr<Grid3D> grid, SPtr<UbSch
 }
 
 //////////////////////////////////////////////////////////////////////////
-void AdjustForcingCoProcessor::process(real step)
+void AdjustForcingSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void AdjustForcingCoProcessor::collectData(real step)
+void AdjustForcingSimulationObserver::collectData(real step)
 {
     //////////////////////////////////////////////////////////////////////////////////////////////////
     // temporary solution
@@ -140,7 +140,7 @@ void AdjustForcingCoProcessor::collectData(real step)
     //}
 
     if (root) {
-        // UBLOG(logINFO, "D3Q27AdjustForcingCoProcessor step: " << static_cast<int>(step));
+        // UBLOG(logINFO, "D3Q27AdjustForcingSimulationObserver step: " << static_cast<int>(step));
         // UBLOG(logINFO, "new forcing is: " << forcing);
         std::string fname = path + "/forcing/forcing.csv";
         // std::string fname = path + "/forcing/forcing_"+UbSystem::toString(comm->getProcessID())+".csv";
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
similarity index 81%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
index be8dbc69f..72141c6dd 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AdjustForcingCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
@@ -1,10 +1,10 @@
-#ifndef D3Q27ADJUSTFORCINGCoProcessor_H
-#define D3Q27ADJUSTFORCINGCoProcessor_H
+#ifndef D3Q27ADJUSTFORCINGSimulationObserver_H
+#define D3Q27ADJUSTFORCINGSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "lbm/constants/D3Q27.h"
 
 namespace vf::mpi {class Communicator;}
@@ -18,10 +18,10 @@ class IntegrateValuesHelper;
 //!          Integrate values helper, scheduler must be set in test case.
 //! \author: Konstantin Kutscher
 
-class AdjustForcingCoProcessor : public CoProcessor
+class AdjustForcingSimulationObserver : public SimulationObserver
 {
 public:
-    AdjustForcingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    AdjustForcingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                              SPtr<IntegrateValuesHelper> integrateValues, real vTarged, std::shared_ptr<vf::mpi::Communicator> comm);
     //!< calls collect PostprocessData
     void process(real step) override;
@@ -55,4 +55,4 @@ private:
     std::string path;
 };
 
-#endif /* D3Q27RHODIFFERENCECoProcessor_H_ */
+#endif /* D3Q27RHODIFFERENCESimulationObserver_H_ */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
similarity index 95%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
index b34f61299..9dc2e93ee 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "AverageValuesCoProcessor.h"
+#include "AverageValuesSimulationObserver.h"
 
 #include "BCSet.h"
 #include "LBMKernel.h"
@@ -15,12 +15,12 @@
 
 using namespace std;
 
-AverageValuesCoProcessor::AverageValuesCoProcessor() = default;
+AverageValuesSimulationObserver::AverageValuesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-AverageValuesCoProcessor::AverageValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+AverageValuesSimulationObserver::AverageValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                                    SPtr<UbScheduler> s, SPtr<UbScheduler> Avs,
                                                    SPtr<UbScheduler> rsMeans, SPtr<UbScheduler> rsRMS, bool restart)
-    : CoProcessor(grid, s), averageScheduler(Avs), resetSchedulerMeans(rsMeans), resetSchedulerRMS(rsRMS), path(path),
+    : SimulationObserver(grid, s), averageScheduler(Avs), resetSchedulerMeans(rsMeans), resetSchedulerRMS(rsRMS), path(path),
       writer(writer)
 {
     resetStepMeans  = (int)rsMeans->getMinBegin();
@@ -54,7 +54,7 @@ AverageValuesCoProcessor::AverageValuesCoProcessor(SPtr<Grid3D> grid, const std:
     // restartStep = 0.0;
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::process(real step)
+void AverageValuesSimulationObserver::process(real step)
 {
     // resetRMS(step);
     if (resetSchedulerRMS->isDue(step))
@@ -73,10 +73,10 @@ void AverageValuesCoProcessor::process(real step)
         collectData(step);
     }
 
-    UBLOG(logDEBUG3, "AverageValuesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "AverageValuesSimulationObserver::update:" << step);
 }
 
-void AverageValuesCoProcessor::resetDataRMS(real step)
+void AverageValuesSimulationObserver::resetDataRMS(real step)
 {
     resetStepRMS = (int)step;
 
@@ -120,7 +120,7 @@ void AverageValuesCoProcessor::resetDataRMS(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::resetDataMeans(real step)
+void AverageValuesSimulationObserver::resetDataMeans(real step)
 {
     resetStepMeans = (int)step;
 
@@ -161,7 +161,7 @@ void AverageValuesCoProcessor::resetDataMeans(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::collectData(real step)
+void AverageValuesSimulationObserver::collectData(real step)
 {
     int istep = int(step);
 
@@ -195,18 +195,18 @@ void AverageValuesCoProcessor::collectData(real step)
 
         vector<string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "AverageValuesCoProcessor step: " << istep);
+        UBLOG(logINFO, "AverageValuesSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::clearData()
+void AverageValuesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -214,7 +214,7 @@ void AverageValuesCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::addData(const SPtr<Block3D> block)
+void AverageValuesSimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //	UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -330,7 +330,7 @@ void AverageValuesCoProcessor::addData(const SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
+void AverageValuesSimulationObserver::calculateAverageValues(real timeStep)
 {
     using namespace D3Q27System;
 
@@ -446,7 +446,7 @@ void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
     }
 }
 ////////////////////////////////////////////////////////////////////////////
-// void AverageValuesCoProcessor::initPlotData(double step)
+// void AverageValuesSimulationObserver::initPlotData(double step)
 //{
 //   std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
 //	if (comm->getProcessID() == comm->getRoot())
@@ -469,7 +469,7 @@ void AverageValuesCoProcessor::calculateAverageValues(real timeStep)
 //	}
 //}
 //////////////////////////////////////////////////////////////////////////////
-// void AverageValuesCoProcessor::collectPlotData(double step)
+// void AverageValuesSimulationObserver::collectPlotData(double step)
 //{
 //
 //	double hminX1 = 0.9;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.h
similarity index 89%
rename from src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.h
index b45118adb..d406a018b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/AverageValuesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef AverageValuesCoProcessor_H
-#define AverageValuesCoProcessor_H
+#ifndef AverageValuesSimulationObserver_H
+#define AverageValuesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -22,11 +22,11 @@ class Block3D;
 //
 //! \author  Sonja Uphoff, Kostyantyn Kucher
 // \f$ u_{mean}=\frac{1}{N}\sum\limits_{i=1}^n u_{i} \f$
-class AverageValuesCoProcessor : public CoProcessor
+class AverageValuesSimulationObserver : public SimulationObserver
 {
 public:
-    AverageValuesCoProcessor();
-    AverageValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
+    AverageValuesSimulationObserver();
+    AverageValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
                              SPtr<UbScheduler> Avs, SPtr<UbScheduler> rsMeans, SPtr<UbScheduler> rsRMS, bool restart);
     //! Make update
     void process(real step) override;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
index 2a7635d2a..9189a4089 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "CalculateForcesCoProcessor.h"
+#include "CalculateForcesSimulationObserver.h"
 #include "BCSet.h"
 
 #include "BCArray3D.h"
@@ -13,9 +13,9 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-CalculateForcesCoProcessor::CalculateForcesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+CalculateForcesSimulationObserver::CalculateForcesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                        std::shared_ptr<vf::mpi::Communicator> comm, real v, real a)
-    : CoProcessor(grid, s), path(path), comm(comm), v(v), a(a), forceX1global(0), forceX2global(0), forceX3global(0)
+    : SimulationObserver(grid, s), path(path), comm(comm), v(v), a(a), forceX1global(0), forceX2global(0), forceX3global(0)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         std::ofstream ostr;
@@ -55,17 +55,17 @@ CalculateForcesCoProcessor::CalculateForcesCoProcessor(SPtr<Grid3D> grid, SPtr<U
     }
 }
 //////////////////////////////////////////////////////////////////////////
-CalculateForcesCoProcessor::~CalculateForcesCoProcessor() = default;
+CalculateForcesSimulationObserver::~CalculateForcesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::process(real step)
+void CalculateForcesSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::collectData(real step)
+void CalculateForcesSimulationObserver::collectData(real step)
 {
     calculateForces();
 
@@ -101,7 +101,7 @@ void CalculateForcesCoProcessor::collectData(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::calculateForces()
+void CalculateForcesSimulationObserver::calculateForces()
 {
     forceX1global = 0.0;
     forceX2global = 0.0;
@@ -184,7 +184,7 @@ void CalculateForcesCoProcessor::calculateForces()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateForcesCoProcessor::getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions,
+UbTupleDouble3 CalculateForcesSimulationObserver::getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions,
                                                      SPtr<BoundaryConditions> bc)
 {
     UbTupleDouble3 force(0.0, 0.0, 0.0);
@@ -215,7 +215,7 @@ UbTupleDouble3 CalculateForcesCoProcessor::getForces(int x1, int x2, int x3, SPt
     return force;
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::calculateCoefficients()
+void CalculateForcesSimulationObserver::calculateCoefficients()
 {
     real F1 = forceX1global;
     real F2 = forceX2global;
@@ -227,9 +227,9 @@ void CalculateForcesCoProcessor::calculateCoefficients()
     C3 = 2.0 * F3 / (v * v * a);
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
+void CalculateForcesSimulationObserver::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
 //////////////////////////////////////////////////////////////////////////
-void CalculateForcesCoProcessor::write(std::ofstream *fileObject, real value, char *separator)
+void CalculateForcesSimulationObserver::write(std::ofstream *fileObject, real value, char *separator)
 {
     (*fileObject).width(12);
     //(*fileObject).precision(2);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
similarity index 74%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
index d282ae8ed..4198b99dd 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateForcesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
@@ -1,18 +1,18 @@
 /*
- *  D3Q27ForcesCoProcessor.h
+ *  D3Q27ForcesSimulationObserver.h
  *
  *  Created on: 29.09.2012
  *  Author: K. Kucher
  */
 
-#ifndef D3Q27ForcesCoProcessor_H
-#define D3Q27ForcesCoProcessor_H
+#ifndef D3Q27ForcesSimulationObserver_H
+#define D3Q27ForcesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 #include "lbm/constants/D3Q27.h"
 
@@ -24,15 +24,15 @@ class D3Q27Interactor;
 class DistributionArray3D;
 class BoundaryConditions;
 
-class CalculateForcesCoProcessor : public CoProcessor
+class CalculateForcesSimulationObserver : public SimulationObserver
 {
 public:
     //! Constructor
     //! \param v - velocity of fluid in LB units
     //! \param a - area of object in LB units
-    CalculateForcesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm,
+    CalculateForcesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm,
                                real v, real a);
-    ~CalculateForcesCoProcessor() override;
+    ~CalculateForcesSimulationObserver() override;
     void process(real step) override;
     void addInteractor(SPtr<D3Q27Interactor> interactor);
 
@@ -58,4 +58,4 @@ private:
     real C3;
 };
 
-#endif /* D3Q27ForcesCoProcessor_H */
+#endif /* D3Q27ForcesSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
index b4b8b1b58..5cacf602f 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "CalculateTorqueCoProcessor.h"
+#include "CalculateTorqueSimulationObserver.h"
 #include "BCSet.h"
 
 #include <mpi/Communicator.h>
@@ -14,7 +14,7 @@
 #include "DistributionArray3D.h"
 #include "Rheology.h"
 
-CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
+CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
 {
    if (comm->getProcessID() == comm->getRoot())
    {
@@ -37,20 +37,20 @@ CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<
    }
 }
 //////////////////////////////////////////////////////////////////////////
-CalculateTorqueCoProcessor::~CalculateTorqueCoProcessor()
+CalculateTorqueSimulationObserver::~CalculateTorqueSimulationObserver()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::process( real step )
+void CalculateTorqueSimulationObserver::process( real step )
 {
    if(scheduler->isDue(step) )
       collectData(step);
 
-   UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+   UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::collectData( real step )
+void CalculateTorqueSimulationObserver::collectData( real step )
 {
    calculateForces();
 
@@ -80,7 +80,7 @@ void CalculateTorqueCoProcessor::collectData( real step )
    }
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::calculateForces()
+void CalculateTorqueSimulationObserver::calculateForces()
 {
    torqueX1global = 0.0;
    torqueX2global = 0.0;
@@ -180,7 +180,7 @@ void CalculateTorqueCoProcessor::calculateForces()
    }
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc)
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForces(int x1, int x2, int x3,  SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc)
 {
    UbTupleDouble3 force(0.0,0.0,0.0);
 
@@ -214,7 +214,7 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SP
    return force;
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromMoments(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForcesFromMoments(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
 {
    using namespace vf::lbm::constant;
    UbTupleDouble3 force(0.0, 0.0, 0.0);
@@ -249,7 +249,7 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromMoments(int x1, int x2,
    return force;
 }
 //////////////////////////////////////////////////////////////////////////
-UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromStressTensor(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
+UbTupleDouble3 CalculateTorqueSimulationObserver::getForcesFromStressTensor(int x1, int x2, int x3, SPtr<ILBMKernel> kernel, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc, real nx, real ny, real nz)
 {
    using namespace vf::lbm::constant;
    UbTupleDouble3 force(0.0, 0.0, 0.0);
@@ -285,7 +285,7 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForcesFromStressTensor(int x1, int
    return force;
 }
 //////////////////////////////////////////////////////////////////////////
-void CalculateTorqueCoProcessor::addInteractor( SPtr<D3Q27Interactor> interactor )
+void CalculateTorqueSimulationObserver::addInteractor( SPtr<D3Q27Interactor> interactor )
 {
    interactors.push_back(interactor);
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.h
similarity index 72%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.h
index 98b6d4001..75d840ed3 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.h
@@ -1,18 +1,18 @@
 /*
- *  D3Q27ForcesCoProcessor.h
+ *  D3Q27ForcesSimulationObserver.h
  *
  *  Created on: 29.09.2012
  *  Author: K. Kucher
  */
 
-#ifndef CalculateTorqueCoProcessor_H
-#define CalculateTorqueCoProcessor_H
+#ifndef CalculateTorqueSimulationObserver_H
+#define CalculateTorqueSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 #include "D3Q27System.h"
 
@@ -25,12 +25,12 @@ class DistributionArray3D;
 class BoundaryConditions;
 class ILBMKernel;
 
-class CalculateTorqueCoProcessor: public CoProcessor 
+class CalculateTorqueSimulationObserver: public SimulationObserver 
 {
 public:
    //! Constructor
-   CalculateTorqueCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-	virtual ~CalculateTorqueCoProcessor();             
+   CalculateTorqueSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+	virtual ~CalculateTorqueSimulationObserver();             
 	void process(real step); 
    void addInteractor(SPtr<D3Q27Interactor> interactor);
 protected:
@@ -52,4 +52,4 @@ private:
 };
 
 
-#endif /* D3Q27ForcesCoProcessor_H */
+#endif /* D3Q27ForcesSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
similarity index 76%
rename from src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
index 0221bf38a..d8b9757aa 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
@@ -1,11 +1,11 @@
 /*
- *  DecreaseViscosityCoProcessor
+ *  DecreaseViscositySimulationObserver
  *
  *  Created on: 10.05.2013
  *  Author: uphoff
  */
 
-#include "DecreaseViscosityCoProcessor.h"
+#include "DecreaseViscositySimulationObserver.h"
 
 #include <vector>
 
@@ -15,27 +15,27 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-DecreaseViscosityCoProcessor::DecreaseViscosityCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc,
+DecreaseViscositySimulationObserver::DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc,
                                                            std::shared_ptr<vf::mpi::Communicator> comm)
 
-    : CoProcessor(grid, s), nueFunc(nueFunc), comm(comm)
+    : SimulationObserver(grid, s), nueFunc(nueFunc), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
     }
 }
 //////////////////////////////////////////////////////////////////////////
-DecreaseViscosityCoProcessor::~DecreaseViscosityCoProcessor() = default;
+DecreaseViscositySimulationObserver::~DecreaseViscositySimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void DecreaseViscosityCoProcessor::process(real step)
+void DecreaseViscositySimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         setViscosity(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void DecreaseViscosityCoProcessor::setViscosity(real step)
+void DecreaseViscositySimulationObserver::setViscosity(real step)
 {
 
-    UBLOG(logDEBUG3, "DecreaseViscosityCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "DecreaseViscositySimulationObserver::update:" << step);
     int gridRank     = grid->getRank();
     int minInitLevel = this->grid->getCoarsestInitializedLevel();
     int maxInitLevel = this->grid->getFinestInitializedLevel();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
similarity index 63%
rename from src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
index aaa8a3c0b..a06652efa 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/DecreaseViscosityCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
@@ -1,9 +1,9 @@
-#ifndef DecreaseViscosityCoProcessor_H
-#define DecreaseViscosityCoProcessor_H
+#ifndef DecreaseViscositySimulationObserver_H
+#define DecreaseViscositySimulationObserver_H
 
 #include <PointerDefinitions.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "IntegrateValuesHelper.h"
 #include "LBMUnitConverter.h"
 
@@ -20,16 +20,16 @@ namespace vf::mpi {class Communicator;}
 //! decrViscFunc.SetExpr("nue0+c0/(t+1)/(t+1)");   //this function is time-dependent, the viscosity decreases a 1/t^2
 //! decrViscFunc.DefineConst("nue0", nueLB);
 //! decrViscFunc.DefineConst("c0", 0.1);           //constants such as c0 controll how fast the viscosity decreasis
-//! SPtr<UbScheduler> DecrViscSch(new UbScheduler()); //the CoProcessor is called according to a Scheduler
+//! SPtr<UbScheduler> DecrViscSch(new UbScheduler()); //the SimulationObserver is called according to a Scheduler
 //! DecrViscSch->addSchedule(10,10,1000);          //in this case the viscosity is reset every 10 timesteps for the
-//! first 1000 timesteps DecreaseViscosityCoProcessor decrViscPPPtr(grid, DecrViscSch,&decrViscFunc, comm); \endcode
+//! first 1000 timesteps DecreaseViscositySimulationObserver decrViscPPPtr(grid, DecrViscSch,&decrViscFunc, comm); \endcode
 //! \author Sonja Uphoff
 
-class DecreaseViscosityCoProcessor : public CoProcessor
+class DecreaseViscositySimulationObserver : public SimulationObserver
 {
 public:
-    DecreaseViscosityCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~DecreaseViscosityCoProcessor() override;
+    DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~DecreaseViscositySimulationObserver() override;
     //! calls collect PostprocessData.
     void process(real step) override;
 
@@ -43,4 +43,4 @@ private:
     mu::Parser *nueFunc;
 };
 
-#endif /* DecreaseViscosityCoProcessor_H_ */
+#endif /* DecreaseViscositySimulationObserver_H_ */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
similarity index 60%
rename from src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
index fc181e266..a502e834b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/EmergencyExitCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
@@ -1,15 +1,15 @@
-#include "EmergencyExitCoProcessor.h"
+#include "EmergencyExitSimulationObserver.h"
 #include <mpi/Communicator.h>
 #include "Grid3D.h"
-#include "MPIIORestartCoProcessor.h"
+#include "MPIIORestartSimulationObserver.h"
 #include "UbLogger.h"
 #include "UbScheduler.h"
 #include <basics/utilities/UbFileInputASCII.h>
 #include <basics/utilities/UbFileOutputASCII.h>
 
-EmergencyExitCoProcessor::EmergencyExitCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                   SPtr<MPIIORestartCoProcessor> rp, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), rp(rp), comm(comm)
+EmergencyExitSimulationObserver::EmergencyExitSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+                                                   SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::mpi::Communicator> comm)
+    : SimulationObserver(grid, s), path(path), rp(rp), comm(comm)
 {
     this->path = path + "/exit";
     metafile   = this->path + "/stop.txt";
@@ -20,40 +20,40 @@ EmergencyExitCoProcessor::EmergencyExitCoProcessor(SPtr<Grid3D> grid, SPtr<UbSch
     comm->barrier();
 }
 //////////////////////////////////////////////////////////////////////////
-EmergencyExitCoProcessor::~EmergencyExitCoProcessor() = default;
+EmergencyExitSimulationObserver::~EmergencyExitSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void EmergencyExitCoProcessor::process(real step)
+void EmergencyExitSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "EmergencyExitCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "EmergencyExitSimulationObserver::update:" << step);
 }
 
-void EmergencyExitCoProcessor::collectData(real step)
+void EmergencyExitSimulationObserver::collectData(real step)
 {
     if (readMetafile()) {
         rp->process((int)step);
         if (comm->getProcessID() == comm->getRoot())
-            UBLOG(logINFO, "EmergencyExitCoProcessor save step: " << step);
+            UBLOG(logINFO, "EmergencyExitSimulationObserver save step: " << step);
         comm->barrier();
         exit(EXIT_SUCCESS);
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void EmergencyExitCoProcessor::writeMetafile(int /*status*/)
+void EmergencyExitSimulationObserver::writeMetafile(int /*status*/)
 {
     UbFileOutputASCII out(metafile);
     out.writeBool(false);
 }
 //////////////////////////////////////////////////////////////////////////
-bool EmergencyExitCoProcessor::readMetafile()
+bool EmergencyExitSimulationObserver::readMetafile()
 {
     UbFileInputASCII in(metafile);
     return in.readBool();
 }
 //////////////////////////////////////////////////////////////////////////
-void EmergencyExitCoProcessor::checkMetafile()
+void EmergencyExitSimulationObserver::checkMetafile()
 {
     std::ifstream file(metafile.c_str());
     if (!file.is_open()) {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
new file mode 100644
index 000000000..b7d8f2219
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
@@ -0,0 +1,43 @@
+/*
+ *  EmergencyExitSimulationObserver.h
+ *
+ *  Created on: 05.10.2012
+ *  Author: K. Kucher
+ */
+
+#ifndef EmergencyExitSimulationObserver_H
+#define EmergencyExitSimulationObserver_H
+
+#include <PointerDefinitions.h>
+#include <string>
+
+#include "SimulationObserver.h"
+
+class MPIIORestartSimulationObserver;
+namespace vf::mpi {class Communicator;}
+class Grid3D;
+class UbScheduler;
+
+class EmergencyExitSimulationObserver : public SimulationObserver
+{
+public:
+    EmergencyExitSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+                             SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~EmergencyExitSimulationObserver() override;
+
+    void process(real step) override;
+
+protected:
+    void collectData(real step);
+    void writeMetafile(int status);
+    bool readMetafile();
+    void checkMetafile();
+
+private:
+    std::string path;
+    std::shared_ptr<vf::mpi::Communicator> comm;
+    SPtr<MPIIORestartSimulationObserver> rp;
+    std::string metafile;
+};
+
+#endif /* EmergencyExitSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
similarity index 100%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.h b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
similarity index 94%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
index 64b9f353b..5b3eee03f 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
@@ -1,6 +1,6 @@
 #ifdef VF_CATALYST
 
-#include "InSituCatalystCoProcessor.h"
+#include "InSituCatalystSimulationObserver.h"
 #include <D3Q27ETBCSet.h>
 #include <LBMKernel.h>
 #include <string>
@@ -15,10 +15,10 @@
 
 using namespace std;
 
-InSituCatalystCoProcessor::InSituCatalystCoProcessor() {}
+InSituCatalystSimulationObserver::InSituCatalystSimulationObserver() {}
 //////////////////////////////////////////////////////////////////////////
-InSituCatalystCoProcessor::InSituCatalystCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script)
-    : CoProcessor(grid, s)
+InSituCatalystSimulationObserver::InSituCatalystSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script)
+    : SimulationObserver(grid, s)
 {
     gridRank     = vf::mpi::Communicator::getInstance()->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -40,17 +40,17 @@ InSituCatalystCoProcessor::InSituCatalystCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     buildVTKGrid();
 }
 //////////////////////////////////////////////////////////////////////////
-InSituCatalystCoProcessor::~InSituCatalystCoProcessor() {}
+InSituCatalystSimulationObserver::~InSituCatalystSimulationObserver() {}
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::process(real step)
+void InSituCatalystSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "InSituCatalystCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "InSituCatalystSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::collectData(real step)
+void InSituCatalystSimulationObserver::collectData(real step)
 {
     unsigned int istep = static_cast<int>(step);
 
@@ -86,10 +86,10 @@ void InSituCatalystCoProcessor::collectData(real step)
         Processor->CoProcess(dataDescription.GetPointer());
     }
 
-    UBLOG(logINFO, "InSituCatalystCoProcessor step: " << istep);
+    UBLOG(logINFO, "InSituCatalystSimulationObserver step: " << istep);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::addData(SPtr<Block3D> block)
+void InSituCatalystSimulationObserver::addData(SPtr<Block3D> block)
 {
     UbTupleDouble3 org          = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -166,7 +166,7 @@ void InSituCatalystCoProcessor::addData(SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::buildVTKGrid()
+void InSituCatalystSimulationObserver::buildVTKGrid()
 {
     unstructuredGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
     points           = vtkPoints::New();
@@ -206,7 +206,7 @@ void InSituCatalystCoProcessor::buildVTKGrid()
     vx3Array.resize(numOfPoints);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituCatalystCoProcessor::addVTKGridData(SPtr<Block3D> block)
+void InSituCatalystSimulationObserver::addVTKGridData(SPtr<Block3D> block)
 {
     UbTupleDouble3 org          = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.h
similarity index 74%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.h
index e1c9fb95c..705aeb927 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituCatalystCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.h
@@ -1,9 +1,9 @@
 #ifdef VF_CATALYST
 
-#ifndef InSituCatalystCoProcessor_h__
-#define InSituCatalystCoProcessor_h__
+#ifndef InSituCatalystSimulationObserver_h__
+#define InSituCatalystSimulationObserver_h__
 
-#include <CoProcessor.h>
+#include <SimulationObserver.h>
 #include <Grid3D.h>
 #include <LBMUnitConverter.h>
 #include "lbm/constants/D3Q27.h"
@@ -19,12 +19,12 @@
 #include <vtkSmartPointer.h>
 #include <vtkUnstructuredGrid.h>
 
-class InSituCatalystCoProcessor : public CoProcessor
+class InSituCatalystSimulationObserver : public SimulationObserver
 {
 public:
-    InSituCatalystCoProcessor();
-    InSituCatalystCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script);
-    virtual ~InSituCatalystCoProcessor();
+    InSituCatalystSimulationObserver();
+    InSituCatalystSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script);
+    virtual ~InSituCatalystSimulationObserver();
     void process(real step);
 
 protected:
@@ -52,6 +52,6 @@ private:
                                   real & /*vx2*/, real & /*vx3*/);
     CalcMacrosFct calcMacros;
 };
-#endif // InSituCatalystCoProcessor_h__
+#endif // InSituCatalystSimulationObserver_h__
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
index bf68f9d85..663bbc940 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
@@ -1,6 +1,6 @@
 #ifdef VF_VTK
 
-#include "InSituVTKCoProcessor.h"
+#include "InSituVTKSimulationObserver.h"
 #include <BCArray3D.h>
 #include <BCSet.h>
 #include <Block3D.h>
@@ -24,11 +24,11 @@
 
 using namespace std;
 
-InSituVTKCoProcessor::InSituVTKCoProcessor() {}
+InSituVTKSimulationObserver::InSituVTKSimulationObserver() {}
 //////////////////////////////////////////////////////////////////////////
-InSituVTKCoProcessor::InSituVTKCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
+InSituVTKSimulationObserver::InSituVTKSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
                                            SPtr<LBMUnitConverter> conv)
-    : CoProcessor(grid, s), conv(conv)
+    : SimulationObserver(grid, s), conv(conv)
 {
     gridRank     = vf::mpi::Communicator::getInstance()->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -55,17 +55,17 @@ InSituVTKCoProcessor::InSituVTKCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler>
     }
 }
 //////////////////////////////////////////////////////////////////////////
-InSituVTKCoProcessor::~InSituVTKCoProcessor() { comm->CloseConnection(); }
+InSituVTKSimulationObserver::~InSituVTKSimulationObserver() { comm->CloseConnection(); }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::process(real step)
+void InSituVTKSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "InSituVTKCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "InSituVTKSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::collectData(real step)
+void InSituVTKSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -119,10 +119,10 @@ void InSituVTKCoProcessor::collectData(real step)
     // writer->SetDataModeToAscii();
     // writer->Update();
 
-    UBLOG(logINFO, "InSituVTKCoProcessor step: " << istep);
+    UBLOG(logINFO, "InSituVTKSimulationObserver step: " << istep);
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::addData(SPtr<Block3D> block)
+void InSituVTKSimulationObserver::addData(SPtr<Block3D> block)
 {
     UbTupleDouble3 org          = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -259,7 +259,7 @@ void InSituVTKCoProcessor::addData(SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void InSituVTKCoProcessor::readConfigFile(const std::string &configFile)
+void InSituVTKSimulationObserver::readConfigFile(const std::string &configFile)
 {
     ifstream ifs;
     ifs.open(configFile, ifstream::in);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.h
index 9456bf298..d42993002 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.h
@@ -1,9 +1,9 @@
 #ifdef VF_VTK
 
-#ifndef InSituVTKCoProcessor_h__
-#define InSituVTKCoProcessor_h__
+#ifndef InSituVTKSimulationObserver_h__
+#define InSituVTKSimulationObserver_h__
 
-#include <CoProcessor.h>
+#include <SimulationObserver.h>
 #include <Grid3D.h>
 #include <LBMUnitConverter.h>
 
@@ -16,13 +16,13 @@
 #include <vtkSocketController.h>
 #include <vtkUnstructuredGrid.h>
 
-class InSituVTKCoProcessor : public CoProcessor
+class InSituVTKSimulationObserver : public SimulationObserver
 {
 public:
-    InSituVTKCoProcessor();
-    InSituVTKCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
+    InSituVTKSimulationObserver();
+    InSituVTKSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &configFile,
                          SPtr<LBMUnitConverter> conv);
-    virtual ~InSituVTKCoProcessor();
+    virtual ~InSituVTKSimulationObserver();
     void process(real step);
 
 protected:
@@ -48,6 +48,6 @@ private:
     std::string wIP;
 };
 
-#endif // InSituVTKCoProcessor_h__
+#endif // InSituVTKSimulationObserver_h__
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
similarity index 100%
rename from src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.h b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
similarity index 100%
rename from src/cpu/VirtualFluidsCore/CoProcessors/IntegrateValuesHelper.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
index 4d7b5e837..5000d9b03 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "LineTimeSeriesCoProcessor.h"
+#include "LineTimeSeriesSimulationObserver.h"
 #include "BCSet.h"
 #include "WbWriterVtkXmlASCII.h"
 
@@ -12,9 +12,9 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-LineTimeSeriesCoProcessor::LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+LineTimeSeriesSimulationObserver::LineTimeSeriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                      SPtr<GbLine3D> line, int level, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), length(0), ix1(0), ix2(0), ix3(0), level(level), line(line)
+    : SimulationObserver(grid, s), path(path), length(0), ix1(0), ix2(0), ix3(0), level(level), line(line)
 {
     root  = comm->isRoot();
     fname = path;
@@ -23,7 +23,7 @@ LineTimeSeriesCoProcessor::LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     numOfProc = comm->getNumberOfProcesses();
     gridRank  = comm->getProcessID();
 
-    real dx = CoProcessor::grid->getDeltaX(level);
+    real dx = SimulationObserver::grid->getDeltaX(level);
 
     SPtr<CoordinateTransformation3D> trafo = grid->getCoordinateTransformator();
     real orgX1                           = trafo->getX1CoordinateOffset();
@@ -61,16 +61,16 @@ LineTimeSeriesCoProcessor::LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     ix3 = x3min % val<3>(blockNx) + 1;
 }
 //////////////////////////////////////////////////////////////////////////
-void LineTimeSeriesCoProcessor::process(real step)
+void LineTimeSeriesSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step)) {
         collectData();
     }
 
-    UBLOG(logDEBUG3, "MacroscopicQuantitiesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "MacroscopicQuantitiesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void LineTimeSeriesCoProcessor::writeLine(const std::string &path)
+void LineTimeSeriesSimulationObserver::writeLine(const std::string &path)
 {
     std::vector<UbTupleFloat3> nodes(2);
     std::vector<UbTupleInt2> lines(1);
@@ -86,7 +86,7 @@ void LineTimeSeriesCoProcessor::writeLine(const std::string &path)
     writer->writeLines(path, nodes, lines);
 }
 //////////////////////////////////////////////////////////////////////////
-void LineTimeSeriesCoProcessor::collectData()
+void LineTimeSeriesSimulationObserver::collectData()
 {
     real f[27];
     real vx1, vx2, vx3, rho;
@@ -104,7 +104,7 @@ void LineTimeSeriesCoProcessor::collectData()
             blockix3 = x / blocknx;
         }
 
-        SPtr<Block3D> block = CoProcessor::grid->getBlock(blockix1, blockix2, blockix3, level);
+        SPtr<Block3D> block = SimulationObserver::grid->getBlock(blockix1, blockix2, blockix3, level);
         if (block) {
             if (block->getRank() == gridRank) {
                 SPtr<ILBMKernel> kernel = block->getKernel();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
similarity index 74%
rename from src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
index c510a9b46..d534ef7fe 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/LineTimeSeriesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
@@ -1,12 +1,12 @@
-#ifndef LineTimeSeriesCoProcessor_h__
-#define LineTimeSeriesCoProcessor_h__
+#ifndef LineTimeSeriesSimulationObserver_h__
+#define LineTimeSeriesSimulationObserver_h__
 
 #include <PointerDefinitions.h>
 #include <string>
 
 #include <mpi.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 
 namespace vf::mpi {class Communicator;}
@@ -20,15 +20,15 @@ class GbLine3D;
 //
 //! \author  Konstantin Kutscher
 
-class LineTimeSeriesCoProcessor : public CoProcessor
+class LineTimeSeriesSimulationObserver : public SimulationObserver
 {
 public:
     enum Direction { X1, X2, X3 };
 
 public:
-    LineTimeSeriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<GbLine3D> line,
+    LineTimeSeriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<GbLine3D> line,
                               int level, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~LineTimeSeriesCoProcessor() override = default;
+    ~LineTimeSeriesSimulationObserver() override = default;
 
     void process(real step) override;
     void writeLine(const std::string &path);
@@ -58,4 +58,4 @@ private:
     int gridRank;
     Direction dir;
 };
-#endif // LineTimeSeriesCoProcessor_h__
+#endif // LineTimeSeriesSimulationObserver_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
index 8213edcf3..4d2a44541 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "MPIIOMigrationBECoProcessor.h"
+#include "MPIIOMigrationBESimulationObserver.h"
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
@@ -25,8 +25,8 @@ using namespace MPIIODataStructures;
 #define MESSAGE_TAG 80
 #define SEND_BLOCK_SIZE 100000
 
-MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : MPIIOCoProcessor(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999)
+MPIIOMigrationBESimulationObserver::MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+    : MPIIOSimulationObserver(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
     metisVisitor = mV;
@@ -38,13 +38,13 @@ MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr
 }
 
 //////////////////////////////////////////////////////////////////////////
-MPIIOMigrationBECoProcessor::~MPIIOMigrationBECoProcessor() { MPI_Type_free(&sendBlockIntType); }
+MPIIOMigrationBESimulationObserver::~MPIIOMigrationBESimulationObserver() { MPI_Type_free(&sendBlockIntType); }
 
-void MPIIOMigrationBECoProcessor::process(real step)
+void MPIIOMigrationBESimulationObserver::process(real step)
 {
     if (scheduler->isDue(step)) {
         if (comm->isRoot())
-            UBLOG(logINFO, "MPIIOMigrationBECoProcessor save step: " << step);
+            UBLOG(logINFO, "MPIIOMigrationBESimulationObserver save step: " << step);
         if (comm->isRoot())
             UBLOG(logINFO, "Save check point - start");
         clearAllFiles((int)step);
@@ -60,13 +60,13 @@ void MPIIOMigrationBECoProcessor::process(real step)
     }
 }
 
-void MPIIOMigrationBECoProcessor::clearAllFiles(int step)
+void MPIIOMigrationBESimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
     MPI_Offset new_size = 0;
 
-    MPIIOCoProcessor::clearAllFiles(step);
+    MPIIOSimulationObserver::clearAllFiles(step);
 
     UbSystem::makeDirectory(path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step));
 
@@ -87,16 +87,16 @@ void MPIIOMigrationBECoProcessor::clearAllFiles(int step)
     MPI_File_close(&file_handler);
 }
 
-void MPIIOMigrationBECoProcessor::writeBlocks(int step)
+void MPIIOMigrationBESimulationObserver::writeBlocks(int step)
 {
     grid->deleteBlockIDs();
     RenumberGridVisitor renumber(comm);
     grid->accept(renumber);
 
-    MPIIOCoProcessor::writeBlocks(step);
+    MPIIOSimulationObserver::writeBlocks(step);
 }
 
-void MPIIOMigrationBECoProcessor::writeDataSet(int step)
+void MPIIOMigrationBESimulationObserver::writeDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -121,7 +121,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeDataSet start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeDataSet start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -290,7 +290,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -362,7 +362,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeDataSet time: " << finish - start << " s");
     }
 
     MPI_File file_handler1;
@@ -409,7 +409,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     }
 
-void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationBESimulationObserver::write4DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -436,7 +436,7 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write4DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write4DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -462,7 +462,7 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
                     ___Array = block->getKernel()->getDataSet()->getShearStressValues();
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::write4DArray : 4D array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBESimulationObserver::write4DArray : 4D array type does not exist!"));
                     break;
             }
 
@@ -489,7 +489,7 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write4DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -524,11 +524,11 @@ void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write4DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write4DArray time: " << finish - start << " s");
     }
 }
 
-void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationBESimulationObserver::write3DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -555,7 +555,7 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write3DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write3DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -579,7 +579,7 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
                     break;
                 default:
                     UB_THROW(UbException(UB_EXARGS,
-                    "MPIIOMigrationBECoProcessor::write3DArray : 3D array type does not exist!"));
+                    "MPIIOMigrationBESimulationObserver::write3DArray : 3D array type does not exist!"));
                     break;
             }
 
@@ -606,7 +606,7 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write3DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -641,11 +641,11 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::write3DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::write3DArray time: " << finish - start << " s");
     }
 }
 
-void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
+void MPIIOMigrationBESimulationObserver::writeBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -653,7 +653,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeBoundaryConds start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeBoundaryConds start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -752,7 +752,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -835,7 +835,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::writeBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::writeBoundaryConds time: " << finish - start << " s");
     }
 
     delete[] bcAddArray;
@@ -845,10 +845,10 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
 }
 
 //------------------------------------------- READ -----------------------------------------------
-void MPIIOMigrationBECoProcessor::restart(int step)
+void MPIIOMigrationBESimulationObserver::restart(int step)
 {
     if (comm->isRoot())
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor restart step: " << step);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver restart step: " << step);
     if (comm->isRoot())
         UBLOG(logINFO, "Load check point - start");
 
@@ -863,9 +863,9 @@ void MPIIOMigrationBECoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - end");
 }
 
-void MPIIOMigrationBECoProcessor::readBlocks(int step) { MPIIOCoProcessor::readBlocks(step); }
+void MPIIOMigrationBESimulationObserver::readBlocks(int step) { MPIIOSimulationObserver::readBlocks(step); }
 
-void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, int doubleCountInBlock, std::vector<real> &pV, std::vector<real> *rawDataReceive)
+void MPIIOMigrationBESimulationObserver::blocksExchange(int tagN, int ind1, int ind2, int doubleCountInBlock, std::vector<real> &pV, std::vector<real> *rawDataReceive)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -893,7 +893,7 @@ void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, i
     {
         tempBlock = grid->getBlock(indexB + int(ind));
         if (!tempBlock)
-            throw UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::blocksExchange -- null block pointer!!!");
+            throw UbException(UB_EXARGS, "MPIIOMigrationBESimulationObserver::blocksExchange -- null block pointer!!!");
 
         tempRank = tempBlock->getRank();
 
@@ -998,7 +998,7 @@ void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, i
     delete[] requests;
 }
 
-void MPIIOMigrationBECoProcessor::readDataSet(int step)
+void MPIIOMigrationBESimulationObserver::readDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1019,7 +1019,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1109,8 +1109,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet start of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet start of exchange of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1139,8 +1139,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1252,7 +1252,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1306,7 +1306,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     delete[] rawDataReceiveH2;
 }
 
-void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::string fname)
+void MPIIOMigrationBESimulationObserver::readArray(int step, Arrays arrType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1314,7 +1314,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1362,8 +1362,8 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray start of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray start of exchange of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1376,9 +1376,9 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray end of exchange of data, rank = " << rank);
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray end of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1452,7 +1452,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
                     block->getKernel()->getDataSet()->setPressureField(___3DArray);
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::readArray : array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBESimulationObserver::readArray : array type does not exist!"));
                     break;
             } 
         }
@@ -1462,12 +1462,12 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readArray end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
-void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
+void MPIIOMigrationBESimulationObserver::readBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1475,7 +1475,7 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1521,8 +1521,8 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds start of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds start of exchange of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1601,9 +1601,9 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds end of exchange of data, rank = " << rank);
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds end of exchange of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1714,20 +1714,20 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds end of restore of data, rank = " << rank);
-        UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationBESimulationObserver::readBoundaryConds time: " << finish - start << " s");
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationBECoProcessor::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
+void MPIIOMigrationBESimulationObserver::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationBECoProcessor::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
+void MPIIOMigrationBESimulationObserver::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationBECoProcessor::setNu(real nu) { this->nue = nu; }
+void MPIIOMigrationBESimulationObserver::setNu(real nu) { this->nue = nu; }
 
-void MPIIOMigrationBECoProcessor::setNuLG(real cfL, real cfG) { this->nuL = cfL;  this->nuG = cfG; }
+void MPIIOMigrationBESimulationObserver::setNuLG(real cfL, real cfG) { this->nuL = cfL;  this->nuG = cfG; }
 
-void MPIIOMigrationBECoProcessor::setDensityRatio(real dr) { this->densityRatio = dr; }
+void MPIIOMigrationBESimulationObserver::setDensityRatio(real dr) { this->densityRatio = dr; }
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
similarity index 88%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
index 016c32845..31c4de3d0 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef _MPIIOMigrationBECoProcessor_H_
-#define _MPIIOMigrationBECoProcessor_H_
+#ifndef _MPIIOMigrationBESimulationObserver_H_
+#define _MPIIOMigrationBESimulationObserver_H_
 
 #include <mpi.h>
 #include <string>
 #include <vector>
 
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "MPIIODataStructures.h"
 
 class Grid3D;
@@ -15,9 +15,9 @@ class BCSet;
 class LBMKernel;
 class Grid3DVisitor;
 
-//! \class MPIWriteBlocksBECoProcessor
+//! \class MPIWriteBlocksBESimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIOMigrationBECoProcessor : public MPIIOCoProcessor
+class MPIIOMigrationBESimulationObserver : public MPIIOSimulationObserver
 {
     enum Arrays {
         AverageDensity      = 1,
@@ -32,9 +32,9 @@ class MPIIOMigrationBECoProcessor : public MPIIOCoProcessor
     };
 
 public:
-    MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path,
+    MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path,
                                 std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIOMigrationBECoProcessor() override;
+    ~MPIIOMigrationBESimulationObserver() override;
     //! Each timestep writes the grid into the files
     void process(real step) override;
     //! Reads the grid from the files before grid reconstruction
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
index bf1d89a78..0cd149101 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "MPIIOMigrationCoProcessor.h"
+#include "MPIIOMigrationSimulationObserver.h"
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
@@ -22,8 +22,8 @@
 
 using namespace MPIIODataStructures;
 
-MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : MPIIOCoProcessor(grid, s, path, comm)
+MPIIOMigrationSimulationObserver::MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+    : MPIIOSimulationObserver(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
     metisVisitor = mV;
@@ -60,7 +60,7 @@ MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbS
     MPI_Type_commit(&boundCondTypeAdd);
 }
 //////////////////////////////////////////////////////////////////////////
-MPIIOMigrationCoProcessor::~MPIIOMigrationCoProcessor()
+MPIIOMigrationSimulationObserver::~MPIIOMigrationSimulationObserver()
 {
     MPI_Type_free(&dataSetType);
     MPI_Type_free(&dataSetSmallType);
@@ -69,12 +69,12 @@ MPIIOMigrationCoProcessor::~MPIIOMigrationCoProcessor()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationCoProcessor::process(real step)
+void MPIIOMigrationSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step)) 
     {
         if (comm->isRoot())
-            UBLOG(logINFO, "MPIIOMigrationCoProcessor save step: " << step);
+            UBLOG(logINFO, "MPIIOMigrationSimulationObserver save step: " << step);
         if (comm->isRoot())
             UBLOG(logINFO, "Save check point - start");
         /*if (comm->isRoot())*/ clearAllFiles((int)step);
@@ -90,13 +90,13 @@ void MPIIOMigrationCoProcessor::process(real step)
     }
 }
 
-void MPIIOMigrationCoProcessor::clearAllFiles(int step)
+void MPIIOMigrationSimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
     MPI_Offset new_size = 0;
 
-    MPIIOCoProcessor::clearAllFiles(step);
+    MPIIOSimulationObserver::clearAllFiles(step);
 
     UbSystem::makeDirectory(path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step));
 
@@ -108,13 +108,13 @@ void MPIIOMigrationCoProcessor::clearAllFiles(int step)
     MPI_File_close(&file_handler);
 }
 
-void MPIIOMigrationCoProcessor::writeBlocks(int step)
+void MPIIOMigrationSimulationObserver::writeBlocks(int step)
 {
     grid->renumberBlockIDs();
-    MPIIOCoProcessor::writeBlocks(step);
+    MPIIOSimulationObserver::writeBlocks(step);
 }
 
-void MPIIOMigrationCoProcessor::writeDataSet(int step)
+void MPIIOMigrationSimulationObserver::writeDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -139,7 +139,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeDataSet start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeDataSet start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -324,7 +324,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -410,7 +410,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeDataSet time: " << finish - start << " s");
     }
 
     delete[] dataSetArray;
@@ -453,7 +453,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
 }
 
-void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationSimulationObserver::write4DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -476,7 +476,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write4DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -509,7 +509,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
                     ___Array = block->getKernel()->getDataSet()->getShearStressValues();
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::write4DArray : 4D array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationSimulationObserver::write4DArray : 4D array type does not exist!"));
                     break;
             }
 
@@ -538,7 +538,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write4DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -577,13 +577,13 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write4DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+void MPIIOMigrationSimulationObserver::write3DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -606,7 +606,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start collect data to file = " << fname);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write3DArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -636,7 +636,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
                     ___Array = block->getKernel()->getDataSet()->getPressureField();
                     break;
                 default:
-                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::write3DArray : 3D array type does not exist!"));
+                    UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationSimulationObserver::write3DArray : 3D array type does not exist!"));
                     break;
             }
 
@@ -665,7 +665,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write3DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -710,13 +710,13 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::write3DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
+void MPIIOMigrationSimulationObserver::writeBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -724,7 +724,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeBoundaryConds start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeBoundaryConds start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -824,7 +824,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "<< Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -897,7 +897,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::writeBoundaryConds time: " << finish - start << " s");
     }
 
     delete[] bcAddArray;
@@ -908,10 +908,10 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 }
 
 //------------------------------------------- READ -----------------------------------------------
-void MPIIOMigrationCoProcessor::restart(int step)
+void MPIIOMigrationSimulationObserver::restart(int step)
 {
     if (comm->isRoot())
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor restart step: " << step);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver restart step: " << step);
     if (comm->isRoot())
         UBLOG(logINFO, "Load check point - start");
 
@@ -928,9 +928,9 @@ void MPIIOMigrationCoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - end");
 }
 
-void MPIIOMigrationCoProcessor::readBlocks(int step) { MPIIOCoProcessor::readBlocks(step); }
+void MPIIOMigrationSimulationObserver::readBlocks(int step) { MPIIOSimulationObserver::readBlocks(step); }
 
-void MPIIOMigrationCoProcessor::readDataSet(int step)
+void MPIIOMigrationSimulationObserver::readDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -938,7 +938,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1063,8 +1063,8 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1170,7 +1170,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readDataSet end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1216,7 +1216,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
 }
 
-void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string fname)
+void MPIIOMigrationSimulationObserver::readArray(int step, Arrays arrType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1224,7 +1224,7 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start fname = " << fname);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray start fname = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1285,8 +1285,8 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray readArray: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray readArray: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1353,21 +1353,21 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
                 block->getKernel()->getDataSet()->setPressureField(___3DArray);
                 break;
             default:
-                UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::readArray : array type does not exist!"));
+                UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationSimulationObserver::readArray : array type does not exist!"));
                 break;
         }
     }
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readArray end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
+void MPIIOMigrationSimulationObserver::readBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1375,7 +1375,7 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1416,8 +1416,8 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1519,12 +1519,12 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readBoundaryConds end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationSimulationObserver::readBoundaryConds end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationCoProcessor::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
+void MPIIOMigrationSimulationObserver::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIOMigrationCoProcessor::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
+void MPIIOMigrationSimulationObserver::setBCSet(SPtr<BCSet> bcSet) { this->bcSet = bcSet; }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
index cfb5a204c..c9d2ac3a3 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
@@ -1,10 +1,10 @@
-#ifndef _MPIIOMigrationCoProcessor_H_
-#define _MPIIOMigrationCoProcessor_H_
+#ifndef _MPIIOMigrationSimulationObserver_H_
+#define _MPIIOMigrationSimulationObserver_H_
 
 #include <mpi.h>
 #include <string>
 
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "MPIIODataStructures.h"
 
 class Grid3D;
@@ -14,9 +14,9 @@ class BCSet;
 class LBMKernel;
 class Grid3DVisitor;
 
-//! \class MPIWriteBlocksCoProcessor
+//! \class MPIWriteBlocksSimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIOMigrationCoProcessor : public MPIIOCoProcessor
+class MPIIOMigrationSimulationObserver : public MPIIOSimulationObserver
 {
 public:
     enum Arrays {
@@ -31,8 +31,8 @@ public:
         PressureField = 9
     };
 
-    MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIOMigrationCoProcessor() override;
+    MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~MPIIOMigrationSimulationObserver() override;
     //! Each timestep writes the grid into the files
     void process(real step) override;
     //! Reads the grid from the files before grid reconstruction
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
similarity index 94%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
index 296e2c601..dd987625e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "MPIIORestartCoProcessor.h"
+#include "MPIIORestartSimulationObserver.h"
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
@@ -25,8 +25,8 @@
 
 using namespace MPIIODataStructures;
 
-MPIIORestartCoProcessor::MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : MPIIOCoProcessor(grid, s, path, comm)
+MPIIORestartSimulationObserver::MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+    : MPIIOSimulationObserver(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
 
@@ -67,7 +67,7 @@ MPIIORestartCoProcessor::MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbSched
     MPI_Type_commit(&boundCondTypeAdd);
 }
 //////////////////////////////////////////////////////////////////////////
-MPIIORestartCoProcessor::~MPIIORestartCoProcessor()
+MPIIORestartSimulationObserver::~MPIIORestartSimulationObserver()
 {
     MPI_Type_free(&dataSetType);
     MPI_Type_free(&dataSetSmallType);
@@ -77,12 +77,12 @@ MPIIORestartCoProcessor::~MPIIORestartCoProcessor()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::process(real step)
+void MPIIORestartSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step)) 
     {
         if (comm->isRoot())
-            UBLOG(logINFO, "MPIIORestartCoProcessor save step: " << step);
+            UBLOG(logINFO, "MPIIORestartSimulationObserver save step: " << step);
         if (comm->isRoot())
             UBLOG(logINFO, "Save check point - start");
         /*if (comm->isRoot())*/ clearAllFiles((int)step);
@@ -98,7 +98,7 @@ void MPIIORestartCoProcessor::process(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::clearAllFiles(int step)
+void MPIIORestartSimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
@@ -106,7 +106,7 @@ void MPIIORestartCoProcessor::clearAllFiles(int step)
 
     UbSystem::makeDirectory(path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step));
 
-    MPIIOCoProcessor::clearAllFiles(step);
+    MPIIOSimulationObserver::clearAllFiles(step);
 
     std::string filename10 = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpBC.bin";
     int rc10 =
@@ -117,9 +117,9 @@ void MPIIORestartCoProcessor::clearAllFiles(int step)
     MPI_File_close(&file_handler);
 }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::writeBlocks(int step) { MPIIOCoProcessor::writeBlocks(step); }
+void MPIIORestartSimulationObserver::writeBlocks(int step) { MPIIOSimulationObserver::writeBlocks(step); }
 
-void MPIIORestartCoProcessor::writeDataSet(int step)
+void MPIIORestartSimulationObserver::writeDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -144,7 +144,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeDataSet start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeDataSet start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -331,7 +331,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -433,7 +433,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeDataSet time: " << finish - start << " s");
     }
 
     MPI_File file_handler1;
@@ -474,7 +474,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
 }
 
-void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+void MPIIORestartSimulationObserver::write4DArray(int step, Arrays arrayType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -497,7 +497,7 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeAverageDensityArray start collect data to file = " << fname);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeAverageDensityArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -533,7 +533,7 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
                 ___Array = block->getKernel()->getDataSet()->getShearStressValues();
                 break;
             default:
-                UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write4DArray : 4D array type does not exist!"));
+                UB_THROW(UbException(UB_EXARGS, "MPIIORestartSimulationObserver::write4DArray : 4D array type does not exist!"));
                 break;
             }
 
@@ -562,7 +562,7 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write4DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -625,13 +625,13 @@ void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::stri
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write4DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+void MPIIORestartSimulationObserver::write3DArray(int step, Arrays arrayType, std::string fname)
 {
    int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -654,7 +654,7 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start collect data to file = " << fname);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write3DArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -687,7 +687,7 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
                 ___Array = block->getKernel()->getDataSet()->getPressureField();
                 break;
             default:
-                UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write3DArray : 3D array type does not exist!"));
+                UB_THROW(UbException(UB_EXARGS, "MPIIORestartSimulationObserver::write3DArray : 3D array type does not exist!"));
                 break;
             }
 
@@ -716,7 +716,7 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::write3DArray start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -782,13 +782,13 @@ void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::stri
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor ::write3DArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver ::write3DArray time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::writeBoundaryConds(int step)
+void MPIIORestartSimulationObserver::writeBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -796,7 +796,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeBoundaryConds start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeBoundaryConds start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -929,7 +929,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -986,17 +986,17 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writeBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::writeBoundaryConds time: " << finish - start << " s");
     }
 
     delete[] bcAddArray;
 }
 
 //------------------------------------------- READ -----------------------------------------------
-void MPIIORestartCoProcessor::restart(int step)
+void MPIIORestartSimulationObserver::restart(int step)
 {
     if (comm->isRoot())
-        UBLOG(logINFO, "MPIIORestartCoProcessor restart step: " << step);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver restart step: " << step);
     if (comm->isRoot())
         UBLOG(logINFO, "Load check point - start");
 
@@ -1010,9 +1010,9 @@ void MPIIORestartCoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - end");
 }
 
-void MPIIORestartCoProcessor::readBlocks(int step) { MPIIOCoProcessor::readBlocks(step); }
+void MPIIORestartSimulationObserver::readBlocks(int step) { MPIIOSimulationObserver::readBlocks(step); }
 
-void MPIIORestartCoProcessor::readDataSet(int step)
+void MPIIORestartSimulationObserver::readDataSet(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1020,7 +1020,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1120,8 +1120,8 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1224,7 +1224,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readDataSet end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1270,7 +1270,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
 }
 
-void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fname)
+void MPIIORestartSimulationObserver::readArray(int step, Arrays arrType, std::string fname)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1278,7 +1278,7 @@ void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fn
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start fname = " << fname);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray start fname = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1341,8 +1341,8 @@ void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fn
     if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1410,21 +1410,21 @@ void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fn
             block->getKernel()->getDataSet()->setPressureField(___3DArray);
             break;
         default:
-            UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::readArray : array type does not exist!"));
+            UB_THROW(UbException(UB_EXARGS, "MPIIORestartSimulationObserver::readArray : array type does not exist!"));
             break;
         }
     }
 
     if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readArray end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::readBoundaryConds(int step)
+void MPIIORestartSimulationObserver::readBoundaryConds(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1432,7 +1432,7 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1506,8 +1506,8 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
     if (comm->isRoot()) 
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -1579,11 +1579,11 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
     delete[] intArray2;
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::readBoundaryConds end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartSimulationObserver::readBoundaryConds end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
+void MPIIORestartSimulationObserver::setLBMKernel(SPtr<LBMKernel> kernel) { this->lbmKernel = kernel; }
 //////////////////////////////////////////////////////////////////////////
-void MPIIORestartCoProcessor::setBCSet(SPtr<BCSet> BCSet) { this->bcSet = BCSet; }
+void MPIIORestartSimulationObserver::setBCSet(SPtr<BCSet> BCSet) { this->bcSet = BCSet; }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
index db98bca4f..a76b69306 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
@@ -1,12 +1,12 @@
-#ifndef _MPIIORestartCoProcessor_H_
-#define _MPIIORestartCoProcessor_H_
+#ifndef _MPIIORestartSimulationObserver_H_
+#define _MPIIORestartSimulationObserver_H_
 
 #include <mpi.h>
 //#include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "MPIIODataStructures.h"
 
 class Grid3D;
@@ -15,9 +15,9 @@ namespace vf::mpi {class Communicator;}
 class BCSet;
 class LBMKernel;
 
-//! \class MPIIORestartCoProcessor
+//! \class MPIIORestartSimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIORestartCoProcessor : public MPIIOCoProcessor
+class MPIIORestartSimulationObserver : public MPIIOSimulationObserver
 {
 public:
     enum Arrays {
@@ -32,8 +32,8 @@ public:
         PressureField = 9
     };
 
-    MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIORestartCoProcessor() override;
+    MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~MPIIORestartSimulationObserver() override;
     //! Each timestep writes the grid into the files
     void process(real step) override;
     //! Reads the grid from the files before grid reconstruction
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
similarity index 95%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
index e238ec8b0..adb47a75a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "MPIIOCoProcessor.h"
+#include "MPIIOSimulationObserver.h"
 #include "Block3D.h"
 #include <mpi/Communicator.h>
 #include "CoordinateTransformation3D.h"
@@ -12,9 +12,9 @@
 
 using namespace MPIIODataStructures;
 
-MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+MPIIOSimulationObserver::MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                    std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm)
+    : SimulationObserver(grid, s), path(path), comm(comm)
 {
     UbSystem::makeDirectory(path + "/mpi_io_cp");
 
@@ -74,7 +74,7 @@ MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const
     MPI_Type_commit(&arrayPresenceType);
 }
 
-MPIIOCoProcessor::~MPIIOCoProcessor()
+MPIIOSimulationObserver::~MPIIOSimulationObserver()
 {
     MPI_Type_free(&gridParamType);
     MPI_Type_free(&block3dType);
@@ -83,7 +83,7 @@ MPIIOCoProcessor::~MPIIOCoProcessor()
     MPI_Type_free(&arrayPresenceType);
 }
 
-void MPIIOCoProcessor::writeBlocks(int step)
+void MPIIOSimulationObserver::writeBlocks(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -91,7 +91,7 @@ void MPIIOCoProcessor::writeBlocks(int step)
     size = 1;
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::writeBlocksToFile start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::writeBlocksToFile start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -187,7 +187,7 @@ void MPIIOCoProcessor::writeBlocks(int step)
     }
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::writeBlocksToFile start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::writeBlocksToFile start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -223,21 +223,21 @@ void MPIIOCoProcessor::writeBlocks(int step)
 
     if (comm->isRoot()) {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOCoProcessor::writeBlocksToFile time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOSimulationObserver::writeBlocksToFile time: " << finish - start << " s");
     }
 
     delete[] block3dArray;
     delete gridParameters;
 }
 
-void MPIIOCoProcessor::readBlocks(int step)
+void MPIIOSimulationObserver::readBlocks(int step)
 {
     int rank;
     //   int size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     //   size = 1;
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -276,8 +276,8 @@ void MPIIOCoProcessor::readBlocks(int step)
 
     if (comm->isRoot()) {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks time: " << finish - start << " s");
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks start of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
@@ -359,13 +359,13 @@ void MPIIOCoProcessor::readBlocks(int step)
     delete[] block3dArray;
 
     if (comm->isRoot()) {
-        UBLOG(logINFO, "MPIIOCoProcessor::readBlocks end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "MPIIOSimulationObserver::readBlocks end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: "
                            << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 }
 
-void MPIIOCoProcessor::clearAllFiles(int step)
+void MPIIOSimulationObserver::clearAllFiles(int step)
 {
     MPI_File file_handler;
     MPI_Info info       = MPI_INFO_NULL;
@@ -480,7 +480,7 @@ void MPIIOCoProcessor::clearAllFiles(int step)
 
 }
 
-void MPIIOCoProcessor::writeCpTimeStep(int step)
+void MPIIOSimulationObserver::writeCpTimeStep(int step)
 {
     if (comm->isRoot()) {
         UbFileOutputASCII f(path + "/mpi_io_cp/cp.txt");
@@ -488,7 +488,7 @@ void MPIIOCoProcessor::writeCpTimeStep(int step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-int MPIIOCoProcessor::readCpTimeStep()
+int MPIIOSimulationObserver::readCpTimeStep()
 {
     UbFileInputASCII f(path + "/mpi_io_cp/cp.txt");
     int step = f.readInteger();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
similarity index 68%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
index 68759639d..e42b7117e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
@@ -1,7 +1,7 @@
-#ifndef _MPIIOCoProcessor_H_
-#define _MPIIOCoProcessor_H_
+#ifndef _MPIIOSimulationObserver_H_
+#define _MPIIOSimulationObserver_H_
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include <PointerDefinitions.h>
 #include <mpi.h>
 #include <string>
@@ -10,13 +10,13 @@ class Grid3D;
 class UbScheduler;
 namespace vf::mpi {class Communicator;}
 
-//! \class MPIWriteBlocksBECoProcessor
+//! \class MPIWriteBlocksBESimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
-class MPIIOCoProcessor : public CoProcessor
+class MPIIOSimulationObserver : public SimulationObserver
 {
 public:
-    MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MPIIOCoProcessor() override;
+    MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~MPIIOSimulationObserver() override;
 
     //! Each timestep writes the grid into the files
     void process(real step) override = 0;
@@ -40,5 +40,5 @@ protected:
     std::shared_ptr<vf::mpi::Communicator> comm;
     MPI_Datatype gridParamType, block3dType, dataSetParamType, boundCondType, arrayPresenceType;
 };
-#endif // ! _MPIIOCoProcessor_H_
-#define _MPIIOCoProcessor_H_
+#endif // ! _MPIIOSimulationObserver_H_
+#define _MPIIOSimulationObserver_H_
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
index 45e9643fc..a456fe6f8 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "MicrophoneArrayCoProcessor.h"
+#include "MicrophoneArraySimulationObserver.h"
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
@@ -12,17 +12,17 @@
 #include "Vector3D.h"
 #include <sstream>
 
-MicrophoneArrayCoProcessor::MicrophoneArrayCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+MicrophoneArraySimulationObserver::MicrophoneArraySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                        std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm)
+    : SimulationObserver(grid, s), path(path), comm(comm)
 {
     count = 0;
     micID = 0;
 }
 
-MicrophoneArrayCoProcessor::~MicrophoneArrayCoProcessor() = default;
+MicrophoneArraySimulationObserver::~MicrophoneArraySimulationObserver() = default;
 
-void MicrophoneArrayCoProcessor::process(real step)
+void MicrophoneArraySimulationObserver::process(real step)
 {
     if (microphones.size() > 0) {
         collectData(step);
@@ -31,10 +31,10 @@ void MicrophoneArrayCoProcessor::process(real step)
             writeFile(step);
     }
 
-    UBLOG(logDEBUG3, "MicrophoneArrayCoProcessor::process:" << step);
+    UBLOG(logDEBUG3, "MicrophoneArraySimulationObserver::process:" << step);
 }
 
-bool MicrophoneArrayCoProcessor::addMicrophone(Vector3D coords)
+bool MicrophoneArraySimulationObserver::addMicrophone(Vector3D coords)
 {
     micID++;
     //   UbTupleInt3 blockIndexes = grid->getBlockIndexes(coords[0], coords[1], coords[2]);
@@ -89,7 +89,7 @@ bool MicrophoneArrayCoProcessor::addMicrophone(Vector3D coords)
     return false;
 }
 
-void MicrophoneArrayCoProcessor::collectData(real step)
+void MicrophoneArraySimulationObserver::collectData(real step)
 {
     for (std::size_t i = 0; i < microphones.size(); i++) {
         real f[D3Q27System::ENDF + 1];
@@ -102,7 +102,7 @@ void MicrophoneArrayCoProcessor::collectData(real step)
     }
 }
 
-void MicrophoneArrayCoProcessor::writeFile(real /*step*/)
+void MicrophoneArraySimulationObserver::writeFile(real /*step*/)
 {
     for (std::size_t i = 0; i < microphones.size(); i++) {
         std::string fname = path + "/mic/mic_" + UbSystem::toString(microphones[i]->id) + ".csv";
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
similarity index 74%
rename from src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
index 140ac5a48..fc773771b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MicrophoneArrayCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
@@ -1,7 +1,7 @@
-#ifndef MicrophoneArrayCoProcessor_h__
-#define MicrophoneArrayCoProcessor_h__
+#ifndef MicrophoneArraySimulationObserver_h__
+#define MicrophoneArraySimulationObserver_h__
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 #include <array>
@@ -19,12 +19,12 @@ class DistributionArray3D;
 //! \author    Konstantin Kutscher
 //! \date      February 2019
 
-class MicrophoneArrayCoProcessor : public CoProcessor
+class MicrophoneArraySimulationObserver : public SimulationObserver
 {
 public:
-    MicrophoneArrayCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    MicrophoneArraySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                std::shared_ptr<vf::mpi::Communicator> comm);
-    ~MicrophoneArrayCoProcessor() override;
+    ~MicrophoneArraySimulationObserver() override;
 
     //! calls collectData.
     void process(real step) override;
@@ -56,4 +56,4 @@ private:
     CalcMacrosFct calcMacros;
 };
 
-#endif // MicrophoneArrayCoProcessor_h__
+#endif // MicrophoneArraySimulationObserver_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
index af8cf4083..b3a8b3d67 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
@@ -26,20 +26,20 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NUPSCounterCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file NUPSCounterSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "NUPSCounterCoProcessor.h"
+#include "NUPSCounterSimulationObserver.h"
 
 #include <mpi/Communicator.h>
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
-NUPSCounterCoProcessor::NUPSCounterCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads,
+NUPSCounterSimulationObserver::NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads,
                                                std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), numOfThreads(numOfThreads), nup(0), nup_t(0), nupsStep(0.0), comm(comm)
+    : SimulationObserver(grid, s), numOfThreads(numOfThreads), nup(0), nup_t(0), nupsStep(0.0), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         timer.resetAndStart();
@@ -59,15 +59,15 @@ NUPSCounterCoProcessor::NUPSCounterCoProcessor(SPtr<Grid3D> grid, SPtr<UbSchedul
     }
 }
 //////////////////////////////////////////////////////////////////////////
-NUPSCounterCoProcessor::~NUPSCounterCoProcessor() = default;
+NUPSCounterSimulationObserver::~NUPSCounterSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void NUPSCounterCoProcessor::process(real step)
+void NUPSCounterSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void NUPSCounterCoProcessor::collectData(real step)
+void NUPSCounterSimulationObserver::collectData(real step)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         real time   = timer.stop();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
index b178c97fe..37e41d11a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/NUPSCounterCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
@@ -26,36 +26,36 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file NUPSCounterCoProcessor.h
-//! \ingroup CoProcessors
+//! \file NUPSCounterSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef NUPSCOUNTERCoProcessor_H_
-#define NUPSCOUNTERCoProcessor_H_
+#ifndef NUPSCOUNTERSimulationObserver_H_
+#define NUPSCOUNTERSimulationObserver_H_
 
 #include <PointerDefinitions.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "basics/utilities/UbTiming.h"
 
 namespace vf::mpi {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
-//! \class NUPSCounterCoProcessor
+//! \class NUPSCounterSimulationObserver
 //! \brief A class calculates Nodal Updates Per Second (NUPS)
-class NUPSCounterCoProcessor : public CoProcessor
+class NUPSCounterSimulationObserver : public SimulationObserver
 {
 public:
-    //! \brief Construct NUPSCounterCoProcessor object for grid object and scheduler object.
+    //! \brief Construct NUPSCounterSimulationObserver object for grid object and scheduler object.
     //! \pre The Grid3D and UbScheduler objects must exist.
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \param numOfThreads is number of threads
     //! \param comm is Communicator object
-    NUPSCounterCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~NUPSCounterCoProcessor() override;
+    NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~NUPSCounterSimulationObserver() override;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
index 2e295e096..8df444b9f 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "PressureCoefficientCoProcessor.h"
+#include "PressureCoefficientSimulationObserver.h"
 #include <WbWriterVtkXmlASCII.h>
 
 #include "BCArray3D.h"
@@ -12,26 +12,26 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-PressureCoefficientCoProcessor::PressureCoefficientCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+PressureCoefficientSimulationObserver::PressureCoefficientSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                GbCuboid3DPtr plane, const std::string &path,
                                                                std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), plane(plane), path(path), comm(comm)
+    : SimulationObserver(grid, s), plane(plane), path(path), comm(comm)
 {
     maxStep       = scheduler->getMaxEnd();
     numberOfSteps = int(maxStep - scheduler->getMinBegin());
 }
 //////////////////////////////////////////////////////////////////////////
-PressureCoefficientCoProcessor::~PressureCoefficientCoProcessor() = default;
+PressureCoefficientSimulationObserver::~PressureCoefficientSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::process(real step)
+void PressureCoefficientSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "D3Q27ForcesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::collectData(real step)
+void PressureCoefficientSimulationObserver::collectData(real step)
 {
     calculateRho();
 
@@ -40,7 +40,7 @@ void PressureCoefficientCoProcessor::collectData(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::calculateRho()
+void PressureCoefficientSimulationObserver::calculateRho()
 {
     real f[D3Q27System::ENDF + 1];
     real vx1, vx2, vx3, rho;
@@ -120,7 +120,7 @@ void PressureCoefficientCoProcessor::calculateRho()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::writeValues(int step)
+void PressureCoefficientSimulationObserver::writeValues(int step)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         datanames.resize(0);
@@ -176,10 +176,10 @@ void PressureCoefficientCoProcessor::writeValues(int step)
 
         out.close();
 
-        UBLOG(logINFO, "PressureCoefficientCoProcessor::writeValues() step: " << (int)step);
+        UBLOG(logINFO, "PressureCoefficientSimulationObserver::writeValues() step: " << (int)step);
     }
 }
-void PressureCoefficientCoProcessor::readValues(int step)
+void PressureCoefficientSimulationObserver::readValues(int step)
 {
     if (comm->isRoot()) {
         std::string fname = path + UbSystem::toString(step) + ".bin";
@@ -199,11 +199,11 @@ void PressureCoefficientCoProcessor::readValues(int step)
 
         in.close();
 
-        UBLOG(logINFO, "PressureCoefficientCoProcessor::readValues() step: " << (int)step);
+        UBLOG(logINFO, "PressureCoefficientSimulationObserver::readValues() step: " << (int)step);
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureCoefficientCoProcessor::addInteractor(SPtr<D3Q27Interactor> interactor)
+void PressureCoefficientSimulationObserver::addInteractor(SPtr<D3Q27Interactor> interactor)
 {
     interactors.push_back(interactor);
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
similarity index 71%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
index 26b8117ae..f8a9520aa 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef PressureCoefficientCoProcessor_h__
-#define PressureCoefficientCoProcessor_h__
+#ifndef PressureCoefficientSimulationObserver_h__
+#define PressureCoefficientSimulationObserver_h__
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -15,12 +15,12 @@ namespace vf::mpi {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
-class PressureCoefficientCoProcessor : public CoProcessor
+class PressureCoefficientSimulationObserver : public SimulationObserver
 {
 public:
-    PressureCoefficientCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbCuboid3D> plane,
+    PressureCoefficientSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbCuboid3D> plane,
                                    const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~PressureCoefficientCoProcessor() override;
+    ~PressureCoefficientSimulationObserver() override;
 
     void process(real step) override;
 
@@ -50,4 +50,4 @@ private:
     CalcMacrosFct calcMacros;
 };
 
-#endif // PressureDistributionCoProcessor_h__
+#endif // PressureDistributionSimulationObserver_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
similarity index 88%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
index a486da249..4234d8907 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
@@ -1,11 +1,11 @@
 /*
- * D3Q27RhoCoProcessor.cpp
+ * D3Q27RhoSimulationObserver.cpp
  *
  *  Created on: 28.12.2010
  *      Author: kucher
  */
 
-#include "PressureDifferenceCoProcessor.h"
+#include "PressureDifferenceSimulationObserver.h"
 
 #include <fstream>
 
@@ -15,12 +15,12 @@
 #include "LBMUnitConverter.h"
 #include "UbScheduler.h"
 
-PressureDifferenceCoProcessor::PressureDifferenceCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+PressureDifferenceSimulationObserver::PressureDifferenceSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                              const std::string &path, SPtr<IntegrateValuesHelper> h1,
                                                              SPtr<IntegrateValuesHelper> h2, real rhoReal,
                                                              real uReal, real uLB, std::shared_ptr<vf::mpi::Communicator> comm)
 
-    : CoProcessor(grid, s), path(path), h1(h1), h2(h2), comm(comm)
+    : SimulationObserver(grid, s), path(path), h1(h1), h2(h2), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         std::ofstream ostr;
@@ -69,15 +69,15 @@ PressureDifferenceCoProcessor::PressureDifferenceCoProcessor(SPtr<Grid3D> grid,
     }
 }
 //////////////////////////////////////////////////////////////////////////
-PressureDifferenceCoProcessor::~PressureDifferenceCoProcessor() = default;
+PressureDifferenceSimulationObserver::~PressureDifferenceSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void PressureDifferenceCoProcessor::process(real step)
+void PressureDifferenceSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void PressureDifferenceCoProcessor::collectData(real step)
+void PressureDifferenceSimulationObserver::collectData(real step)
 {
     h1->calculateMQ();
     h2->calculateMQ();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
similarity index 70%
rename from src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
index 095235522..447fb5374 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureDifferenceCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
@@ -1,17 +1,17 @@
 /*
- *  D3Q27PressureDifferenceCoProcessor.h
+ *  D3Q27PressureDifferenceSimulationObserver.h
  *
  *  Created on: 28.12.2010
  *  Author: kucher
  */
 
-#ifndef D3Q27PRESSUREDIFFERENCECoProcessor_H
-#define D3Q27PRESSUREDIFFERENCECoProcessor_H
+#ifndef D3Q27PRESSUREDIFFERENCESimulationObserver_H
+#define D3Q27PRESSUREDIFFERENCESimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 
 namespace vf::mpi {class Communicator;}
@@ -20,14 +20,14 @@ class UbScheduler;
 class LBMUnitConverter;
 class IntegrateValuesHelper;
 
-class PressureDifferenceCoProcessor : public CoProcessor
+class PressureDifferenceSimulationObserver : public SimulationObserver
 {
 public:
-    PressureDifferenceCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    PressureDifferenceSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                   SPtr<IntegrateValuesHelper> h1, SPtr<IntegrateValuesHelper> h2, real rhoReal,
                                   real uReal, real uLB,
                                   /*const SPtr<LBMUnitConverter> conv,*/ std::shared_ptr<vf::mpi::Communicator> comm);
-    ~PressureDifferenceCoProcessor() override;
+    ~PressureDifferenceSimulationObserver() override;
 
     void process(real step) override;
 
@@ -43,4 +43,4 @@ protected:
                      //uReal in SI
 };
 
-#endif /* D3Q27RHODIFFERENCECoProcessor_H_ */
+#endif /* D3Q27RHODIFFERENCESimulationObserver_H_ */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
index d500f1dc6..3648d9526 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "QCriterionCoProcessor.h"
+#include "QCriterionSimulationObserver.h"
 #include "BCSet.h"
 #include "Block3D.h"
 #include "DataSet3D.h"
@@ -10,14 +10,14 @@
 #include <mpi/Communicator.h>
 #include "UbScheduler.h"
 
-QCriterionCoProcessor::QCriterionCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+QCriterionSimulationObserver::QCriterionSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                              SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm), writer(writer)
+    : SimulationObserver(grid, s), path(path), comm(comm), writer(writer)
 {
     init();
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::init()
+void QCriterionSimulationObserver::init()
 {
     gridRank     = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -28,19 +28,19 @@ void QCriterionCoProcessor::init()
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         grid->getBlocks(
             level, gridRank, true,
-            blockVector[level]); // grid: private variable in CoProcessor. Initialized by filling with blocks
+            blockVector[level]); // grid: private variable in SimulationObserver. Initialized by filling with blocks
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::process(real step)
+void QCriterionSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "QCriterionCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "QCriterionSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::collectData(real step)
+void QCriterionSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -59,7 +59,7 @@ void QCriterionCoProcessor::collectData(real step)
 
     std::vector<std::string> cellDataNames;
 
-    // distributed writing as in MacroscopicValuesCoProcessor.cpp
+    // distributed writing as in MacroscopicValuesSimulationObserver.cpp
     std::vector<std::string> pieces = comm->gather(piece); // comm: MPI-Wrapper
     if (comm->getProcessID() == comm->getRoot()) {
         std::string pname = WbWriterVtkXmlASCII::getInstance()->writeParallelFile(
@@ -67,19 +67,19 @@ void QCriterionCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(pname);
-        if (step == CoProcessor::scheduler->getMinBegin()) // first time in timeseries
+        if (step == SimulationObserver::scheduler->getMinBegin()) // first time in timeseries
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(path + "_collection", filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(path + "_collection", filenames, istep, false);
         }
-        UBLOG(logINFO, "QCriterionCoProcessor step: " << istep);
+        UBLOG(logINFO, "QCriterionSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::clearData()
+void QCriterionSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -87,7 +87,7 @@ void QCriterionCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void QCriterionCoProcessor::addData(const SPtr<Block3D> block)
+void QCriterionSimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //	UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -200,7 +200,7 @@ void QCriterionCoProcessor::addData(const SPtr<Block3D> block)
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz, int ix1, int ix2, int ix3,
+void QCriterionSimulationObserver::getNeighborVelocities(int offx, int offy, int offz, int ix1, int ix2, int ix3,
                                                   const SPtr<Block3D> block, real *vE, real *vW)
 {
     SPtr<ILBMKernel> kernel                 = block->getKernel();
@@ -217,7 +217,7 @@ void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz,
     int maxX2 = (int)(distributions->getNX2());
     int maxX3 = (int)(distributions->getNX3());
     if (maxX1 < 3)
-        throw UbException(UB_EXARGS, "QCriterionCoProcessor: NX1 too small for FD stencils!");
+        throw UbException(UB_EXARGS, "QCriterionSimulationObserver: NX1 too small for FD stencils!");
     maxX1 -= 2;
     maxX2 -= 2;
     maxX3 -= 2;
@@ -343,7 +343,7 @@ void QCriterionCoProcessor::getNeighborVelocities(int offx, int offy, int offz,
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-void QCriterionCoProcessor::computeVelocity(real *f, real *v, bool compressible)
+void QCriterionSimulationObserver::computeVelocity(real *f, real *v, bool compressible)
 {
     //////////////////////////////////////////////////////////////////////////
     // compute x,y,z-velocity components from distribution
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
similarity index 86%
rename from src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
index 38cd47fb8..a624a4606 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/QCriterionCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
@@ -1,15 +1,15 @@
-//! \file QCriterionCoProcessor.h
+//! \file QCriterionSimulationObserver.h
 //!  \brief Created on: 25.08.2013
 //!  \author: Sonja Uphoff
 
-#ifndef QCriterionCoProcessor_H
-#define QCriterionCoProcessor_H
+#ifndef QCriterionSimulationObserver_H
+#define QCriterionSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -25,10 +25,10 @@ class Block3D;
 //!			 Q-Criterion: Visualize Vorteces as regions where Vorticity is larger than strain rate (Hunt, 1988)
 //! \author  Sonja Uphoff
 
-class QCriterionCoProcessor : public CoProcessor
+class QCriterionSimulationObserver : public SimulationObserver
 {
 public:
-    QCriterionCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
+    QCriterionSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
                           std::shared_ptr<vf::mpi::Communicator> comm);
     //! Make update if timestep is write-timestep specified in SPtr<UbScheduler> s
     void process(real step) override;
@@ -50,7 +50,7 @@ private:
     void init();
     std::vector<UbTupleFloat3> nodes;
     std::vector<UbTupleUInt8> cells;
-    std::vector<std::string> datanames; // only one entry for QKrit-CoProcessor: Q
+    std::vector<std::string> datanames; // only one entry for QKrit-SimulationObserver: Q
     std::vector<std::vector<real>> data;
     std::vector<std::vector<SPtr<Block3D>>> blockVector;
     int minInitLevel; // go through all levels for block vector of current process from minInitLevel to maxInitLevel
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
similarity index 96%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
index 2d8866494..5bc88dae1 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "ShearStressCoProcessor.h"
+#include "ShearStressSimulationObserver.h"
 #include "BCSet.h"
 #include "WbWriterVtkXmlASCII.h"
 
@@ -12,9 +12,9 @@
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
-ShearStressCoProcessor::ShearStressCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+ShearStressSimulationObserver::ShearStressSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                                SPtr<UbScheduler> s, SPtr<UbScheduler> rs)
-    : CoProcessor(grid, s), Resetscheduler(rs), path(path), writer(writer)
+    : SimulationObserver(grid, s), Resetscheduler(rs), path(path), writer(writer)
 {
     std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
     normals.push_back(0);
@@ -36,9 +36,9 @@ ShearStressCoProcessor::ShearStressCoProcessor(SPtr<Grid3D> grid, const std::str
     }
 }
 //////////////////////////////////////////////////////////////////////////
-ShearStressCoProcessor::~ShearStressCoProcessor() = default;
+ShearStressSimulationObserver::~ShearStressSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::process(real step)
+void ShearStressSimulationObserver::process(real step)
 {
     if (step == 0) {
         initDistance();
@@ -46,10 +46,10 @@ void ShearStressCoProcessor::process(real step)
     calculateShearStress(step);
     if (scheduler->isDue(step))
         collectData(step);
-    UBLOG(logDEBUG3, "D3Q27ShearStressCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "D3Q27ShearStressSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::collectData(real step)
+void ShearStressSimulationObserver::collectData(real step)
 {
     using namespace std;
 
@@ -71,7 +71,7 @@ void ShearStressCoProcessor::collectData(real step)
 
     //   vector<string> filenames;
     //   filenames.push_back(pname);
-    //   if (step == CoProcessor::scheduler->getMinBegin())
+    //   if (step == SimulationObserver::scheduler->getMinBegin())
     //   {
     //      WbWriterVtkXmlASCII::getInstance()->writeCollection(path+"__Shear_collection",filenames,istep,false);
     //   }
@@ -79,7 +79,7 @@ void ShearStressCoProcessor::collectData(real step)
     //   {
     //      WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(path+"__Shear_collection",filenames,istep,false);
     //   }
-    //   UBLOG(logINFO,"D3Q27ShearStressCoProcessor step: " << istep);
+    //   UBLOG(logINFO,"D3Q27ShearStressSimulationObserver step: " << istep);
     //}
 
     string pfilePath, partPath, subfolder, cfilePath;
@@ -104,25 +104,25 @@ void ShearStressCoProcessor::collectData(real step)
 
         vector<string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "D3Q27ShearStressCoProcessor step: " << istep);
+        UBLOG(logINFO, "D3Q27ShearStressSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::clearData()
+void ShearStressSimulationObserver::clearData()
 {
     nodes.clear();
     datanames.clear();
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::calculateShearStress(real timeStep)
+void ShearStressSimulationObserver::calculateShearStress(real timeStep)
 {
     using namespace vf::lbm::dir;
     using namespace D3Q27System;
@@ -231,7 +231,7 @@ void ShearStressCoProcessor::calculateShearStress(real timeStep)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::addData()
+void ShearStressSimulationObserver::addData()
 {
     // Diese Daten werden geschrieben:
     datanames.resize(0);
@@ -345,15 +345,15 @@ void ShearStressCoProcessor::addData()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::reset(real step)
+void ShearStressSimulationObserver::reset(real step)
 {
     if (Resetscheduler->isDue(step))
         resetData(step);
 
-    UBLOG(logDEBUG3, "resetCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "resetSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::resetData(real /*step*/)
+void ShearStressSimulationObserver::resetData(real /*step*/)
 {
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         for (const auto &block : blockVector[level]) {
@@ -403,9 +403,9 @@ void ShearStressCoProcessor::resetData(real /*step*/)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
+void ShearStressSimulationObserver::addInteractor(SPtr<D3Q27Interactor> interactor) { interactors.push_back(interactor); }
 //////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> grid, SPtr<Block3D> block, real &A,
+void ShearStressSimulationObserver::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> grid, SPtr<Block3D> block, real &A,
                                        real &B, real &C, real &D, real &ii)
 {
     using namespace vf::lbm::dir;
@@ -823,7 +823,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////
-bool ShearStressCoProcessor::checkUndefindedNodes(SPtr<BCArray3D> bcArray, int ix1, int ix2, int ix3)
+bool ShearStressSimulationObserver::checkUndefindedNodes(SPtr<BCArray3D> bcArray, int ix1, int ix2, int ix3)
 {
     for (int i = ix1; i <= ix1 + 1; i++) {
         for (int j = ix2; j <= ix2 + 1; j++) {
@@ -836,7 +836,7 @@ bool ShearStressCoProcessor::checkUndefindedNodes(SPtr<BCArray3D> bcArray, int i
     return false;
 }
 //////////////////////////////////////////////////////////////////////////////////////
-void ShearStressCoProcessor::initDistance()
+void ShearStressSimulationObserver::initDistance()
 {
     using namespace vf::lbm::dir;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.h
index 73fd42d64..03ee83d21 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.h
@@ -1,5 +1,5 @@
-#ifndef D3Q27ShearStressCoProcessor_H
-#define D3Q27ShearStressCoProcessor_H
+#ifndef D3Q27ShearStressSimulationObserver_H
+#define D3Q27ShearStressSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
@@ -7,7 +7,7 @@
 
 #include <basics/utilities/UbTuple.h>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 class Block3D;
 class Grid3D;
@@ -21,15 +21,15 @@ class WbWriter;
 //!          Take root to obtain  during post processing (paraview).
 //! \author  K. Kucher, S. Uphoff, M. Geier, E. Goraki Fard
 
-class ShearStressCoProcessor : public CoProcessor
+class ShearStressSimulationObserver : public SimulationObserver
 {
 public:
     //! Default constructor
-    ShearStressCoProcessor() = default;
+    ShearStressSimulationObserver() = default;
     //! Constructor
-    ShearStressCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
+    ShearStressSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
                            SPtr<UbScheduler> rs);
-    ~ShearStressCoProcessor() override;
+    ~ShearStressSimulationObserver() override;
 
     void process(real step) override;
 
@@ -82,4 +82,4 @@ private:
     };
 };
 
-#endif /* D3Q27ShearStressCoProcessor_H */
+#endif /* D3Q27ShearStressSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.cpp
similarity index 87%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.cpp
index 6572ac8b5..cef156e56 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.cpp
@@ -26,18 +26,18 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file CoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file SimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
-CoProcessor::CoProcessor() = default;
+SimulationObserver::SimulationObserver() = default;
 
-CoProcessor::CoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : grid(grid), scheduler(s) {}
+SimulationObserver::SimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : grid(grid), scheduler(s) {}
 
-CoProcessor::~CoProcessor() = default;
+SimulationObserver::~SimulationObserver() = default;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.h
similarity index 83%
rename from src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.h
index 7aae7505b..c80327b68 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/SimulationObserver.h
@@ -26,13 +26,13 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file CoProcessor.h
-//! \ingroup CoProcessors
+//! \file SimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef CoProcessor_H
-#define CoProcessor_H
+#ifndef SimulationObserver_H
+#define SimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include "lbm/constants/D3Q27.h"
@@ -40,23 +40,23 @@
 class Grid3D;
 class UbScheduler;
 
-//! \class CoProcessor
+//! \class SimulationObserver
 //! \brief An abstract class implements observer design pettern
-class CoProcessor
+class SimulationObserver
 {
 public:
     //! Class default constructor
-    CoProcessor();
-    //! \brief Construct CoProcessor object for grid object and scheduler object.
+    SimulationObserver();
+    //! \brief Construct SimulationObserver object for grid object and scheduler object.
     //! \pre The Grid3D and UbScheduler objects must exist.
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \details
-    //! Class CoProcessor implements the observer design pettern. CoProcessor object is observer.  Grid3D object is
+    //! Class SimulationObserver implements the observer design pettern. SimulationObserver object is observer.  Grid3D object is
     //! observable.
-    CoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
+    SimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
     //! Class destructor
-    virtual ~CoProcessor();
+    virtual ~SimulationObserver();
     //! \brief Updates observer
     //! \param step is the actual time step
     virtual void process(real step) = 0;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
similarity index 95%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
index b3e021284..cdfc16ed5 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "TimeAveragedValuesCoProcessor.h"
+#include "TimeAveragedValuesSimulationObserver.h"
 
 #include "BCSet.h"
 #include "LBMKernel.h"
@@ -12,31 +12,31 @@
 
 #include "BCArray3D.h"
 
-TimeAveragedValuesCoProcessor::TimeAveragedValuesCoProcessor() = default;
+TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-TimeAveragedValuesCoProcessor::TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path,
+TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                              WbWriter *const writer, SPtr<UbScheduler> s,
                                                              std::shared_ptr<vf::mpi::Communicator> comm, int options)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm), options(options)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm), options(options)
 {
     init();
     planarAveraging = false;
     timeAveraging   = true;
 }
 //////////////////////////////////////////////////////////////////////////
-TimeAveragedValuesCoProcessor::TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path,
+TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                              WbWriter *const writer, SPtr<UbScheduler> s,
                                                              std::shared_ptr<vf::mpi::Communicator> comm, int options,
                                                              std::vector<int> levels, std::vector<real> &levelCoords,
                                                              std::vector<real> &bounds, bool timeAveraging)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm), options(options), levels(levels),
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm), options(options), levels(levels),
       levelCoords(levelCoords), bounds(bounds), timeAveraging(timeAveraging)
 {
     init();
     planarAveraging = true;
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::init()
+void TimeAveragedValuesSimulationObserver::init()
 {
     root         = comm->isRoot();
     gridRank     = grid->getRank();
@@ -75,7 +75,7 @@ void TimeAveragedValuesCoProcessor::init()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::initData()
+void TimeAveragedValuesSimulationObserver::initData()
 {
     blockVector.clear();
     blockVector.resize(maxInitLevel + 1);
@@ -116,7 +116,7 @@ void TimeAveragedValuesCoProcessor::initData()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::process(real step)
+void TimeAveragedValuesSimulationObserver::process(real step)
 {
     if (step == minStep) {
         initData();
@@ -146,10 +146,10 @@ void TimeAveragedValuesCoProcessor::process(real step)
         }
     }
 
-    UBLOG(logDEBUG3, "AverageValuesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "AverageValuesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::collectData(real step)
+void TimeAveragedValuesSimulationObserver::collectData(real step)
 {
     int istep = int(step);
 
@@ -176,13 +176,13 @@ void TimeAveragedValuesCoProcessor::collectData(real step)
     if (root) {
         std::string pname =
             WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames);
-        UBLOG(logINFO, "TimeAveragedValuesCoProcessor::collectData() step: " << istep);
+        UBLOG(logINFO, "TimeAveragedValuesSimulationObserver::collectData() step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::clearData()
+void TimeAveragedValuesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -190,7 +190,7 @@ void TimeAveragedValuesCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::addData(const SPtr<Block3D> block)
+void TimeAveragedValuesSimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //   UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -352,7 +352,7 @@ void TimeAveragedValuesCoProcessor::addData(const SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::calculateAverageValues(real timeSteps)
+void TimeAveragedValuesSimulationObserver::calculateAverageValues(real timeSteps)
 {
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         int i;
@@ -463,7 +463,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(real timeSteps)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::calculateSubtotal(real step)
+void TimeAveragedValuesSimulationObserver::calculateSubtotal(real step)
 {
     if (scheduler->isDue(step)) {
 
@@ -574,7 +574,7 @@ void TimeAveragedValuesCoProcessor::calculateSubtotal(real step)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::planarAverage(real step)
+void TimeAveragedValuesSimulationObserver::planarAverage(real step)
 {
     std::ofstream ostr;
 
@@ -692,11 +692,11 @@ void TimeAveragedValuesCoProcessor::planarAverage(real step)
 
     if (root) {
         ostr.close();
-        UBLOG(logINFO, "TimeAveragedValuesCoProcessor::planarAverage() step: " << (int)step);
+        UBLOG(logINFO, "TimeAveragedValuesSimulationObserver::planarAverage() step: " << (int)step);
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::reset()
+void TimeAveragedValuesSimulationObserver::reset()
 {
     for (int level = minInitLevel; level <= maxInitLevel; level++) {
         for (SPtr<Block3D> block : blockVector[level]) {
@@ -725,7 +725,7 @@ void TimeAveragedValuesCoProcessor::reset()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::setWithGhostLayer(bool val)
+void TimeAveragedValuesSimulationObserver::setWithGhostLayer(bool val)
 {
     withGhostLayer = val;
 
@@ -736,9 +736,9 @@ void TimeAveragedValuesCoProcessor::setWithGhostLayer(bool val)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-bool TimeAveragedValuesCoProcessor::getWithGhostLayer() { return withGhostLayer; }
+bool TimeAveragedValuesSimulationObserver::getWithGhostLayer() { return withGhostLayer; }
 //////////////////////////////////////////////////////////////////////////
-void TimeAveragedValuesCoProcessor::calculateAverageValuesForPlane(
+void TimeAveragedValuesSimulationObserver::calculateAverageValuesForPlane(
     std::vector<IntegrateValuesHelper::CalcNodes> &cnodes)
 {
     saVx = 0;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
index 72a0f6fe1..26930848e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef TimeAveragedValuesCoProcessor_H
-#define TimeAveragedValuesCoProcessor_H
+#ifndef TimeAveragedValuesSimulationObserver_H
+#define TimeAveragedValuesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "IntegrateValuesHelper.h"
 #include "LBMSystem.h"
 
@@ -24,7 +24,7 @@ class Block3D;
 //! \author  Konstantin Kutscher
 // \f$ u_{mean}=\frac{1}{N}\sum\limits_{i=1}^n u_{i} \f$
 
-class TimeAveragedValuesCoProcessor : public CoProcessor
+class TimeAveragedValuesSimulationObserver : public SimulationObserver
 {
 public:
     enum Options {
@@ -39,10 +39,10 @@ public:
     };
 
 public:
-    TimeAveragedValuesCoProcessor();
-    TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+    TimeAveragedValuesSimulationObserver();
+    TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                   SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm, int options);
-    TimeAveragedValuesCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+    TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                   SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm, int options, std::vector<int> levels,
                                   std::vector<real> &levelCoords, std::vector<real> &bounds,
                                   bool timeAveraging = true);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp
new file mode 100644
index 000000000..99e7ebafd
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.cpp
@@ -0,0 +1,22 @@
+#include "TimeDependentBCSimulationObserver.h"
+
+#include "Grid3D.h"
+#include "Interactor3D.h"
+#include "UbScheduler.h"
+
+TimeDependentBCSimulationObserver::TimeDependentBCSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s) : SimulationObserver(grid, s) {}
+//////////////////////////////////////////////////////////////////////////
+TimeDependentBCSimulationObserver::~TimeDependentBCSimulationObserver() = default;
+//////////////////////////////////////////////////////////////////////////
+void TimeDependentBCSimulationObserver::process(real step)
+{
+    if (scheduler->isDue(step)) {
+        for (SPtr<Interactor3D> inter : interactors)
+            inter->updateInteractor(step);
+        UBLOG(logDEBUG3, "TimeDependentBCSimulationObserver::update:" << step);
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+void TimeDependentBCSimulationObserver::addInteractor(SPtr<Interactor3D> interactor) { interactors.push_back(interactor); }
+
+//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h
new file mode 100644
index 000000000..32a1ea780
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeDependentBCSimulationObserver.h
@@ -0,0 +1,30 @@
+#ifndef TimeDependentBCSimulationObserver_H
+#define TimeDependentBCSimulationObserver_H
+
+#include <PointerDefinitions.h>
+#include <vector>
+
+#include "SimulationObserver.h"
+
+class Interactor3D;
+class Grid3D;
+
+//! \brief The class update interactors depend of time step.
+//! \details TimeDependentBCSimulationObserver update every time step information in BCs throw Interactors
+//! \author Sonja Uphoff, Kostyantyn Kucher
+class TimeDependentBCSimulationObserver : public SimulationObserver
+{
+public:
+    TimeDependentBCSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s);
+    ~TimeDependentBCSimulationObserver() override;
+
+    void process(real step) override;
+
+    //! add interactors to SimulationObserver
+    void addInteractor(SPtr<Interactor3D> interactor);
+
+private:
+    std::vector<SPtr<Interactor3D>> interactors;
+};
+
+#endif /* TimeDependentBCSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
similarity index 77%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
index b897d4df1..861045cf6 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
@@ -1,11 +1,11 @@
 /*
- *  TimeseriesWriterCoProcessor.h
+ *  TimeseriesWriterSimulationObserver.h
  *
  *  Created on: 08.05.2013
  *  Author: uphoff
  */
 
-#include "TimeseriesCoProcessor.h"
+#include "TimeseriesSimulationObserver.h"
 
 #include <fstream>
 
@@ -15,15 +15,15 @@
 #include "LBMUnitConverter.h"
 #include "UbScheduler.h"
 
-TimeseriesCoProcessor::TimeseriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
+TimeseriesSimulationObserver::TimeseriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
                                              const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), h1(h1), path(path), comm(comm)
+    : SimulationObserver(grid, s), h1(h1), path(path), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         std::ofstream ostr;
         // fname = path+"/timeseries/timeseries"+UbSystem::toString(grid->getTimeStep())+".csv";
         fname = path + ".csv";
-        UBLOG(logINFO, "TimeseriesWriterCoProcessor::fname:" << fname);
+        UBLOG(logINFO, "TimeseriesWriterSimulationObserver::fname:" << fname);
         ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);
         if (!ostr) {
             ostr.clear();
@@ -37,23 +37,23 @@ TimeseriesCoProcessor::TimeseriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler
         }
         ostr << "step;rho;vx;vy;vz;volume\n";
         ostr.close();
-        UBLOG(logINFO, "TimeseriesWriterCoProcessor::Constructor:end");
+        UBLOG(logINFO, "TimeseriesWriterSimulationObserver::Constructor:end");
     }
 }
 //////////////////////////////////////////////////////////////////////////
-TimeseriesCoProcessor::~TimeseriesCoProcessor() = default;
+TimeseriesSimulationObserver::~TimeseriesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void TimeseriesCoProcessor::process(real step)
+void TimeseriesSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void TimeseriesCoProcessor::collectData(real step)
+void TimeseriesSimulationObserver::collectData(real step)
 {
     h1->calculateMQ();
 
-    UBLOG(logDEBUG3, "TimeseriesWriterCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "TimeseriesWriterSimulationObserver::update:" << step);
 
     if (comm->getProcessID() == comm->getRoot()) {
         int istep = static_cast<int>(step);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
similarity index 69%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
index 7cdc98fd0..1cc7ed375 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeseriesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
@@ -1,17 +1,17 @@
 /*
- *  TimeseriesCoProcessor.h
+ *  TimeseriesSimulationObserver.h
  *
  *  Created on: 08.05.2013
  *  Author: uphoff
  */
 
-#ifndef TimeseriesCoProcessor_H
-#define TimeseriesCoProcessor_H
+#ifndef TimeseriesSimulationObserver_H
+#define TimeseriesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 namespace vf::mpi {class Communicator;}
 class Grid3D;
@@ -23,12 +23,12 @@ class IntegrateValuesHelper;
 //! \author    Sonja Uphoff
 //! \date      May 2013
 
-class TimeseriesCoProcessor : public CoProcessor
+class TimeseriesSimulationObserver : public SimulationObserver
 {
 public:
-    TimeseriesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
+    TimeseriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
                           const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~TimeseriesCoProcessor() override;
+    ~TimeseriesSimulationObserver() override;
 
     //! calls collectData.
     void process(real step) override;
@@ -45,4 +45,4 @@ private:
     std::string fname;
 };
 
-#endif /* TimeseriesCoProcessor_H */
+#endif /* TimeseriesSimulationObserver_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
similarity index 93%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
index 7293ded40..ee19e1bf2 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "TurbulenceIntensityCoProcessor.h"
+#include "TurbulenceIntensitySimulationObserver.h"
 
 #include "BCArray3D.h"
 #include "BCSet.h"
@@ -12,15 +12,15 @@
 #include "basics/utilities/UbMath.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-TurbulenceIntensityCoProcessor::TurbulenceIntensityCoProcessor(SPtr<Grid3D> grid, const std::string &path,
+TurbulenceIntensitySimulationObserver::TurbulenceIntensitySimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                                WbWriter *const writer, SPtr<UbScheduler> s,
                                                                std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), comm(comm), writer(writer)
+    : SimulationObserver(grid, s), path(path), comm(comm), writer(writer)
 {
     init();
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::init()
+void TurbulenceIntensitySimulationObserver::init()
 {
     gridRank     = grid->getRank();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -40,17 +40,17 @@ void TurbulenceIntensityCoProcessor::init()
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::process(real step)
+void TurbulenceIntensitySimulationObserver::process(real step)
 {
     calculateAverageValues(int(step));
 
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "TurbulenceIntensityCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "TurbulenceIntensitySimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::collectData(real step)
+void TurbulenceIntensitySimulationObserver::collectData(real step)
 {
     int istep = int(step);
 
@@ -76,18 +76,18 @@ void TurbulenceIntensityCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(pname);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(path + "_collection", filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(path + "_collection", filenames, istep, false);
         }
-        UBLOG(logINFO, "TurbulenceIntensityCoProcessor step: " << istep);
+        UBLOG(logINFO, "TurbulenceIntensitySimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::clearData()
+void TurbulenceIntensitySimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -95,7 +95,7 @@ void TurbulenceIntensityCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::addData(const SPtr<Block3D> block)
+void TurbulenceIntensitySimulationObserver::addData(const SPtr<Block3D> block)
 {
     UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
     //   UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
@@ -179,7 +179,7 @@ void TurbulenceIntensityCoProcessor::addData(const SPtr<Block3D> block)
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void TurbulenceIntensityCoProcessor::calculateAverageValues(real timeStep)
+void TurbulenceIntensitySimulationObserver::calculateAverageValues(real timeStep)
 {
     using namespace vf::lbm::dir;
     using namespace D3Q27System;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
similarity index 75%
rename from src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
index 8f11e94b4..edede6fe6 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef TurbulenceIntensityCoProcessor_H
-#define TurbulenceIntensityCoProcessor_H
+#ifndef TurbulenceIntensitySimulationObserver_H
+#define TurbulenceIntensitySimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 
 namespace vf::mpi {class Communicator;}
@@ -14,10 +14,10 @@ class UbScheduler;
 class WbWriter;
 class Block3D;
 
-class TurbulenceIntensityCoProcessor : public CoProcessor
+class TurbulenceIntensitySimulationObserver : public SimulationObserver
 {
 public:
-    TurbulenceIntensityCoProcessor(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
+    TurbulenceIntensitySimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
                                    SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm);
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
similarity index 92%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
index de781d96b..8dec964fd 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
@@ -26,12 +26,12 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBlocksCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteBlocksSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteBlocksCoProcessor.h"
+#include "WriteBlocksSimulationObserver.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 #include <logger/Logger.h>
 
@@ -41,21 +41,21 @@
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
-WriteBlocksCoProcessor::WriteBlocksCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+WriteBlocksSimulationObserver::WriteBlocksSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-WriteBlocksCoProcessor::~WriteBlocksCoProcessor() = default;
+WriteBlocksSimulationObserver::~WriteBlocksSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void WriteBlocksCoProcessor::process(real step)
+void WriteBlocksSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBlocksCoProcessor::collectData(real step)
+void WriteBlocksSimulationObserver::collectData(real step)
 {
     if (comm->getProcessID() == comm->getRoot()) {
         int istep = int(step);
@@ -173,7 +173,7 @@ void WriteBlocksCoProcessor::collectData(real step)
             path + "/blocks/blocks_" + UbSystem::toString(grid->getRank()) + "_" + UbSystem::toString(istep), nodes,
             cells, celldatanames, celldata));
 
-        if (istep == CoProcessor::scheduler->getMinBegin()) {
+        if (istep == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(path + "/blocks/blocks_collection", filenames, istep,
                                                                 false);
         } else {
@@ -181,6 +181,6 @@ void WriteBlocksCoProcessor::collectData(real step)
                                                                      istep, false);
         }
 
-        VF_LOG_INFO("WriteBlocksCoProcessor step: {}", istep);
+        VF_LOG_INFO("WriteBlocksSimulationObserver step: {}", istep);
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
index c94cd1e64..4bc210c82 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
@@ -26,39 +26,39 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBlocksCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteBlocksSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteBlocksCoProcessor_H_
-#define WriteBlocksCoProcessor_H_
+#ifndef WriteBlocksSimulationObserver_H_
+#define WriteBlocksSimulationObserver_H_
 
 #include <PointerDefinitions.h>
 #include <string>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 namespace vf::mpi {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
 
-//! \class WriteBlocksCoProcessor
+//! \class WriteBlocksSimulationObserver
 //! \brief A class writes a block grid to a VTK-file
-class WriteBlocksCoProcessor : public CoProcessor
+class WriteBlocksSimulationObserver : public SimulationObserver
 {
 public:
-    //! \brief Construct WriteBlocksCoProcessor object.
+    //! \brief Construct WriteBlocksSimulationObserver object.
     //! \pre The Grid3D and UbScheduler objects must exist.
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \param path is path of folder for output
     //! \param writer is WbWriter object
     //! \param comm is Communicator object
-    WriteBlocksCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
+    WriteBlocksSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
                            std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteBlocksCoProcessor() override;
+    ~WriteBlocksSimulationObserver() override;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
index 365b819aa..9685a942a 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.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 WriteBoundaryConditionsCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteBoundaryConditionsSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteBoundaryConditionsCoProcessor.h"
+#include "WriteBoundaryConditionsSimulationObserver.h"
 #include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
@@ -51,12 +51,12 @@
 
 using namespace std;
 
-WriteBoundaryConditionsCoProcessor::WriteBoundaryConditionsCoProcessor() = default;
+WriteBoundaryConditionsSimulationObserver::WriteBoundaryConditionsSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteBoundaryConditionsCoProcessor::WriteBoundaryConditionsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteBoundaryConditionsSimulationObserver::WriteBoundaryConditionsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                        const std::string &path, WbWriter *const writer,
                                                                        std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
     gridRank     = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -69,15 +69,15 @@ WriteBoundaryConditionsCoProcessor::WriteBoundaryConditionsCoProcessor(SPtr<Grid
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::process(real step)
+void WriteBoundaryConditionsSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteBoundaryConditionsCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteBoundaryConditionsSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::collectData(real step)
+void WriteBoundaryConditionsSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -111,18 +111,18 @@ void WriteBoundaryConditionsCoProcessor::collectData(real step)
 
         vector<string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        VF_LOG_INFO("WriteBoundaryConditionsCoProcessor step: {}", istep);
+        VF_LOG_INFO("WriteBoundaryConditionsSimulationObserver step: {}", istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::clearData()
+void WriteBoundaryConditionsSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -130,7 +130,7 @@ void WriteBoundaryConditionsCoProcessor::clearData()
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block)
+void WriteBoundaryConditionsSimulationObserver::addDataGeo(SPtr<Block3D> block)
 {
     UbTupleDouble3 org        = grid->getBlockWorldCoordinates(block);
     UbTupleDouble3 nodeOffset = grid->getNodeOffset(block);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
index 31f2a5c8e..86ff363d5 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteBoundaryConditionsCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteBoundaryConditionsSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteBoundaryConditionsCoProcessor_H
-#define WriteBoundaryConditionsCoProcessor_H
+#ifndef WriteBoundaryConditionsSimulationObserver_H
+#define WriteBoundaryConditionsSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 
 namespace vf::mpi {class Communicator;}
@@ -49,20 +49,20 @@ class Block3D;
 class LBMUnitConverter;
 
 //! \brief A class writes boundary conditions information to a VTK-file
-class WriteBoundaryConditionsCoProcessor : public CoProcessor
+class WriteBoundaryConditionsSimulationObserver : public SimulationObserver
 {
 public:
-    WriteBoundaryConditionsCoProcessor();
-    //! \brief Construct WriteBoundaryConditionsCoProcessor object
+    WriteBoundaryConditionsSimulationObserver();
+    //! \brief Construct WriteBoundaryConditionsSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
     //! \param path is path of folder for output
     //! \param writer is WbWriter object
     //! \param comm is Communicator object
-    WriteBoundaryConditionsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteBoundaryConditionsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                        WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteBoundaryConditionsCoProcessor() override = default;
+    ~WriteBoundaryConditionsSimulationObserver() override = default;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
similarity index 73%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
index b47f10561..7f2b699e4 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "WriteGbObjectsCoProcessor.h"
+#include "WriteGbObjectsSimulationObserver.h"
 #include <mpi/Communicator.h>
 #include "GbObject3D.h"
 #include "UbScheduler.h"
@@ -6,23 +6,23 @@
 #include "WbWriterVtkXmlBinary.h"
 #include <vector>
 
-WriteGbObjectsCoProcessor::WriteGbObjectsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+WriteGbObjectsSimulationObserver::WriteGbObjectsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                      WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), path(path), writer(writer), comm(comm)
+    : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-WriteGbObjectsCoProcessor::~WriteGbObjectsCoProcessor() = default;
+WriteGbObjectsSimulationObserver::~WriteGbObjectsSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-void WriteGbObjectsCoProcessor::process(real step)
+void WriteGbObjectsSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteGbObjectsCoProcessor::addGbObject(SPtr<GbObject3D> object) { objects.push_back(object); }
+void WriteGbObjectsSimulationObserver::addGbObject(SPtr<GbObject3D> object) { objects.push_back(object); }
 //////////////////////////////////////////////////////////////////////////
-void WriteGbObjectsCoProcessor::collectData(real step)
+void WriteGbObjectsSimulationObserver::collectData(real step)
 {
     std::vector<UbTupleFloat3> nodes;
     std::vector<UbTupleInt3> triangles;
@@ -62,12 +62,12 @@ void WriteGbObjectsCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteGbObjectsCoProcessor number of objects: " << numObjcts);
-        UBLOG(logINFO, "WriteGbObjectsCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteGbObjectsSimulationObserver number of objects: " << numObjcts);
+        UBLOG(logINFO, "WriteGbObjectsSimulationObserver step: " << istep);
     }
 }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
similarity index 66%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
index 5b502044f..7fa770917 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteGbObjectsCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
@@ -1,7 +1,7 @@
-#ifndef WriteGbObjectsCoProcessor_h__
-#define WriteGbObjectsCoProcessor_h__
+#ifndef WriteGbObjectsSimulationObserver_h__
+#define WriteGbObjectsSimulationObserver_h__
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "UbTuple.h"
 
 #include <vector>
@@ -17,12 +17,12 @@ class WbWriter;
 //! \author    Konstantin Kutscher
 //! \date      December 2018
 
-class WriteGbObjectsCoProcessor : public CoProcessor
+class WriteGbObjectsSimulationObserver : public SimulationObserver
 {
 public:
-    WriteGbObjectsCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
+    WriteGbObjectsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
                               std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteGbObjectsCoProcessor() override;
+    ~WriteGbObjectsSimulationObserver() override;
     //! calls collectData.
     void process(real step) override;
     //! adds geometry object
@@ -38,4 +38,4 @@ private:
     std::shared_ptr<vf::mpi::Communicator> comm;
 };
 
-#endif // WriteGbObjectsCoProcessor_h__
\ No newline at end of file
+#endif // WriteGbObjectsSimulationObserver_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
index 2952328f6..a9f837653 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
@@ -1,4 +1,4 @@
-#include "WriteMQFromSelectionCoProcessor.h"
+#include "WriteMQFromSelectionSimulationObserver.h"
 #include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
@@ -14,13 +14,13 @@
 #include "UbScheduler.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-WriteMQFromSelectionCoProcessor::WriteMQFromSelectionCoProcessor() = default;
+WriteMQFromSelectionSimulationObserver::WriteMQFromSelectionSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMQFromSelectionCoProcessor::WriteMQFromSelectionCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMQFromSelectionSimulationObserver::WriteMQFromSelectionSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                  SPtr<GbObject3D> gbObject, const std::string &path,
                                                                  WbWriter *const writer, SPtr<LBMUnitConverter> conv,
                                                                  std::shared_ptr<vf::mpi::Communicator> comm)
-    : CoProcessor(grid, s), gbObject(gbObject), path(path), writer(writer), conv(conv), comm(comm)
+    : SimulationObserver(grid, s), gbObject(gbObject), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank     = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -33,17 +33,17 @@ WriteMQFromSelectionCoProcessor::WriteMQFromSelectionCoProcessor(SPtr<Grid3D> gr
     }
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::init() {}
+void WriteMQFromSelectionSimulationObserver::init() {}
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::process(real step)
+void WriteMQFromSelectionSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteMQFromSelectionCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteMQFromSelectionSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::collectData(real step)
+void WriteMQFromSelectionSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -90,25 +90,25 @@ void WriteMQFromSelectionCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin()) {
+        if (step == SimulationObserver::scheduler->getMinBegin()) {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteMQFromSelectionCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteMQFromSelectionSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::clearData()
+void WriteMQFromSelectionSimulationObserver::clearData()
 {
     nodes.clear();
     datanames.clear();
     data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteMQFromSelectionCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMQFromSelectionSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     real level = (real)block->getLevel();
     //   double blockID = (double)block->getGlobalID();
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
similarity index 73%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
index 64e757279..23af9d28f 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMQFromSelectionCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
@@ -1,11 +1,11 @@
-#ifndef WriteMQFromSelectionCoProcessor_H
-#define WriteMQFromSelectionCoProcessor_H
+#ifndef WriteMQFromSelectionSimulationObserver_H
+#define WriteMQFromSelectionSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 
 #include "LBMSystem.h"
 #include "UbTuple.h"
@@ -18,14 +18,14 @@ class WbWriter;
 class Block3D;
 class GbObject3D;
 
-class WriteMQFromSelectionCoProcessor : public CoProcessor
+class WriteMQFromSelectionSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMQFromSelectionCoProcessor();
-    WriteMQFromSelectionCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbObject3D> gbObject,
+    WriteMQFromSelectionSimulationObserver();
+    WriteMQFromSelectionSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbObject3D> gbObject,
                                     const std::string &path, WbWriter *const writer, SPtr<LBMUnitConverter> conv,
                                     std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMQFromSelectionCoProcessor() override = default;
+    ~WriteMQFromSelectionSimulationObserver() override = default;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
similarity index 91%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
index 35421654f..f20c4c91b 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.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 WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteMacroscopicQuantitiesPlusMassCoProcessor.h"
+#include "WriteMacroscopicQuantitiesPlusMassSimulationObserver.h"
 #include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
@@ -46,14 +46,14 @@
 #include "UbScheduler.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor() = default;
+WriteMacroscopicQuantitiesPlusMassSimulationObserver::WriteMacroscopicQuantitiesPlusMassSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMacroscopicQuantitiesPlusMassSimulationObserver::WriteMacroscopicQuantitiesPlusMassSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
                                                                              std::shared_ptr<vf::mpi::Communicator> comm)
-        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+        : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -68,20 +68,20 @@ WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMas
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::init()
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::init()
 {}
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::process(real step)
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesPlusMassCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesPlusMassSimulationObserver::update:" << step);
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::collectData(real step)
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -118,21 +118,21 @@ void WriteMacroscopicQuantitiesPlusMassCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin())
+        if (step == SimulationObserver::scheduler->getMinBegin())
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else
         {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteMacroscopicQuantitiesPlusMassCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteMacroscopicQuantitiesPlusMassSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::clearData()
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -141,7 +141,7 @@ void WriteMacroscopicQuantitiesPlusMassCoProcessor::clearData()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesPlusMassCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMacroscopicQuantitiesPlusMassSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     real level   = (real)block->getLevel();
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
similarity index 84%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
index 9251bfc22..9da90c1d7 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMacroscopicQuantitiesPlusMassCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteMacroscopicQuantitiesPlusMassCoProcessor_H
-#define WriteMacroscopicQuantitiesPlusMassCoProcessor_H
+#ifndef WriteMacroscopicQuantitiesPlusMassSimulationObserver_H
+#define WriteMacroscopicQuantitiesPlusMassSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -50,11 +50,11 @@ class WbWriter;
 class Block3D;
 
 //! \brief A class writes macroscopic quantities information to a VTK-file
-class WriteMacroscopicQuantitiesPlusMassCoProcessor : public CoProcessor
+class WriteMacroscopicQuantitiesPlusMassSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMacroscopicQuantitiesPlusMassCoProcessor();
-    //! \brief Construct WriteMacroscopicQuantitiesPlusMassCoProcessor object
+    WriteMacroscopicQuantitiesPlusMassSimulationObserver();
+    //! \brief Construct WriteMacroscopicQuantitiesPlusMassSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
@@ -62,9 +62,9 @@ public:
     //! \param writer is WbWriter object
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
-    WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteMacroscopicQuantitiesPlusMassSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                           WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMacroscopicQuantitiesPlusMassCoProcessor() override = default;
+    ~WriteMacroscopicQuantitiesPlusMassSimulationObserver() override = default;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
similarity index 91%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
index 838c1f143..195ef22a8 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.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 WriteMacroscopicQuantitiesCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteMacroscopicQuantitiesCoProcessor.h"
+#include "WriteMacroscopicQuantitiesSimulationObserver.h"
 #include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
@@ -46,14 +46,14 @@
 #include "UbScheduler.h"
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
-WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor() = default;
+WriteMacroscopicQuantitiesSimulationObserver::WriteMacroscopicQuantitiesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMacroscopicQuantitiesSimulationObserver::WriteMacroscopicQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
                                                                              std::shared_ptr<vf::mpi::Communicator> comm)
-        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+        : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -68,20 +68,20 @@ WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor(SPt
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::init()
+void WriteMacroscopicQuantitiesSimulationObserver::init()
 {}
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::process(real step)
+void WriteMacroscopicQuantitiesSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesCoProcessor::update:" << step);
+    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesSimulationObserver::update:" << step);
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::collectData(real step)
+void WriteMacroscopicQuantitiesSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -118,21 +118,21 @@ void WriteMacroscopicQuantitiesCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin())
+        if (step == SimulationObserver::scheduler->getMinBegin())
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else
         {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        UBLOG(logINFO, "WriteMacroscopicQuantitiesCoProcessor step: " << istep);
+        UBLOG(logINFO, "WriteMacroscopicQuantitiesSimulationObserver step: " << istep);
     }
 
     clearData();
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::clearData()
+void WriteMacroscopicQuantitiesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -141,7 +141,7 @@ void WriteMacroscopicQuantitiesCoProcessor::clearData()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMacroscopicQuantitiesSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     real level   = (real)block->getLevel();
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
similarity index 85%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
index 1815d480f..02c76ea2e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMacroscopicQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMacroscopicQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteMacroscopicQuantitiesCoProcessor_H
-#define WriteMacroscopicQuantitiesCoProcessor_H
+#ifndef WriteMacroscopicQuantitiesSimulationObserver_H
+#define WriteMacroscopicQuantitiesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -50,11 +50,11 @@ class WbWriter;
 class Block3D;
 
 //! \brief A class writes macroscopic quantities information to a VTK-file
-class WriteMacroscopicQuantitiesCoProcessor : public CoProcessor
+class WriteMacroscopicQuantitiesSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMacroscopicQuantitiesCoProcessor();
-    //! \brief Construct WriteMacroscopicQuantitiesCoProcessor object
+    WriteMacroscopicQuantitiesSimulationObserver();
+    //! \brief Construct WriteMacroscopicQuantitiesSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
@@ -62,9 +62,9 @@ public:
     //! \param writer is WbWriter object
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
-    WriteMacroscopicQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteMacroscopicQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                           WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMacroscopicQuantitiesCoProcessor() override = default;
+    ~WriteMacroscopicQuantitiesSimulationObserver() override = default;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
similarity index 94%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
index e092f4cfd..46d1d7c83 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.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 WriteMultiphaseQuantitiesCoProcessor.cpp
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.cpp
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include "WriteMultiphaseQuantitiesCoProcessor.h"
+#include "WriteMultiphaseQuantitiesSimulationObserver.h"
 #include "BCSet.h"
 #include "LBMKernel.h"
 #include <string>
@@ -47,14 +47,14 @@
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 #include <logger/Logger.h>
 
-WriteMultiphaseQuantitiesCoProcessor::WriteMultiphaseQuantitiesCoProcessor() = default;
+WriteMultiphaseQuantitiesSimulationObserver::WriteMultiphaseQuantitiesSimulationObserver() = default;
 //////////////////////////////////////////////////////////////////////////
-WriteMultiphaseQuantitiesCoProcessor::WriteMultiphaseQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+WriteMultiphaseQuantitiesSimulationObserver::WriteMultiphaseQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
                                                                              std::shared_ptr<vf::mpi::Communicator> comm)
-        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+        : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -69,21 +69,21 @@ WriteMultiphaseQuantitiesCoProcessor::WriteMultiphaseQuantitiesCoProcessor(SPtr<
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::init()
+void WriteMultiphaseQuantitiesSimulationObserver::init()
 {}
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::process(real step)
+void WriteMultiphaseQuantitiesSimulationObserver::process(real step)
 {
     if (scheduler->isDue(step))
         collectData(step);
 
-    //UBLOG(logDEBUG3, "WriteMultiphaseQuantitiesCoProcessor::update:" << step);
-    VF_LOG_DEBUG("WriteMultiphaseQuantitiesCoProcessor::update:: {}", step);
+    //UBLOG(logDEBUG3, "WriteMultiphaseQuantitiesSimulationObserver::update:" << step);
+    VF_LOG_DEBUG("WriteMultiphaseQuantitiesSimulationObserver::update:: {}", step);
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::collectData(real step)
+void WriteMultiphaseQuantitiesSimulationObserver::collectData(real step)
 {
     int istep = static_cast<int>(step);
 
@@ -120,22 +120,22 @@ void WriteMultiphaseQuantitiesCoProcessor::collectData(real step)
 
         std::vector<std::string> filenames;
         filenames.push_back(piece);
-        if (step == CoProcessor::scheduler->getMinBegin())
+        if (step == SimulationObserver::scheduler->getMinBegin())
         {
             WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
         } else
         {
             WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
         }
-        //UBLOG(logINFO, "WriteMultiphaseQuantitiesCoProcessor step: " << istep);
-        VF_LOG_INFO("WriteMultiphaseQuantitiesCoProcessor step: {}", istep);
+        //UBLOG(logINFO, "WriteMultiphaseQuantitiesSimulationObserver step: " << istep);
+        VF_LOG_INFO("WriteMultiphaseQuantitiesSimulationObserver step: {}", istep);
     }
 
     clearData();
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::clearData()
+void WriteMultiphaseQuantitiesSimulationObserver::clearData()
 {
     nodes.clear();
     cells.clear();
@@ -144,7 +144,7 @@ void WriteMultiphaseQuantitiesCoProcessor::clearData()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteMultiphaseQuantitiesSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
     using namespace D3Q27System;
  //   using namespace UbMath;
@@ -474,7 +474,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     }
 }
 
-real WriteMultiphaseQuantitiesCoProcessor::gradX1_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::gradX1_phi(const real *const &h)
 {
     using namespace D3Q27System;
     real sum = 0.0;
@@ -483,7 +483,7 @@ real WriteMultiphaseQuantitiesCoProcessor::gradX1_phi(const real *const &h)
     }
     return 3.0 * sum;
 }
-real WriteMultiphaseQuantitiesCoProcessor::gradX2_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::gradX2_phi(const real *const &h)
 {
     using namespace D3Q27System;
     real sum = 0.0;
@@ -493,7 +493,7 @@ real WriteMultiphaseQuantitiesCoProcessor::gradX2_phi(const real *const &h)
     return 3.0 * sum;
 }
 
-real WriteMultiphaseQuantitiesCoProcessor::gradX3_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::gradX3_phi(const real *const &h)
 {
     using namespace D3Q27System;
     real sum = 0.0;
@@ -503,7 +503,7 @@ real WriteMultiphaseQuantitiesCoProcessor::gradX3_phi(const real *const &h)
     return 3.0 * sum;
 }
 
-real WriteMultiphaseQuantitiesCoProcessor::nabla2_phi(const real *const &h)
+real WriteMultiphaseQuantitiesSimulationObserver::nabla2_phi(const real *const &h)
 {
     using namespace vf::lbm::dir;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
similarity index 86%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
index de09654bb..9a97b35bc 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
@@ -26,19 +26,19 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteMultiphaseQuantitiesCoProcessor_H
-#define WriteMultiphaseQuantitiesCoProcessor_H
+#ifndef WriteMultiphaseQuantitiesSimulationObserver_H
+#define WriteMultiphaseQuantitiesSimulationObserver_H
 
 #include <PointerDefinitions.h>
 #include <string>
 #include <vector>
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
@@ -50,11 +50,11 @@ class WbWriter;
 class Block3D;
 
 //! \brief A class writes macroscopic quantities information to a VTK-file
-class WriteMultiphaseQuantitiesCoProcessor : public CoProcessor
+class WriteMultiphaseQuantitiesSimulationObserver : public SimulationObserver
 {
 public:
-    WriteMultiphaseQuantitiesCoProcessor();
-    //! \brief Construct WriteMultiphaseQuantitiesCoProcessor object
+    WriteMultiphaseQuantitiesSimulationObserver();
+    //! \brief Construct WriteMultiphaseQuantitiesSimulationObserver object
     //! \pre The Grid3D and UbScheduler objects must exist
     //! \param grid is observable Grid3D object
     //! \param s is UbScheduler object for scheduling of observer
@@ -62,9 +62,9 @@ public:
     //! \param writer is WbWriter object
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
-    WriteMultiphaseQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    WriteMultiphaseQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                           WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-    ~WriteMultiphaseQuantitiesCoProcessor() override = default;
+    ~WriteMultiphaseQuantitiesSimulationObserver() override = default;
 
     void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
similarity index 90%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
index ac17a4ef7..dbfcd2b56 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
@@ -26,11 +26,11 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
-#include "WriteThixotropyQuantitiesCoProcessor.h"
+#include "WriteThixotropyQuantitiesSimulationObserver.h"
 #include "LBMKernel.h"
 #include "BCSet.h"
 #include "UbScheduler.h"
@@ -47,12 +47,12 @@
 
 using namespace std;
 
-WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor()
+WriteThixotropyQuantitiesSimulationObserver::WriteThixotropyQuantitiesSimulationObserver()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path), writer(writer),	conv(conv),	comm(comm)
+WriteThixotropyQuantitiesSimulationObserver::WriteThixotropyQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path), writer(writer),	conv(conv),	comm(comm)
 {
 	gridRank = comm->getProcessID();
 	minInitLevel = this->grid->getCoarsestInitializedLevel();
@@ -66,20 +66,20 @@ WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor(SPtr<
 	}
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::init()
+void WriteThixotropyQuantitiesSimulationObserver::init()
 {
 
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::process(real step)
+void WriteThixotropyQuantitiesSimulationObserver::process(real step)
 {
 	if (scheduler->isDue(step))
 		collectData(step);
 
-	UBLOG(logDEBUG3, "WriteThixotropyQuantitiesCoProcessor::update:" << step);
+	UBLOG(logDEBUG3, "WriteThixotropyQuantitiesSimulationObserver::update:" << step);
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::collectData(real step)
+void WriteThixotropyQuantitiesSimulationObserver::collectData(real step)
 {
 	int istep = static_cast<int>(step);
 	//ConcentrationSum = 0;
@@ -118,7 +118,7 @@ void WriteThixotropyQuantitiesCoProcessor::collectData(real step)
 
 		vector<string> filenames;
 		filenames.push_back(piece);
-		if (step == CoProcessor::scheduler->getMinBegin())
+		if (step == SimulationObserver::scheduler->getMinBegin())
 		{
 			WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
 		}
@@ -126,13 +126,13 @@ void WriteThixotropyQuantitiesCoProcessor::collectData(real step)
 		{
 			WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
 		}
-		UBLOG(logINFO, "WriteThixotropyQuantitiesCoProcessor step: " << istep);
+		UBLOG(logINFO, "WriteThixotropyQuantitiesSimulationObserver step: " << istep);
 	}
 
 	clearData();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::clearData()
+void WriteThixotropyQuantitiesSimulationObserver::clearData()
 {
 	nodes.clear();
 	cells.clear();
@@ -140,7 +140,7 @@ void WriteThixotropyQuantitiesCoProcessor::clearData()
 	data.clear();
 }
 //////////////////////////////////////////////////////////////////////////
-void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+void WriteThixotropyQuantitiesSimulationObserver::addDataMQ(SPtr<Block3D> block)
 {
 	UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);;
 	UbTupleDouble3 nodeOffset = grid->getNodeOffset(block);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
similarity index 82%
rename from src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
rename to src/cpu/VirtualFluidsCore/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
index fbb2b6740..c5bea7d70 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
@@ -26,27 +26,27 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file WriteMultiphaseQuantitiesCoProcessor.h
-//! \ingroup CoProcessors
+//! \file WriteMultiphaseQuantitiesSimulationObserver.h
+//! \ingroup SimulationObservers
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#ifndef WriteThixotropyQuantitiesCoProcessor_H
-#define WriteThixotropyQuantitiesCoProcessor_H
+#ifndef WriteThixotropyQuantitiesSimulationObserver_H
+#define WriteThixotropyQuantitiesSimulationObserver_H
 
-#include "CoProcessor.h"
+#include "SimulationObserver.h"
 #include "Grid3D.h"
 #include "Block3D.h"
 #include "LBMUnitConverter.h"
 #include <mpi/Communicator.h>
 #include "WbWriter.h"
 
-class WriteThixotropyQuantitiesCoProcessor : public  CoProcessor
+class WriteThixotropyQuantitiesSimulationObserver : public  SimulationObserver
 {
 public:
-	WriteThixotropyQuantitiesCoProcessor();
-	WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
-	~WriteThixotropyQuantitiesCoProcessor() = default;
+	WriteThixotropyQuantitiesSimulationObserver();
+	WriteThixotropyQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+	~WriteThixotropyQuantitiesSimulationObserver() = default;
 
    void process(real step) override;
 
diff --git a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
index 532822942..358dabf43 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
+++ b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
@@ -162,7 +162,7 @@ void CheckpointConverter::convertBlocks(int step, int procCount)
 
     // calculate the read offset
     procCount =
-        1; // readBlocks and writeBlocks in both MPIIORestartCoProcessor and MPIIOMigrationCoProcessor have size == 1!
+        1; // readBlocks and writeBlocks in both MPIIORestartSimulationObserver and MPIIOMigrationSimulationObserver have size == 1!
     MPI_Offset read_offset = (MPI_Offset)(procCount * sizeof(int));
 
     // read parameters of the grid and blocks
diff --git a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
index 6fe24772d..bab67ae66 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
+++ b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
@@ -11,7 +11,7 @@ class Grid3D;
 namespace vf::mpi {class Communicator;}
 
 //! \class UtilConvertor
-//! \brief Converts timestep data from MPIIORestartCoProcessor format into MPIIOMigrationCoProcessor format
+//! \brief Converts timestep data from MPIIORestartSimulationObserver format into MPIIOMigrationSimulationObserver format
 class CheckpointConverter
 {
 public:
-- 
GitLab