diff --git a/.clang-format b/.clang-format
index 915697a4a6bf5b2bb3bd74e0593e02915a31d450..60054387527c3cfa59e2dcfa13ebb2ae9a0b184a 100644
--- a/.clang-format
+++ b/.clang-format
@@ -50,7 +50,7 @@ BreakConstructorInitializersBeforeComma: false
 BreakConstructorInitializers: BeforeColon
 BreakAfterJavaFieldAnnotations: false
 BreakStringLiterals: true
-ColumnLimit:     300
+ColumnLimit:     125
 CommentPragmas:  '^ IWYU pragma:'
 CompactNamespaces: false
 ConstructorInitializerAllOnOneLineOrOnePerLine: false
diff --git a/.clang-tidy b/.clang-tidy
index e7d5a5e58c66b679eb607560b1c4073abb0f6d97..3ed9ebc5b5104aa82e28c90c1e6a1d3117b89d79 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -53,5 +53,5 @@ cppcoreguidelines-special-member-functions,
 -cppcoreguidelines-interfaces-global-init
 
 '
-HeaderFilterRegex: '\.h$'
-...
+HeaderFilterRegex: '.*/src/.*'
+WarningsAsErrors: 'True'
\ No newline at end of file
diff --git a/.clangd b/.clangd
new file mode 100644
index 0000000000000000000000000000000000000000..c6f7db4e4d1eb5d761fd66dab7ff582e640651dd
--- /dev/null
+++ b/.clangd
@@ -0,0 +1,9 @@
+CompileFlags:
+  Add:
+    - -xc++
+    - -std=c++17
+    - --cuda-gpu-arch=sm_70
+    - --cuda-path=/usr/local/cuda
+    - -L/usr/local/cuda/lib64
+    - -I/usr/local/cuda/include
+  Remove: [-ccbin=*,-rdc=*,--generate-code*,--options-file,-forward*,--extended-lambda,-fopenmp]
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 74df1acd7c98139314656e70b2e074adcbb0983b..50c1263289d238837267f21e101afa190cb2f6ed 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -5,15 +5,14 @@
             "extensions": [
                 "mhutchie.git-graph",
                 "donjayamanne.githistory",
+                "ms-python.python",
                 "twxs.cmake",
-                "ms-vscode.cpptools",
-                "visualstudioexptteam.vscodeintellicode",
-                "xaver.clang-format",
-                "notskm.clang-tidy",
+                //"ms-vscode.cpptools",
+                "usernamehw.errorlens", // show warnings in code
                 "streetsidesoftware.code-spell-checker",
-                "llvm-vs-code-extensions.vscode-clangd",
-                "jbenden.c-cpp-flylint",
-                "ms-python.python",
+                "xaver.clang-format",
+                "msekoranja.clang-format-checker", // currently this extensions results in a lot of warnings
+                "llvm-vs-code-extensions.vscode-clangd" // code index based on clang using the compile_commannds.json
             ]
         }
     },
@@ -21,5 +20,5 @@
     "runArgs": ["--gpus","all",                     // remove this line in case you have no gpus available
                 "--hostname=${localEnv:HOSTNAME}"], // HOSTNAME needs to be known by the vscode environment. It is probably necessary to add "export HOSTNAME=<hostname>" to the config file of your host machine's bash.
 
-    "image": "git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu22_04:1.0"
+    "image": "git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu22_04:1.1"
 }
diff --git a/.gitignore b/.gitignore
index a750e16f2b49f42e1a4fbff5092680574aefc488..a63828c1c198e6d9685162e21a6ade6128f0a0d2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,6 +40,9 @@ scripts/
 # stl files
 stl/
 
+# test data for regression tests
+test_data/
+
 # MacOS
 .DS_Store
 
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 281644f5614054f167c577898d4b8eb4788b2076..3202c00addeaf7bf54e354e868175a06bfb94168 100755
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,7 +1,7 @@
 ###############################################################################
 ##                       VirtualFluids CI Pipeline                           ##
 ###############################################################################
-image: git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu22_04:1.0
+image: git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu22_04:1.1
 
 stages:
   - build
@@ -114,18 +114,14 @@ msvc_17:
       - $CI_PROJECT_DIR/$env:BUILD_FOLDER/
 
 
-###############################################################################
-##                             Build Python                                  ##
 ###############################################################################
 gcc_12_python:
-  stage: build_python
-
-  needs: ["gcc_12"]
+  stage: build
 
   cache:
     key: "gcc_12-$CI_COMMIT_REF_SLUG"
     paths:
-      - build
+      - pybuild/
 
   artifacts:
     expire_in: 1 hrs
@@ -138,7 +134,7 @@ gcc_12_python:
 
   script:
     - export SKBUILD_BUILD_DIR="pybuild"
-    - export SKBUILD_CMAKE_ARGS="-DBUILD_VF_CPU=ON;-DBUILD_VF_DOUBLE_ACCURACY=ON;-DCMAKE_CXX_COMPILER_LAUNCHER=ccache;-DCMAKE_CUDA_COMPILER_LAUNCHER=ccache;-DCMAKE_C_COMPILER_LAUNCHER=ccache;-G=Ninja"
+    - export SKBUILD_CMAKE_ARGS="-DBUILD_VF_CPU=ON;-DBUILD_VF_GPU=ON;-DCMAKE_CUDA_ARCHITECTURES=70;-DBUILD_VF_DOUBLE_ACCURACY=ON;-DCMAKE_CXX_COMPILER_LAUNCHER=ccache;-DCMAKE_CUDA_COMPILER_LAUNCHER=ccache;-DCMAKE_C_COMPILER_LAUNCHER=ccache;-G=Ninja"
     - pip install . -v
 
 ###############################################################################
@@ -690,8 +686,8 @@ vf_wheel_to_jupyterhub:
 
 ###############################################################################
 # sonar-scanner runs sonar-project.properties
-# the reports in this file needs to match the artifacts.
-# This job only run on the development branch of the parent repository, not on forks!
+# the reports in this file need to match the artifacts.
+# This job only runs on the development branch of the parent repository, not on forks!
 sonar-scanner:
   stage: deploy
 
diff --git a/CMake/cmake_config_files/ARAGORN.config.cmake b/CMake/cmake_config_files/ARAGORN.config.cmake
index 9f33c9977924ab60a1300763f53d04bb842b2f00..7643d267aabce7914000face6553fb38135b7a63 100644
--- a/CMake/cmake_config_files/ARAGORN.config.cmake
+++ b/CMake/cmake_config_files/ARAGORN.config.cmake
@@ -7,7 +7,7 @@
 set(CMAKE_CUDA_ARCHITECTURES 86)     # Nvidia GeForce RTX 3060
 
 # add invidual apps here
-set(GPU_APP "apps/gpu/LBM/")
+set(GPU_APP "apps/gpu/")
 list(APPEND USER_APPS 
     "${GPU_APP}DrivenCavityMultiGPU"
     "${GPU_APP}SphereScaling"
diff --git a/CMake/cmake_config_files/ARAGORNUBUNTU.config.cmake b/CMake/cmake_config_files/ARAGORNUBUNTU.config.cmake
index 3259e13acaade9b896e5e4a82dec90d3f4eb5e89..25224f9a8e6f25cad0b1d90c4d3035ebff3a75c4 100644
--- a/CMake/cmake_config_files/ARAGORNUBUNTU.config.cmake
+++ b/CMake/cmake_config_files/ARAGORNUBUNTU.config.cmake
@@ -9,7 +9,7 @@ set(CMAKE_CUDA_ARCHITECTURES 86)     # Nvidia GeForce RTX 3060
 set(PATH_NUMERICAL_TESTS "D:/out/numericalTests/")
 list(APPEND VF_COMPILER_DEFINITION "PATH_NUMERICAL_TESTS=${PATH_NUMERICAL_TESTS}")
 
-set(GPU_APP "apps/gpu/LBM/")
+set(GPU_APP "apps/gpu/")
 list(APPEND USER_APPS 
     "${GPU_APP}DrivenCavityMultiGPU"
     "${GPU_APP}SphereScaling"
diff --git a/CMake/cmake_config_files/ELDARION.config.cmake b/CMake/cmake_config_files/ELDARION.config.cmake
index 53dc97e213a7445e153157ec76937ea0fec1f678..13abc819e862f9275fa2cd77ee6bb1f2d31375bf 100644
--- a/CMake/cmake_config_files/ELDARION.config.cmake
+++ b/CMake/cmake_config_files/ELDARION.config.cmake
@@ -10,7 +10,7 @@ SET(CMAKE_CUDA_ARCHITECTURES 61)    # GeForce 1080 Ti
 set(PATH_NUMERICAL_TESTS "~/output/numericalTests/")
 list(APPEND VF_COMPILER_DEFINITION "PATH_NUMERICAL_TESTS=${PATH_NUMERICAL_TESTS}")
 
-set(GPU_APP "apps/gpu/LBM/")
+set(GPU_APP "apps/gpu/")
 list(APPEND USER_APPS 
     # "${GPU_APP}DrivenCavityMultiGPU"
     # "${GPU_APP}SphereScaling"
diff --git a/CMake/cmake_config_files/KI4ALLGPU.config.cmake b/CMake/cmake_config_files/KI4ALLGPU.config.cmake
index 111a3b3881d7a07eada02fb1e826e88b64b3591e..7e55f21f5549d10b2f5e93daf51a2b0bcb7f8bc1 100644
--- a/CMake/cmake_config_files/KI4ALLGPU.config.cmake
+++ b/CMake/cmake_config_files/KI4ALLGPU.config.cmake
@@ -6,7 +6,7 @@
 
 set(CMAKE_CUDA_ARCHITECTURES 80)     # Nvidia Tesla A100
 
-set(GPU_APP "apps/gpu/LBM/")
+set(GPU_APP "apps/gpu/")
 list(APPEND USER_APPS 
     "${GPU_APP}ChannelFlow"
     "${GPU_APP}SphereScaling"
diff --git a/CMake/cmake_config_files/MOLLOK.config.cmake b/CMake/cmake_config_files/MOLLOK.config.cmake
index 72470da1bc52a242cb8e3c341e0e7f87bb06ab26..fac7be0cffc5ff09b8f0b46dbb21af7afb938a66 100644
--- a/CMake/cmake_config_files/MOLLOK.config.cmake
+++ b/CMake/cmake_config_files/MOLLOK.config.cmake
@@ -1,7 +1,7 @@
 #################################################################################
 # VirtualFluids MACHINE FILE
 # Responsible: Martin Schoenherr
-# OS:          Windows 10
+# OS:          Windows 11
 #################################################################################
 
 # cuda compute capability
@@ -12,5 +12,6 @@ set(PATH_NUMERICAL_TESTS "D:/out/numericalTests/")
 list(APPEND VF_COMPILER_DEFINITION "PATH_NUMERICAL_TESTS=${PATH_NUMERICAL_TESTS}")
 
 # add invidual apps here
-list(APPEND USER_APPS "apps/gpu/LBM/WTG_RUB")
-list(APPEND USER_APPS "apps/gpu/LBM/TGV_3D_GridRef")
+list(APPEND USER_APPS "apps/gpu/WTG_RUB")
+list(APPEND USER_APPS "apps/gpu/TGV_3D_GridRef")
+list(APPEND USER_APPS "apps/gpu/SphereRefined")
diff --git a/CMake/cmake_config_files/MULE.config.cmake b/CMake/cmake_config_files/MULE.config.cmake
index 2afbce6cc257fa0b8ff4dd7de580cb50c01369f1..abe277026891774030c9bb6338b94616f54f6f4c 100644
--- a/CMake/cmake_config_files/MULE.config.cmake
+++ b/CMake/cmake_config_files/MULE.config.cmake
@@ -1,4 +1,4 @@
 SET(CMAKE_CUDA_ARCHITECTURES "75")
 
-list(APPEND USER_APPS "apps/gpu/LBM/ActuatorLine")
-list(APPEND USER_APPS "apps/gpu/LBM/SphereScaling")
+list(APPEND USER_APPS "apps/gpu/ActuatorLine")
+list(APPEND USER_APPS "apps/gpu/SphereScaling")
diff --git a/CMake/cmake_config_files/PHOENIX.config.cmake b/CMake/cmake_config_files/PHOENIX.config.cmake
index 2112bd6aa50e9335bc6b23bda0f0e9fda3ef7533..7d0e1d6b6ba2790a2ab24e20d4ab6199ee75d0cf 100644
--- a/CMake/cmake_config_files/PHOENIX.config.cmake
+++ b/CMake/cmake_config_files/PHOENIX.config.cmake
@@ -8,7 +8,7 @@
 ## nvidia
 set(CMAKE_CUDA_ARCHITECTURES 60) # NVIDIA Tesla P100
 
-set(GPU_APP "apps/gpu/LBM/")
+set(GPU_APP "apps/gpu/")
 list(APPEND USER_APPS 
     # "${GPU_APP}DrivenCavityMultiGPU"
     # "${GPU_APP}SphereScaling"
diff --git a/CMake/cmake_config_files/TESLA03.config.cmake b/CMake/cmake_config_files/TESLA03.config.cmake
index e29c7306c5448b97eefed9d7a41871a5e4d3b589..dc0f1253c668dd6fba92c5d1ee33c387af67ee5a 100644
--- a/CMake/cmake_config_files/TESLA03.config.cmake
+++ b/CMake/cmake_config_files/TESLA03.config.cmake
@@ -12,4 +12,4 @@ SET(PATH_NUMERICAL_TESTS "E:/temp/numericalTests/")
 list(APPEND VF_COMPILER_DEFINITION "PATH_NUMERICAL_TESTS=${PATH_NUMERICAL_TESTS}")
 
 # add invidual apps here
-list(APPEND USER_APPS "apps/gpu/LBM/MusselOyster")
+list(APPEND USER_APPS "apps/gpu/MusselOyster")
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d82fe2b93c5103beb6a960ea4bd29914f0d982c4..34edea623975db57b6b3a23b0a1b49721367d67b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -138,6 +138,11 @@ if(BUILD_VF_GPU)
     set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_CUDA_ARCHITECTURES}" CACHE STRING "Cuda Architecture (compute capabilitiy)")
 
     set(CMAKE_CUDA_FLAGS_DEBUG " -G" CACHE STRING "" FORCE)
+
+    # we disable the usage of cuda response files here
+    # usually CUDA_INCLUDES.rsp is genereated by cmake containing all include paths and is passed in compile_commands.json via the --options-file flag
+    # this .rsp file can not be parsed by clangd and therefore we disable it
+    set(CMAKE_CUDA_USE_RESPONSE_FILE_FOR_INCLUDES 0)
 endif()
 
 
@@ -205,7 +210,7 @@ ENDIF()
 
 add_subdirectory(src/logger)
 add_subdirectory(src/basics)
-add_subdirectory(src/mpi)
+add_subdirectory(src/parallel)
 add_subdirectory(src/lbm)
 
 
@@ -216,7 +221,7 @@ if (BUILD_VF_CPU)
     include(cpu.cmake)
 endif()
 if(BUILD_VF_GPU)
-    add_subdirectory(src/cuda)
+    add_subdirectory(src/gpu/cuda_helper)
     include(gpu.cmake)
 endif()
 
diff --git a/Containers/Ubuntu22_04.Dockerfile b/Containers/Ubuntu22_04.Dockerfile
index eff34a26937107a7f5612a598306e83f22de3ab8..8eb107bc5d9ac43c1bcda5b1f638d9f49bcc2c91 100644
--- a/Containers/Ubuntu22_04.Dockerfile
+++ b/Containers/Ubuntu22_04.Dockerfile
@@ -1,7 +1,7 @@
 # VirtualFluids Development Image:
 # Ubuntu 22.04
 
-FROM nvidia/cuda:12.1.1-devel-ubuntu22.04
+FROM nvidia/cuda:12.2.0-devel-ubuntu22.04
 
 # timezone
 ARG TZ
@@ -16,22 +16,25 @@ RUN apt-get update &&   \
     ninja-build         \
     openmpi-bin         \
     libopenmpi-dev      \
-    libomp-15-dev          \
-    clang-15               \
-    clang-format-15        \
-    clang-tidy-15          \
-    clang-tools-15         \
+    libomp-15-dev       \
+    clang-15            \
+    clang-format-15     \
+    clang-tidy-15       \
+    clang-tools-15      \
     python3.11          \
     python3-pip         \
     python3.11-dev      \
     cppcheck            \
-    clangd-12           \
     && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
     && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
     && update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-15 100 \
     && update-alternatives --install /usr/bin/clang clang /usr/bin/clang-15 100 \
     && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 100 \
-    && update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100 \
+    && ln -s clang-tidy-15 /usr/bin/clang-tidy \
+    && ln -s clang-format-15 /usr/bin/clang-format \
+    && wget https://github.com/clangd/clangd/releases/download/16.0.2/clangd-linux-16.0.2.zip && unzip clangd-linux-16.0.2.zip \
+    && mv clangd_16.0.2/bin/clangd /usr/bin/clangd-16 && mv clangd_16.0.2/lib/clang/16 /usr/lib/clang/ \
+    && update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-16 100 \
     && pip3 install      \
         cmake==3.26.3    \
         setuptools       \
diff --git a/Containers/Ubuntu22_04_wiFI.Dockerfile b/Containers/Ubuntu22_04_wiFI.Dockerfile
new file mode 100755
index 0000000000000000000000000000000000000000..105fe9dce0116eb4ad459982a008ba36ed620839
--- /dev/null
+++ b/Containers/Ubuntu22_04_wiFI.Dockerfile
@@ -0,0 +1,14 @@
+# VirtualFluids Development Image:
+# Ubuntu 22.04
+
+FROM git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu22_04:1.1 as build
+
+# For wiFI https://source.coderefinery.org/Hkorb/wifi.git
+RUN pip3 install      \
+    pandas            \
+    cupy-cuda12x      \
+    mpi4py            \
+    && git clone --recurse-submodules https://source.coderefinery.org/Hkorb/wifi.git \
+    && cd wifi  \
+    && git checkout develop \
+    && pip3 install -e . >> log_wifi_install.txt
diff --git a/Python/actuator_line/actuator_line.py b/Python/actuator_line/actuator_line.py
index b8e7efb59673c3b3c9206bfda535bdd1f85e451d..00fa21baeae9d075f4ebeb49baa9d13394ae4b94 100644
--- a/Python/actuator_line/actuator_line.py
+++ b/Python/actuator_line/actuator_line.py
@@ -36,7 +36,7 @@ r"""
 import numpy as np
 from pathlib import Path
 from mpi4py import MPI
-from pyfluids.bindings import basics, gpu, logger
+from pyfluids import basics, gpu, logger, communicator
 #%%
 sim_name = "ABL"
 config_file = Path(__file__).parent/"configActuatorLine.txt"
@@ -47,15 +47,13 @@ output_path.mkdir(exist_ok=True)
 #%%
 logger.Logger.initialize_logger()
 
-#%%
-grid_factory = gpu.grid_generator.GridFactory.make()
-grid_builder = gpu.grid_generator.MultipleGridBuilder.make_shared(grid_factory)
-communicator = gpu.Communicator.get_instance()
+grid_builder = gpu.grid_generator.MultipleGridBuilder()
+communicator = communicator.Communicator.get_instance()
 
 config = basics.ConfigurationFile()
 config.load(str(config_file))
 
-para = gpu.Parameter(communicator.get_number_of_process(), communicator.get_pid(), config)
+para = gpu.Parameter(communicator.get_number_of_processes(), communicator.get_number_of_processes(), config)
 bc_factory = gpu.BoundaryConditionFactory()
 
 #%%
diff --git a/Python/boundary_layer/boundary_layer.py b/Python/boundary_layer/boundary_layer.py
index 0ebdbb43894e6bdae55cca1f788a33c3739fb0c6..d2efffeaca521f23f07fe24a0ad9edfeab675488 100644
--- a/Python/boundary_layer/boundary_layer.py
+++ b/Python/boundary_layer/boundary_layer.py
@@ -36,7 +36,7 @@ r"""
 import numpy as np
 from pathlib import Path
 from mpi4py import MPI
-from pyfluids import basics, gpu, logger
+from pyfluids import basics, gpu, logger, communicator
 #%%
 sim_name = "ABL"
 config_file = Path(__file__).parent/"configBoundaryLayer.txt"
@@ -48,14 +48,13 @@ output_path.mkdir(exist_ok=True)
 logger.Logger.initialize_logger()
 
 #%%
-grid_factory = gpu.grid_generator.GridFactory.make()
-grid_builder = gpu.grid_generator.MultipleGridBuilder.make_shared(grid_factory)
-communicator = gpu.Communicator.get_instance()
+grid_builder = gpu.grid_generator.MultipleGridBuilder()
+communicator = communicator.Communicator.get_instance()
 
 config = basics.ConfigurationFile()
 config.load(str(config_file))
 
-para = gpu.Parameter(communicator.get_number_of_process(), communicator.get_pid(), config)
+para = gpu.Parameter(communicator.get_number_of_processes(), communicator.get_process_id(), config)
 bc_factory = gpu.BoundaryConditionFactory()
 
 #%%
diff --git a/apps/cpu/AcousticPulse/ap.cpp b/apps/cpu/AcousticPulse/ap.cpp
index ac69eee6d2d158a2ea8eea27da8bf968b92f5f06..a04952a35cdb9ba5b55b4ed4dc9fb6225e26f5b7 100644
--- a/apps/cpu/AcousticPulse/ap.cpp
+++ b/apps/cpu/AcousticPulse/ap.cpp
@@ -10,7 +10,7 @@ void run()
 {
    try
    {
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       int    numOfThreads = 4;
diff --git a/apps/cpu/BeadPack/beadpack.cpp b/apps/cpu/BeadPack/beadpack.cpp
index d683fc445359e6e2d19a7d6f72c59158d6bf7f98..3da3030bb618812bc4e37db49683b9b6ce22fd84 100644
--- a/apps/cpu/BeadPack/beadpack.cpp
+++ b/apps/cpu/BeadPack/beadpack.cpp
@@ -23,7 +23,7 @@ void sbonepd(const char *configname)
          throw exceptionText;
       }
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (machine == "BOMBADIL")
diff --git a/apps/cpu/BoxBenchmark/bb.cpp b/apps/cpu/BoxBenchmark/bb.cpp
index 0f0c7d6c1ddd066f36f95d8f87be7afae3ddf2c8..3915f90627d7202c65a797960974b5c6f22ac1e2 100644
--- a/apps/cpu/BoxBenchmark/bb.cpp
+++ b/apps/cpu/BoxBenchmark/bb.cpp
@@ -37,7 +37,7 @@ void run(string configname)
 
       //UbLog::reportingLevel() = UbLog::logLevelFromString("DEBUG3");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/CheckpointConverter/cpc.cpp b/apps/cpu/CheckpointConverter/cpc.cpp
index 4eb526cc75be39153f61cbc4d599a21bcc5394b4..a34e758db522fb3cc72a7bedd6eef6c8cc20a49c 100644
--- a/apps/cpu/CheckpointConverter/cpc.cpp
+++ b/apps/cpu/CheckpointConverter/cpc.cpp
@@ -17,7 +17,7 @@ void run(string configname)
       int    step = config.getValue<int>("step");
       int    numberOfProcesses = config.getValue<int>("numberOfProcesses");
       
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       SPtr<Grid3D> grid(new Grid3D(comm));
diff --git a/apps/cpu/ConvectionOfVortex/cov.cpp b/apps/cpu/ConvectionOfVortex/cov.cpp
index bfe29fc9bb6c18782212f8cb9a080d1815b8c6a1..102a1ad7d16fa7cd343449fd27fab73aae70c92f 100644
--- a/apps/cpu/ConvectionOfVortex/cov.cpp
+++ b/apps/cpu/ConvectionOfVortex/cov.cpp
@@ -12,7 +12,7 @@ void run()
 
    try
    {
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       int    numOfThreads = 4;
diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp
index 112c0c96bd3c9bde56c3ef53f0047569fec031b2..6c7e28f5abba629a7ad9c59204b70fb3d7e03574 100644
--- a/apps/cpu/CouetteFlow/cflow.cpp
+++ b/apps/cpu/CouetteFlow/cflow.cpp
@@ -40,7 +40,7 @@ void bflow(string configname)
 //      double          Re = config.getValue<double>("Re");
 //      double          Bn = config.getValue<double>("Bn");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/DHIT/dhit.cpp b/apps/cpu/DHIT/dhit.cpp
index e06db26b8706bad1f94fec432868daabea8d1cce..3143aa1c8f79ceb4c69aca04bac193025a604392 100644
--- a/apps/cpu/DHIT/dhit.cpp
+++ b/apps/cpu/DHIT/dhit.cpp
@@ -29,7 +29,7 @@ void run(string configname)
       double          lambda = config.getDouble("lambda");
       double          initTime = config.getDouble("initTime");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/DLR-F16-Porous/f16.cpp b/apps/cpu/DLR-F16-Porous/f16.cpp
index 791c1c926dbdf86bf1c2f1634288696248cdb305..08bafaf3df6cdb3c32a3592ea950bd3bc2c42474 100644
--- a/apps/cpu/DLR-F16-Porous/f16.cpp
+++ b/apps/cpu/DLR-F16-Porous/f16.cpp
@@ -95,7 +95,7 @@ void run(string configname)
       
 
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/DLR-F16-Solid/f16.cpp b/apps/cpu/DLR-F16-Solid/f16.cpp
index 2a9893ef28efba2ee163e6e9d8c62ffadd68568a..cf08ef73aac0d8279aa84e62b717700017163a7f 100644
--- a/apps/cpu/DLR-F16-Solid/f16.cpp
+++ b/apps/cpu/DLR-F16-Solid/f16.cpp
@@ -47,7 +47,7 @@ void run(string configname)
       double          timeAvStart       = config.getValue<double>("timeAvStart");
       double          timeAvStop        = config.getValue<double>("timeAvStop");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/DLR-F16/f16.cpp b/apps/cpu/DLR-F16/f16.cpp
index 17fef2d15f4026d4b7035a896d78664350f6b86c..639a73c3863d6e725ad048e44e0f9be12faf3909 100644
--- a/apps/cpu/DLR-F16/f16.cpp
+++ b/apps/cpu/DLR-F16/f16.cpp
@@ -13,7 +13,7 @@ double rangeRandom1()
 
 void setBC(SPtr<Grid3D> grid, string pathGeo, string fngFileWhole, string zigZagTape, vector<double>  boundingBox, double uLB, double rhoLB, double blockLength, SPtr<BCProcessor> bcProcessor)
 {
-   SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+   SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
    int myid = comm->getProcessID();
    
    std::vector<std::vector<SPtr<Block3D>> > blockVector;
@@ -205,7 +205,7 @@ void run(string configname)
       int             chunk = config.getValue<int>("chunk");
 
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/FallingSphere/FallingSphere.cpp b/apps/cpu/FallingSphere/FallingSphere.cpp
index 4b1a1825551f38359428f8b6f60dff08abadf042..f41524a5f6f5b163c6eaefeb386b9a76b892d196 100644
--- a/apps/cpu/FallingSphere/FallingSphere.cpp
+++ b/apps/cpu/FallingSphere/FallingSphere.cpp
@@ -11,9 +11,7 @@ using namespace std;
 
 int main(int argc, char *argv[])
 {
-    Sleep(30000);
-
-    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+    std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
     int myid                                        = comm->getProcessID();
 
 
diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp b/apps/cpu/FlowAroundCylinder/cylinder.cpp
index 5956a48a8bdf08d11047400f25302005d080d872..3e5be5e080a5702e9608bf037d492b8cbc809dfc 100644
--- a/apps/cpu/FlowAroundCylinder/cylinder.cpp
+++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp
@@ -35,7 +35,7 @@ void run(string configname)
       vector<int>     blockNx = config.getVector<int>("blockNx");
       real          dx = config.getValue<real>("dx");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp.old b/apps/cpu/FlowAroundCylinder/cylinder.cpp.old
index f251ee63514c67cca6df0e998cc196d3cc5a9ec8..774ed812b5fab63538a56744ddd41a2611eadc72 100644
--- a/apps/cpu/FlowAroundCylinder/cylinder.cpp.old
+++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp.old
@@ -15,7 +15,7 @@ void run(const char *cstr)
       int numOfThreads = 1;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "BOMBADIL") 
@@ -385,7 +385,7 @@ void run2(const char *cstr)
       int numOfThreads = 1;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "BOMBADIL") 
diff --git a/apps/cpu/Hagen_Poiseuille_flow/pflow.cpp b/apps/cpu/Hagen_Poiseuille_flow/pflow.cpp
index 5d5e47fddeecaf06b3b23590833ff2dc12d610fb..e7f7bb84a4dece690ea0e93cc2d07b6cdd8932d2 100644
--- a/apps/cpu/Hagen_Poiseuille_flow/pflow.cpp
+++ b/apps/cpu/Hagen_Poiseuille_flow/pflow.cpp
@@ -29,7 +29,7 @@ using namespace std;
 //      double          deltax = config.getDouble("deltax");
 //
 //
-//      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+//      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
 //      int myid = comm->getProcessID();
 //
 //      if (logToFile)
@@ -322,7 +322,7 @@ void pflowdp(string configname)
       double          cpStepStart = config.getValue<double>("cpStepStart");
       bool            newStart = config.getValue<bool>("newStart");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       LBMReal rhoLB = 0.0;
diff --git a/apps/cpu/Hagen_Poiseuille_flow2/pflow2.cpp b/apps/cpu/Hagen_Poiseuille_flow2/pflow2.cpp
index f298d697f554f002f42438955ecbb3a3308ed219..e278fcb78fddc4f5606256a6805dbda4e344a19d 100644
--- a/apps/cpu/Hagen_Poiseuille_flow2/pflow2.cpp
+++ b/apps/cpu/Hagen_Poiseuille_flow2/pflow2.cpp
@@ -29,7 +29,7 @@ void pflowdp(string configname)
       double          deltax = config.getValue<double>("deltax");
 
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       LBMReal rhoLB = 0.0;
diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
index 6abe6b5c55ce3fb3c54d5dd169a06b47026b9b3e..67ed5404eebc1eeffe1e385ff42dc806c1588301 100644
--- a/apps/cpu/HerschelBulkleyModel/hbflow.cpp
+++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
@@ -41,7 +41,7 @@ void bflow(string configname)
 //      double          Bn = config.getValue<double>("Bn");
       real          scaleFactor = config.getValue<real>("scaleFactor");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
index 221b106123b5fadffcf60427481800ef0d673b76..90ae44b62f18e412c4f3e0bd8ba88de56b01650a 100644
--- a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
+++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
@@ -38,7 +38,7 @@ void bflow(string configname)
       real          Bn = config.getValue<real>("Bn");
       vector<real>  sphereCenter = config.getVector<real>("sphereCenter");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/InterfaceTest/itest.cpp b/apps/cpu/InterfaceTest/itest.cpp
index 723802f6d3160dd79c28c2347ed311d360020d77..e8c93d4e5b3698b75964d63de0c18780a4566552 100644
--- a/apps/cpu/InterfaceTest/itest.cpp
+++ b/apps/cpu/InterfaceTest/itest.cpp
@@ -11,7 +11,7 @@ void run()
 {
    try
    {
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       int    numOfThreads = 4;
diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp.new b/apps/cpu/JetBreakup/JetBreakup.cpp.new
index 953a8dee8caf0e7972b79138c8480f1883ebdfec..1c03deebdc1c6bfa195735c2cdf1dbb4ba0a8212 100644
--- a/apps/cpu/JetBreakup/JetBreakup.cpp.new
+++ b/apps/cpu/JetBreakup/JetBreakup.cpp.new
@@ -58,7 +58,7 @@ void run(string configname)
 
         int caseN = config.getValue<int>("case");
 
-        SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
         int myid = comm->getProcessID();
 
         if (myid == 0)
diff --git a/apps/cpu/LaminarTubeFlow/ltf.cpp b/apps/cpu/LaminarTubeFlow/ltf.cpp
index 315bee6f263b3d5395499c0ed925c3790d7bfcdf..53927b7378db9bfca0693c1808610e0d6b532d66 100644
--- a/apps/cpu/LaminarTubeFlow/ltf.cpp
+++ b/apps/cpu/LaminarTubeFlow/ltf.cpp
@@ -33,7 +33,7 @@ void run(string configname)
       real          cpStep = config.getValue<real>("cpStep");
       bool            newStart = config.getValue<bool>("newStart");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/LaminarTubeFlowConv/ltf.cpp b/apps/cpu/LaminarTubeFlowConv/ltf.cpp
index 53cd7c1ac7900118f47e483f867d22de2e3e7974..d7515d44bfd135d95a103aa758f38e376421b01c 100644
--- a/apps/cpu/LaminarTubeFlowConv/ltf.cpp
+++ b/apps/cpu/LaminarTubeFlowConv/ltf.cpp
@@ -30,7 +30,7 @@ void run(int tn)
       int numOfThreads = 1;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "BOMBADIL") 
diff --git a/apps/cpu/LidDrivenCavity/LidDrivenCavity.cpp b/apps/cpu/LidDrivenCavity/LidDrivenCavity.cpp
index 1819ee0f6fe00191f28ddfcab8cce93466047289..01d6262c299f8f49e1e3cfd62ba1d9c39b127080 100644
--- a/apps/cpu/LidDrivenCavity/LidDrivenCavity.cpp
+++ b/apps/cpu/LidDrivenCavity/LidDrivenCavity.cpp
@@ -80,7 +80,7 @@ int main(int  /*argc*/, char*  /*argv*/[])
       double g_maxX3 = 0.5;
 
       // NullCommunicator is a place-holder for interprocess communication
-      SPtr<vf::mpi::Communicator> comm = NullCommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = NullCommunicator::getInstance();
       // new grid object
       SPtr<Grid3D> grid(new Grid3D(comm));
       // set grid spacing
diff --git a/apps/cpu/LiggghtsApp/LiggghtsApp.cpp b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
index 969243a0516871033c9c4d001d92468dc0164e8c..5b3f27d2ef7f64fc692750d8480dafea4a69a030 100644
--- a/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
+++ b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
@@ -19,7 +19,7 @@ int main(int argc, char *argv[])
 {
     //Sleep(30000);
 
-    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+    std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
     int myid                                        = comm->getProcessID();
 
 
diff --git a/apps/cpu/Multiphase/Multiphase (Droplet Test).cpp.backup b/apps/cpu/Multiphase/Multiphase (Droplet Test).cpp.backup
index b783a354fd39f66ba82383f2387daf92ecbde758..c0ca32e5ce1980af048c769e01aca95c1df9f0dd 100644
--- a/apps/cpu/Multiphase/Multiphase (Droplet Test).cpp.backup	
+++ b/apps/cpu/Multiphase/Multiphase (Droplet Test).cpp.backup	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/Multiphase (Jet breakup on Phoenix).cpp.backup b/apps/cpu/Multiphase/Multiphase (Jet breakup on Phoenix).cpp.backup
index ebf91e6cb54f1a067535ae512f85e706a2d88980..d43a61d6767b4193f443bcb1fede89cf3f37bc5f 100644
--- a/apps/cpu/Multiphase/Multiphase (Jet breakup on Phoenix).cpp.backup	
+++ b/apps/cpu/Multiphase/Multiphase (Jet breakup on Phoenix).cpp.backup	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/Multiphase.cpp b/apps/cpu/Multiphase/Multiphase.cpp
index 79d969dd93c5bd87b0d327f5275d2c6b9a8a1448..07b5a661f2c6ead2c57d09b2c05869f86058d1ad 100644
--- a/apps/cpu/Multiphase/Multiphase.cpp
+++ b/apps/cpu/Multiphase/Multiphase.cpp
@@ -55,7 +55,7 @@ void run(string configname)
         real beta = 12 * sigma / interfaceWidth;
         real kappa = 1.5 * interfaceWidth * sigma;
 
-        SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
         int myid                = comm->getProcessID();
 
         if (myid == 0)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (Droplet Test).cpp b/apps/cpu/Multiphase/backup/Multiphase (Droplet Test).cpp
index e6efac95353e04e93aae0a9dfcde0422259a2832..868b4abfa15b990cfdb418066efda3a7e3c8f91c 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (Droplet Test).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (Droplet Test).cpp	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (Final before automation).cpp b/apps/cpu/Multiphase/backup/Multiphase (Final before automation).cpp
index 61d37660015ae6b6134e6d30c83010f75ec362e6..4b51783592d1ce6f89498313424d342b0766b289 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (Final before automation).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (Final before automation).cpp	
@@ -67,7 +67,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (Flow Focusing).cpp b/apps/cpu/Multiphase/backup/Multiphase (Flow Focusing).cpp
index 32548c12b0d559928bf789cd2187cb180213dc65..c79270b365d36b1b2a5c89f14ab9408592a1ecc4 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (Flow Focusing).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (Flow Focusing).cpp	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (Jet breakup on Phoenix).cpp b/apps/cpu/Multiphase/backup/Multiphase (Jet breakup on Phoenix).cpp
index ebf91e6cb54f1a067535ae512f85e706a2d88980..d43a61d6767b4193f443bcb1fede89cf3f37bc5f 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (Jet breakup on Phoenix).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (Jet breakup on Phoenix).cpp	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (T-Junction).cpp b/apps/cpu/Multiphase/backup/Multiphase (T-Junction).cpp
index 93844c4a2f9068debe7759943efb3243da923703..c213e6366119e8cbb8ca0db20e387b07a642c758 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (T-Junction).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (T-Junction).cpp	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (Thermal).cpp b/apps/cpu/Multiphase/backup/Multiphase (Thermal).cpp
index 68e07b43c2cfff23affee121f9d8b39997d0fd8d..4f5417397da1fc043e466f1901ccd727b8831ca4 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (Thermal).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (Thermal).cpp	
@@ -51,7 +51,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase (Tube).cpp b/apps/cpu/Multiphase/backup/Multiphase (Tube).cpp
index 492a906b816129de271189ab8d35fe1a4d180b56..84de9055d3024be2409b12afed7540b38b057bc1 100644
--- a/apps/cpu/Multiphase/backup/Multiphase (Tube).cpp	
+++ b/apps/cpu/Multiphase/backup/Multiphase (Tube).cpp	
@@ -42,7 +42,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Multiphase/backup/Multiphase.cpp b/apps/cpu/Multiphase/backup/Multiphase.cpp
index b029e35277729803df53fb0d79d025863e21719b..8a7708c05f1af35028518aa0ca061fc81f3f3de6 100644
--- a/apps/cpu/Multiphase/backup/Multiphase.cpp
+++ b/apps/cpu/Multiphase/backup/Multiphase.cpp
@@ -78,7 +78,7 @@ void run(string configname)
       double beta  = 12*sigma/interfaceThickness;
 	  double kappa = 1.5*interfaceThickness*sigma;
 	  
-	  CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+	  CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp
index 088d60dbdc110d1e86f1765d9c96da4dfda2a98c..1ae1d18996dfd0e3ae7854e349631ed141cbbc58 100644
--- a/apps/cpu/MultiphaseDropletTest/droplet.cpp
+++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp
@@ -52,7 +52,7 @@ void run(string configname)
         bool newStart      = config.getValue<bool>("newStart");
         //double rStep = config.getValue<double>("rStep");
 
-        SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
         int myid                = comm->getProcessID();
 
         if (myid == 0)
diff --git a/apps/cpu/Nozzle/nozzle.cpp.1 b/apps/cpu/Nozzle/nozzle.cpp.1
index 0feddc57b709be57c05000da0ef8075b6941b8c0..57bac14e13ce30981e2572d5570e869eab1f253f 100644
--- a/apps/cpu/Nozzle/nozzle.cpp.1
+++ b/apps/cpu/Nozzle/nozzle.cpp.1
@@ -18,7 +18,7 @@ int main(int argc, char *argv[])
 
     try {
 
-        std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
         int myid = comm->getProcessID();
 
         // bounding box
diff --git a/apps/cpu/OrganPipe/OrganPipe.cpp b/apps/cpu/OrganPipe/OrganPipe.cpp
index b23c159110dce4d1415f4a558d9cd1910e0c2de4..98b8c25050ba459c795ea22b3005686755e69077 100644
--- a/apps/cpu/OrganPipe/OrganPipe.cpp
+++ b/apps/cpu/OrganPipe/OrganPipe.cpp
@@ -8,7 +8,7 @@ void run(string configname)
 {
    try
    {
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (myid == 0) UBLOG(logINFO, "Testcase organ pipe");
diff --git a/apps/cpu/PlateWithPorousInlay/plate.cpp b/apps/cpu/PlateWithPorousInlay/plate.cpp
index 315bacfa954640c8963ef46c3a7c840280a69e06..0334da7c3410cba9f92a2c2396c9702db429c510 100644
--- a/apps/cpu/PlateWithPorousInlay/plate.cpp
+++ b/apps/cpu/PlateWithPorousInlay/plate.cpp
@@ -52,7 +52,7 @@ void run(const char *cstr)
       stringstream logFilename;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr);
diff --git a/apps/cpu/PoiseuilleFlow/pf1.cpp b/apps/cpu/PoiseuilleFlow/pf1.cpp
index 0e21dea4d252dc141fa5fd75feebe24c0b80042d..dffd5fde6c71dfd0ab647cee2c3e6ee1a81455d0 100644
--- a/apps/cpu/PoiseuilleFlow/pf1.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf1.cpp
@@ -9,7 +9,7 @@ void pf1()
 {
     using namespace vf::lbm::dir;
 
-   SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+   SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
    int myid = comm->getProcessID();
 
    //parameters
diff --git a/apps/cpu/PoiseuilleFlow/pf2.cpp b/apps/cpu/PoiseuilleFlow/pf2.cpp
index c339e06a6c9cac71b4ba9d340ef72027fd999f41..7990d19690f048f444ff234a00557b22f9f5e86f 100644
--- a/apps/cpu/PoiseuilleFlow/pf2.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf2.cpp
@@ -6,7 +6,7 @@
 ////pipe flow with pressure drop
 //void pf2()
 //{
-//   SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+//   SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
 //   int myid = comm->getProcessID();
 //
 //   //parameters
diff --git a/apps/cpu/PoiseuilleFlow/pf3.cpp b/apps/cpu/PoiseuilleFlow/pf3.cpp
index fa01b68521fadb59c4101a82caef30377b3368fc..0442b1c67663f91abb39350cc4287a62efa95e74 100644
--- a/apps/cpu/PoiseuilleFlow/pf3.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf3.cpp
@@ -6,7 +6,7 @@
 ////two plates flow with forcing
 //void pf3()
 //{
-//   SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+//   SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
 //   int myid = comm->getProcessID();
 //
 //   //parameters
diff --git a/apps/cpu/PoiseuilleFlow/pf4.cpp b/apps/cpu/PoiseuilleFlow/pf4.cpp
index 2e419358e1d5b32ea0f9fc542f8d47b80aa6cae8..9568cdd619dec4a6585de167ca2234894962ef10 100644
--- a/apps/cpu/PoiseuilleFlow/pf4.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf4.cpp
@@ -6,7 +6,7 @@
 ////two plates flow with pressure drop
 //void pf4()
 //{
-//   SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+//   SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
 //   int myid = comm->getProcessID();
 //
 //   //parameters
diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
index 0fb06bc257eeabb692fe6777349db903a74599ca..90c912152f7e3cfbc8cf27a8d7170ca74ae71919 100644
--- a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
+++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
@@ -52,7 +52,7 @@ void run(string configname)
         bool newStart = config.getValue<bool>("newStart");
         // double rStep = config.getValue<double>("rStep");
 
-        std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
         int myid = comm->getProcessID();
 
         if (myid == 0) UBLOG(logINFO, "2D Rising Bubble: Start!");
diff --git a/apps/cpu/TPMSRow/TPMSRow.cpp b/apps/cpu/TPMSRow/TPMSRow.cpp
index 596b79d0525339d38ee18a3062a219459de8f305..09be56c68ed6cc0db2d911b19a21feae2c890d80 100644
--- a/apps/cpu/TPMSRow/TPMSRow.cpp
+++ b/apps/cpu/TPMSRow/TPMSRow.cpp
@@ -47,7 +47,7 @@ void run(string configname)
         bool newStart               = config.getValue<bool>("newStart");
 
         //SPtr<Communicator> comm = MPICommunicator::getInstance();
-        SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
         int myid                = comm->getProcessID();
         //int numOfProcesses      = comm->getNumberOfProcesses();
 
diff --git a/apps/cpu/ViskomatXL/viskomat.cpp b/apps/cpu/ViskomatXL/viskomat.cpp
index 327f25e599c80b059fe273cfd2a0c526ed4279f7..7db98670e2325825a76b60559d09d818838f9430 100644
--- a/apps/cpu/ViskomatXL/viskomat.cpp
+++ b/apps/cpu/ViskomatXL/viskomat.cpp
@@ -40,7 +40,7 @@ void bflow(string configname)
 
       vf::basics::ConfigurationFile   viscosity;
 
-      std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/Wing/wing.cpp b/apps/cpu/Wing/wing.cpp
index ff6cbcfcab3b60669aea19ca6a56077034f0e7dc..d7e4cd77057f3edb63432b25e50aecc285734a7e 100644
--- a/apps/cpu/Wing/wing.cpp
+++ b/apps/cpu/Wing/wing.cpp
@@ -30,7 +30,7 @@ void setup(const char *cstr1, const char *cstr2)
       int refineLevel = UbSystem::stringTo<int>(cf.getValue("refineLevel"));
       int blocknx = UbSystem::stringTo<int>(cf.getValue("blocknx"));
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "Bombadil") int dumy=0; 
diff --git a/apps/cpu/aperm/aperm.cpp b/apps/cpu/aperm/aperm.cpp
index 7591afe4d31c3b0c75097dd44a31477e852dbb00..44b48bb3cfd4038da8be18bfa1a0328edb7cb570 100644
--- a/apps/cpu/aperm/aperm.cpp
+++ b/apps/cpu/aperm/aperm.cpp
@@ -59,7 +59,7 @@ void run(string configname)
       double          cpStepStart = config.getDouble("cpStepStart");
       bool            newStart = config.getValue<bool>("newStart");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/aperm/aperm.cpp.old b/apps/cpu/aperm/aperm.cpp.old
index fd6f916d8155eda8719b3c8cf3382af513206989..3776c454f75d0510a6ec4f033d25f35aa82618d4 100644
--- a/apps/cpu/aperm/aperm.cpp.old
+++ b/apps/cpu/aperm/aperm.cpp.old
@@ -58,7 +58,7 @@ void run(string configname)
       bool            yDir = config.getBool("yDir");
       bool            zDir = config.getBool("zDir");
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/aperm/aperm.cpp.old2 b/apps/cpu/aperm/aperm.cpp.old2
index 8f0cf83e2f8ae1731dd0e76dccb4a50bddc00ba5..ece4410e92f4ac587391ed0921400c4110cfb921 100644
--- a/apps/cpu/aperm/aperm.cpp.old2
+++ b/apps/cpu/aperm/aperm.cpp.old2
@@ -55,7 +55,7 @@ void run(string configname)
       bool            yDir = config.getBool("yDir");
       bool            zDir = config.getBool("zDir");
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/bChannelA/bChannelA.cpp b/apps/cpu/bChannelA/bChannelA.cpp
index 01725f2a3b883c0c0a53c6578dc581eadb0c8dc5..a59d829c35e6d1211d206439803c732f832831b2 100644
--- a/apps/cpu/bChannelA/bChannelA.cpp
+++ b/apps/cpu/bChannelA/bChannelA.cpp
@@ -111,7 +111,7 @@ void run(string configname)
       vector<double>  nupsStep          = config.getVector<double>("nupsStep");
       vector<double>  boundingBox       = config.getVector<double>("boundingBox");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/bChannelVA/bChannelVA.cpp b/apps/cpu/bChannelVA/bChannelVA.cpp
index 6cfe5dac2557f167864495599074cd3c94da6517..363d02697f0fde6ff18736b07e09e1ac3310bea7 100644
--- a/apps/cpu/bChannelVA/bChannelVA.cpp
+++ b/apps/cpu/bChannelVA/bChannelVA.cpp
@@ -13,7 +13,7 @@ int main(int argc, char* argv[])
    try
    {
       //Sleep(20000);
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       //Pheonix
diff --git a/apps/cpu/bKanal/HLRNb/bKanal.cpp b/apps/cpu/bKanal/HLRNb/bKanal.cpp
index 0c5c46a0cb78354563425685c8346ff81258ccd2..99b21eabf2a3c11b325fc3727e5acb795b394dfc 100644
--- a/apps/cpu/bKanal/HLRNb/bKanal.cpp
+++ b/apps/cpu/bKanal/HLRNb/bKanal.cpp
@@ -27,7 +27,7 @@ void run(const char *cstr)
 
       UbLog::reportingLevel() = logINFO;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
 
diff --git a/apps/cpu/bKanal/bKanal.cpp b/apps/cpu/bKanal/bKanal.cpp
index 94af8f6aa46ddf5f398747805836ba95ce1dbbaf..33994ad706dc50ec1f1532f2b6b31fec84f4a520 100644
--- a/apps/cpu/bKanal/bKanal.cpp
+++ b/apps/cpu/bKanal/bKanal.cpp
@@ -24,7 +24,7 @@ void run(const char *cstr)
 
       UbLog::reportingLevel() = logINFO;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr);
diff --git a/apps/cpu/bKanal/sKanal/bKanal.cpp b/apps/cpu/bKanal/sKanal/bKanal.cpp
index 6a9d3c2c697b04c176bc9c11aa38f7f719e07785..1048554fb5ffc1e91abc97cf2bbf7f4133533063 100644
--- a/apps/cpu/bKanal/sKanal/bKanal.cpp
+++ b/apps/cpu/bKanal/sKanal/bKanal.cpp
@@ -27,7 +27,7 @@ void run(const char *cstr)
 
       UbLog::reportingLevel() = logINFO;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "PIPPINNEU") 
diff --git a/apps/cpu/bKanal2/bKanal2.cpp b/apps/cpu/bKanal2/bKanal2.cpp
index 10e6f988085244e2028f28fca4129bc354c49699..ec632612596d14a747b48500d7436bbf4876f081 100644
--- a/apps/cpu/bKanal2/bKanal2.cpp
+++ b/apps/cpu/bKanal2/bKanal2.cpp
@@ -24,7 +24,7 @@ void run(const char *cstr)
 
       UbLog::reportingLevel() = logINFO;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr);
diff --git a/apps/cpu/bKanalAv/bKanal.cpp b/apps/cpu/bKanalAv/bKanal.cpp
index 71ca1ed0464afd67adf8db473ccdbf9487b8acda..27bf3c1a61f1d429e60a057a74479ad306098826 100644
--- a/apps/cpu/bKanalAv/bKanal.cpp
+++ b/apps/cpu/bKanalAv/bKanal.cpp
@@ -27,7 +27,7 @@ void run(const char *cstr)
 
       UbLog::reportingLevel() = logINFO;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
 
diff --git a/apps/cpu/band/band.cpp b/apps/cpu/band/band.cpp
index 370e50341662d21f25407cec428b1c20ee543a37..b454ff1284bbb1d64d657e9c87a51be2cbf06d66 100644
--- a/apps/cpu/band/band.cpp
+++ b/apps/cpu/band/band.cpp
@@ -20,7 +20,7 @@ void run(const char *cstr)
 
       //UbLog::reportingLevel() = logDEBUG5;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr);
diff --git a/apps/cpu/bbone/bbone.cpp b/apps/cpu/bbone/bbone.cpp
index 3eb6c827c6157c4dc6810ffaab402e3e51337c93..558ff4c9848bac363e4e01ad94fcd450745ea3de 100644
--- a/apps/cpu/bbone/bbone.cpp
+++ b/apps/cpu/bbone/bbone.cpp
@@ -33,7 +33,7 @@ void sbonepd(string configname)
       bool            logToFile         = config.getBool("logToFile");
       double          deltaT            = config.getDouble("deltaT");
       
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/block_test/block_test_incompressible.hpp b/apps/cpu/block_test/block_test_incompressible.hpp
index 2ce506c93f4611a3069140703e712dbcca7fe661..61b8d762bdf727816f07833c30e02e86e02c2c20 100644
--- a/apps/cpu/block_test/block_test_incompressible.hpp
+++ b/apps/cpu/block_test/block_test_incompressible.hpp
@@ -29,7 +29,7 @@ void block_test_incompressible(const char *cstr1, const char *cstr2)
       int numOfThreads = UbSystem::stringTo<int>(cf.getValue("numOfThreads"));
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "BOMBADIL") 
diff --git a/apps/cpu/bond_benchmark/bonb_b_chanel.cpp b/apps/cpu/bond_benchmark/bonb_b_chanel.cpp
index b5e63c50d5a9ba91abb872319a7e68de9df28b97..7df5a016279b60337a5a24b4c3a5241d7f0555b9 100644
--- a/apps/cpu/bond_benchmark/bonb_b_chanel.cpp
+++ b/apps/cpu/bond_benchmark/bonb_b_chanel.cpp
@@ -29,7 +29,7 @@ void chanel(const char *cstr)
 
       string comm_type = cf.getValue("comm");
       if(comm_type == "MPI")
-         comm = vf::mpi::MPICommunicator::getInstance();
+         comm = vf::parallel::MPICommunicator::getInstance();
       else if(comm_type == "BOND")
          comm = BondCommunicator::getInstance();
       
diff --git a/apps/cpu/bond_benchmark/bond_b.cpp b/apps/cpu/bond_benchmark/bond_b.cpp
index 6d607811a21f4dc111f6b003bf9343c60973207c..e3924595d89afd1f81cd4dde159f42a569e0cd01 100644
--- a/apps/cpu/bond_benchmark/bond_b.cpp
+++ b/apps/cpu/bond_benchmark/bond_b.cpp
@@ -35,7 +35,7 @@ void periodic(const char *cstr1, const char *cstr2)
 
       string comm_type = cf.getValue("comm");
       if(comm_type == "MPI")
-         comm = vf::mpi::MPICommunicator::getInstance();
+         comm = vf::parallel::MPICommunicator::getInstance();
       else if(comm_type == "BOND")
          comm = BondCommunicator::getInstance();
 
diff --git a/apps/cpu/bond_test/bond_test.cpp b/apps/cpu/bond_test/bond_test.cpp
index b7091184ff789dd6ac56e8c085853e5a45c088a0..fd77c285f540034b8c1d432097c45d9d0c6e9a7c 100644
--- a/apps/cpu/bond_test/bond_test.cpp
+++ b/apps/cpu/bond_test/bond_test.cpp
@@ -153,7 +153,7 @@ void simulation(const char *cstr)
       CommunicatorPtr comm;
       string comm_type = cf.getValue("comm");
       if(comm_type == "MPI")
-         comm = vf::mpi::MPICommunicator::getInstance();
+         comm = vf::parallel::MPICommunicator::getInstance();
       else if(comm_type == "BOND")
          comm = BondCommunicator::getInstance();
 
diff --git a/apps/cpu/bone/bone.cpp b/apps/cpu/bone/bone.cpp
index 849241ba26fc515ca2ee4ac3bd127742c0c693e5..17d0eca37975fa2cee87aa87f815d7237673111d 100644
--- a/apps/cpu/bone/bone.cpp
+++ b/apps/cpu/bone/bone.cpp
@@ -18,7 +18,7 @@ void run(const char *cstr1, const char *cstr2)
       stringstream logFilename;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr1);
diff --git a/apps/cpu/f16Test/f16test.cpp b/apps/cpu/f16Test/f16test.cpp
index 2360d962a59015c0c73d869cd97a68d65d3afeee..32f424bdbcd8c2fa9f9596147757dc63f2c0b684 100644
--- a/apps/cpu/f16Test/f16test.cpp
+++ b/apps/cpu/f16Test/f16test.cpp
@@ -42,7 +42,7 @@ void run(string configname)
       double          refineDistance = config.getDouble("refineDistance");
       vector<double>  nupsStep = config.getVector<double>("nupsStep");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/insitu_demo/insitu_demo.cpp b/apps/cpu/insitu_demo/insitu_demo.cpp
index 42a1c6b4c636801bbaa50a1027751cd88301edfb..bd5f150191f2b9a63a1b7532d8f91b8f068d089a 100644
--- a/apps/cpu/insitu_demo/insitu_demo.cpp
+++ b/apps/cpu/insitu_demo/insitu_demo.cpp
@@ -15,7 +15,7 @@ void chanel(const char *cstr1)
       double availMem = 0;
 
       //CommunicatorPtr comm = FETOLCommunicator::getInstance();
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
 
       int myid = comm->getProcessID();
       int mybundle = comm->getBundleID();
diff --git a/apps/cpu/levels/levels.cpp b/apps/cpu/levels/levels.cpp
index a5ac8588023b76b3043d333e6056426147fa4689..10672abe42441f69e9536fb78e54efb01503264e 100644
--- a/apps/cpu/levels/levels.cpp
+++ b/apps/cpu/levels/levels.cpp
@@ -14,7 +14,7 @@ void run(string configname)
 
       string machine = QUOTEME(CAB_MACHINE);
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
 
       int myid = comm->getProcessID();
       int mybundle = comm->getBundleID();
diff --git a/apps/cpu/micropart/micropartTestQs3.hpp b/apps/cpu/micropart/micropartTestQs3.hpp
index 14e9a84412a51548b91f668369029afd057241c5..d8c870269b42929d5844bb516c79d091d6ab40ad 100644
--- a/apps/cpu/micropart/micropartTestQs3.hpp
+++ b/apps/cpu/micropart/micropartTestQs3.hpp
@@ -9,7 +9,7 @@ void micropartTestQs3(const char *cstr)
 {
    try
    {
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
       int numprocs = comm->getNumberOfProcesses();
 
diff --git a/apps/cpu/mirror/mirror.cpp b/apps/cpu/mirror/mirror.cpp
index b85d9b249ba60e10584d00ba95eda73da915ef5b..99ba78ff170513b6b8e92681b203f74dbc44e7d8 100644
--- a/apps/cpu/mirror/mirror.cpp
+++ b/apps/cpu/mirror/mirror.cpp
@@ -49,7 +49,7 @@ void run(string configname)
       string          VRES1100_Spiegel_fein = config.getValue<string>("VRES1100_Spiegel_fein");
 
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/mpi_benchmark/mpib.cpp b/apps/cpu/mpi_benchmark/mpib.cpp
index 797efbc7ed5ea87b31b30cfc3b6258a239fbd5d2..8ddf7bde30aaaf2f6707e3ac53e577919c546f40 100644
--- a/apps/cpu/mpi_benchmark/mpib.cpp
+++ b/apps/cpu/mpi_benchmark/mpib.cpp
@@ -8,7 +8,7 @@ using namespace std;
 
 void run(string configname)
 {
-   SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+   SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
    int myid = comm->getProcessID();
 
    // Get the name of the processor
diff --git a/apps/cpu/pChannel/pChannel.cpp b/apps/cpu/pChannel/pChannel.cpp
index 72292679f3ef53eaf81e1f26fa54659f5b002584..d30b28d262fa8d09c1658452eb11496b5c5c61f9 100644
--- a/apps/cpu/pChannel/pChannel.cpp
+++ b/apps/cpu/pChannel/pChannel.cpp
@@ -206,7 +206,7 @@ void run(string configname)
       vector<double>  nupsStep          = config.getVector<double>("nupsStep");
       vector<double>  boundingBox       = config.getVector<double>("boundingBox");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/pChannel/pChannel.cpp.hlrn b/apps/cpu/pChannel/pChannel.cpp.hlrn
index f25a0c4c2e62d6b2b97ff338d567ef911bdc9d14..812566c96d046cf9da9b72bd388ce0696224df7b 100644
--- a/apps/cpu/pChannel/pChannel.cpp.hlrn
+++ b/apps/cpu/pChannel/pChannel.cpp.hlrn
@@ -52,7 +52,7 @@ void run(string configname)
       double          timeLineTsStop    = config.getDouble("timeLineTsStop");
 
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/pDisk/pdisk.cpp b/apps/cpu/pDisk/pdisk.cpp
index f19e04ff81222e7eb448c1f0236669fb824fad23..fed4f38b64eb8fa8471fc9e0c389fe40f77ffd4a 100644
--- a/apps/cpu/pDisk/pdisk.cpp
+++ b/apps/cpu/pDisk/pdisk.cpp
@@ -39,7 +39,7 @@ void run(string configname)
 
       //UbLog::reportingLevel() = logDEBUG5;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
 
diff --git a/apps/cpu/perm/perm.cpp b/apps/cpu/perm/perm.cpp
index ff0af00b8d10af2715542aaee8adf53abf633db4..4ea9ac93742da1bc65cd266d028bd09bcc195811 100644
--- a/apps/cpu/perm/perm.cpp
+++ b/apps/cpu/perm/perm.cpp
@@ -44,7 +44,7 @@ void perm(string configname)
       double          deltax = config.getValue<double>("deltax");
       bool            writeSampleToFile = config.getValue<bool>("writeSampleToFile");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/perm/perm.cpp_s b/apps/cpu/perm/perm.cpp_s
index 21db434d5290ee948665f45af8ae1c93a84d9336..e40c55fbf49d157433822462cfa5e0cfec9636a6 100644
--- a/apps/cpu/perm/perm.cpp_s
+++ b/apps/cpu/perm/perm.cpp_s
@@ -23,7 +23,7 @@ void perm(const char *configname)
          throw exceptionText;
       }
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (machine == "BOMBADIL")
diff --git a/apps/cpu/plate/plate.cpp b/apps/cpu/plate/plate.cpp
index 28db0262fa649ea93f8b44cf69821557ad53961e..e4c78c6044106280732f151f9610e3791ff502a4 100644
--- a/apps/cpu/plate/plate.cpp
+++ b/apps/cpu/plate/plate.cpp
@@ -25,7 +25,7 @@ void run(const char *cstr, double endTime)
 
       //UbLog::reportingLevel() = logDEBUG5;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr);
diff --git a/apps/cpu/plate2/plate2.cpp b/apps/cpu/plate2/plate2.cpp
index a908abf5b3652dcdd24c44202950f4962351c735..1fd5a281ebae6906ae7706735d32b4aedbbe8199 100644
--- a/apps/cpu/plate2/plate2.cpp
+++ b/apps/cpu/plate2/plate2.cpp
@@ -18,7 +18,7 @@ void run(const char *cstr1, const char *cstr2)
       stringstream logFilename;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr1);
diff --git a/apps/cpu/poiseuille_example/poiseuille.cpp b/apps/cpu/poiseuille_example/poiseuille.cpp
index 52fede221deb1dd8ffa800fae711ff8517895054..d2e2c178e247f69d1629374661da9746ad8542bc 100644
--- a/apps/cpu/poiseuille_example/poiseuille.cpp
+++ b/apps/cpu/poiseuille_example/poiseuille.cpp
@@ -25,7 +25,7 @@ int main()
     const auto lbmUnitConverter = std::make_shared<LBMUnitConverter>();
     const auto writer = WbWriterVtkXmlBinary::getInstance();
 
-    const auto communicator = vf::mpi::MPICommunicator::getInstance();
+    const auto communicator = vf::parallel::MPICommunicator::getInstance();
     const auto kernel = std::make_shared<CompressibleCumulant4thOrderViscosityLBMKernel>();
     kernel->setBCProcessor(std::make_shared<BCProcessor>());
     kernel->setForcingX1(1e-6 * lbmUnitConverter->getFactorForceWToLb());
diff --git a/apps/cpu/porplate2/porplate.cpp b/apps/cpu/porplate2/porplate.cpp
index 2414e07732b18cac8a8c7c61b276f007c16826ef..fe93f8fa59d7e9befa63176b253f172ae09e1e87 100644
--- a/apps/cpu/porplate2/porplate.cpp
+++ b/apps/cpu/porplate2/porplate.cpp
@@ -316,7 +316,7 @@ void run(const char *cstr, bool firststart)
       stringstream logFilename;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr);
diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp
index ca3378bd5d6a4322b66877b25fca89d5ae478aac..68db541bc922d3c269d3f626e19ddd6a1001d071 100644
--- a/apps/cpu/rheometer/rheometer.cpp
+++ b/apps/cpu/rheometer/rheometer.cpp
@@ -43,7 +43,7 @@ void bflow(string configname)
 
       //outputPath = outputPath + "/rheometerBingham_" + config.getValue<string>("resolution") + "_" + config.getValue<string>("OmegaLB");
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/sbone/sbone.cpp b/apps/cpu/sbone/sbone.cpp
index 321396da68d290946c16b36955cc1be98c10cf84..b52aaa3ac6e40ec9550171125141edf28b3fd89d 100644
--- a/apps/cpu/sbone/sbone.cpp
+++ b/apps/cpu/sbone/sbone.cpp
@@ -23,7 +23,7 @@ void sbonepd(const char *configname)
          throw exceptionText;
       }
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if(machine == "BOMBADIL") 
diff --git a/apps/cpu/screw/screw.cpp b/apps/cpu/screw/screw.cpp
index 7ba90a58644e8d19181847dd0825abb57366daf5..ad7c997743a0ad10b4301765aaf73392f61f4bcc 100644
--- a/apps/cpu/screw/screw.cpp
+++ b/apps/cpu/screw/screw.cpp
@@ -29,7 +29,7 @@ int main(int argc, char* argv[])
       int             restartStep  = config.getValue<int>("restartStep");
 
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
diff --git a/apps/cpu/sphere/sphere.cpp b/apps/cpu/sphere/sphere.cpp
index 1f0f5c116988f9d4bb8d068768d057db376a42d0..5411449c79fcbf0bece01517eb81c4b7f1d4d52f 100644
--- a/apps/cpu/sphere/sphere.cpp
+++ b/apps/cpu/sphere/sphere.cpp
@@ -11,7 +11,7 @@ void run(string configname)
 
    try
    {
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
 
       int myid = comm->getProcessID();
 
diff --git a/apps/cpu/stick/stick.cpp b/apps/cpu/stick/stick.cpp
index 62efec8098241d440a2b2292ca5018fea915fe4e..8bbc820001c2e5e5b87c268d95bfce4f5323df70 100644
--- a/apps/cpu/stick/stick.cpp
+++ b/apps/cpu/stick/stick.cpp
@@ -19,7 +19,7 @@ void main()
       int numOfThreads = 4;
       double availMem = 10e9;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       double dx = 1;
diff --git a/apps/cpu/teperm/teperm.cpp b/apps/cpu/teperm/teperm.cpp
index 9c4c1585ffaee5dce85eb6d1d9d0de993e033d7b..78e57d8ef8200c8b0552d7b2670ca43c973e9182 100644
--- a/apps/cpu/teperm/teperm.cpp
+++ b/apps/cpu/teperm/teperm.cpp
@@ -63,7 +63,7 @@ void run(string configname)
       int             chunk = config.getValue<int>("chunk");
 
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      SPtr<vf::parallel::Communicator> comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
diff --git a/apps/cpu/town/town.cpp b/apps/cpu/town/town.cpp
index ccaf90f8d277df9e16a5e3592eafa649e142d235..7fcb83b314188d93a3778d06b439c5ff8e384d25 100644
--- a/apps/cpu/town/town.cpp
+++ b/apps/cpu/town/town.cpp
@@ -18,7 +18,7 @@ void run(const char *cstr1, const char *cstr2)
       stringstream logFilename;
       double availMem = 0;
 
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
+      CommunicatorPtr comm = vf::parallel::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       string machine = string(cstr1);
diff --git a/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp b/apps/gpu/ActuatorLine/ActuatorLine.cpp
similarity index 96%
rename from apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp
rename to apps/gpu/ActuatorLine/ActuatorLine.cpp
index 9c7394951e795055d22be9b155166464c998c098..4598244a12c3abf7f9211c242877a198f7799922 100644
--- a/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp
+++ b/apps/gpu/ActuatorLine/ActuatorLine.cpp
@@ -31,28 +31,25 @@
 //! \author Henry Korb, Henrik Asmuth
 //=======================================================================================
 #define _USE_MATH_DEFINES
-#include <math.h>
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <stdexcept>
-#include <fstream>
+#include <cmath>
 #include <exception>
+#include <fstream>
+#include <iostream>
 #include <memory>
+#include <sstream>
+#include <stdexcept>
+#include <string>
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "DataTypes.h"
-#include "PointerDefinitions.h"
-
-#include "StringUtilities/StringUtil.h"
-
-
-
+#include <basics/DataTypes.h>
+#include <basics/PointerDefinitions.h>
+#include <basics/StringUtilities/StringUtil.h>
 #include <basics/config/ConfigurationFile.h>
 
 #include <logger/Logger.h>
 
+#include <parallel/MPICommunicator.h>
 
 //////////////////////////////////////////////////////////////////////////
 
@@ -61,8 +58,6 @@
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/BoundaryConditions/BoundaryCondition.h"
 
-#include "GridGenerator/grid/GridFactory.h"
-
 #include "GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h"
 #include "GridGenerator/io/GridVTKWriter/GridVTKWriter.h"
 #include "GridGenerator/TransientBCSetter/TransientBCSetter.h"
@@ -71,7 +66,6 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
@@ -107,10 +101,7 @@ std::string simulationName("ActuatorLine");
 
 void multipleLevel(const std::string& configPath)
 {
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
-
-    auto gridFactory = GridFactory::make();
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
     vf::basics::ConfigurationFile config;
     config.load(configPath);
@@ -139,7 +130,7 @@ void multipleLevel(const std::string& configPath)
     const float tStartOutProbe      =  config.getValue<real>("tStartOutProbe");
     const float tOutProbe           =  config.getValue<real>("tOutProbe");
         
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
     GridScalingFactory scalingFactory  = GridScalingFactory();
 
@@ -149,6 +140,8 @@ void multipleLevel(const std::string& configPath)
 
     real turbPos[3] = {3*reference_diameter, 3*reference_diameter, 3*reference_diameter};
 
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
+
 	gridBuilder->addCoarseGrid(0.0, 0.0, 0.0,
 							   L_x,  L_y,  L_z, dx);
 
@@ -185,7 +178,7 @@ void multipleLevel(const std::string& configPath)
     para->setViscosityLB(viscosityLB);
     para->setVelocityRatio( dx / dt );
     para->setViscosityRatio( dx*dx/dt );
-    para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+    para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
 
     para->setInitialCondition([&](real coordX, real coordY, real coordZ, real &rho, real &vx, real &vy, real &vz) {
         rho = (real)0.0;
diff --git a/apps/gpu/LBM/ActuatorLine/CMakeLists.txt b/apps/gpu/ActuatorLine/CMakeLists.txt
similarity index 81%
rename from apps/gpu/LBM/ActuatorLine/CMakeLists.txt
rename to apps/gpu/ActuatorLine/CMakeLists.txt
index e0ff4e06e83a957be6966a7322ff06a0d068d18a..c437ac81a0e23fadd925ca81af596f81ff59f820 100644
--- a/apps/gpu/LBM/ActuatorLine/CMakeLists.txt
+++ b/apps/gpu/ActuatorLine/CMakeLists.txt
@@ -1,6 +1,6 @@
 PROJECT(ActuatorLine LANGUAGES CUDA CXX)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES ActuatorLine.cpp)
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES ActuatorLine.cpp)
 
 set_source_files_properties(ActuatorLine.cpp PROPERTIES LANGUAGE CUDA)
 
diff --git a/apps/gpu/LBM/ActuatorLine/configActuatorLine.txt b/apps/gpu/ActuatorLine/configActuatorLine.txt
similarity index 100%
rename from apps/gpu/LBM/ActuatorLine/configActuatorLine.txt
rename to apps/gpu/ActuatorLine/configActuatorLine.txt
diff --git a/apps/gpu/LBM/Basel/3rdPartyLinking.cmake b/apps/gpu/Basel/3rdPartyLinking.cmake
similarity index 100%
rename from apps/gpu/LBM/Basel/3rdPartyLinking.cmake
rename to apps/gpu/Basel/3rdPartyLinking.cmake
diff --git a/apps/gpu/LBM/Basel/CMakeLists.txt b/apps/gpu/Basel/CMakeLists.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/CMakeLists.txt
rename to apps/gpu/Basel/CMakeLists.txt
diff --git a/apps/gpu/LBM/Basel/CMakePackage.cmake b/apps/gpu/Basel/CMakePackage.cmake
similarity index 100%
rename from apps/gpu/LBM/Basel/CMakePackage.cmake
rename to apps/gpu/Basel/CMakePackage.cmake
diff --git a/apps/gpu/LBM/Basel/main.cpp b/apps/gpu/Basel/main.cpp
similarity index 100%
rename from apps/gpu/LBM/Basel/main.cpp
rename to apps/gpu/Basel/main.cpp
diff --git a/apps/gpu/LBM/Basel/resources/Junctions.txt b/apps/gpu/Basel/resources/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/Junctions.txt
rename to apps/gpu/Basel/resources/Junctions.txt
diff --git a/apps/gpu/LBM/Basel/resources/Sinks.txt b/apps/gpu/Basel/resources/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/Sinks.txt
rename to apps/gpu/Basel/resources/Sinks.txt
diff --git a/apps/gpu/LBM/Basel/resources/Sources.txt b/apps/gpu/Basel/resources/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/Sources.txt
rename to apps/gpu/Basel/resources/Sources.txt
diff --git a/apps/gpu/LBM/Basel/resources/Streets.txt b/apps/gpu/Basel/resources/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/Streets.txt
rename to apps/gpu/Basel/resources/Streets.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreets/Junctions.txt b/apps/gpu/Basel/resources/allStreets/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreets/Junctions.txt
rename to apps/gpu/Basel/resources/allStreets/Junctions.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreets/Sinks.txt b/apps/gpu/Basel/resources/allStreets/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreets/Sinks.txt
rename to apps/gpu/Basel/resources/allStreets/Sinks.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreets/Sources.txt b/apps/gpu/Basel/resources/allStreets/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreets/Sources.txt
rename to apps/gpu/Basel/resources/allStreets/Sources.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreets/Streets.txt b/apps/gpu/Basel/resources/allStreets/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreets/Streets.txt
rename to apps/gpu/Basel/resources/allStreets/Streets.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsDouble/Junctions.txt b/apps/gpu/Basel/resources/allStreetsDouble/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsDouble/Junctions.txt
rename to apps/gpu/Basel/resources/allStreetsDouble/Junctions.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsDouble/Sinks.txt b/apps/gpu/Basel/resources/allStreetsDouble/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsDouble/Sinks.txt
rename to apps/gpu/Basel/resources/allStreetsDouble/Sinks.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsDouble/Sources.txt b/apps/gpu/Basel/resources/allStreetsDouble/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsDouble/Sources.txt
rename to apps/gpu/Basel/resources/allStreetsDouble/Sources.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsDouble/Streets.txt b/apps/gpu/Basel/resources/allStreetsDouble/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsDouble/Streets.txt
rename to apps/gpu/Basel/resources/allStreetsDouble/Streets.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Junctions.txt b/apps/gpu/Basel/resources/allStreetsOneClosed/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Junctions.txt
rename to apps/gpu/Basel/resources/allStreetsOneClosed/Junctions.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Sinks.txt b/apps/gpu/Basel/resources/allStreetsOneClosed/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Sinks.txt
rename to apps/gpu/Basel/resources/allStreetsOneClosed/Sinks.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Sources.txt b/apps/gpu/Basel/resources/allStreetsOneClosed/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Sources.txt
rename to apps/gpu/Basel/resources/allStreetsOneClosed/Sources.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Streets.txt b/apps/gpu/Basel/resources/allStreetsOneClosed/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsOneClosed/Streets.txt
rename to apps/gpu/Basel/resources/allStreetsOneClosed/Streets.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Junctions.txt b/apps/gpu/Basel/resources/allStreetsQuadruple/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Junctions.txt
rename to apps/gpu/Basel/resources/allStreetsQuadruple/Junctions.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Sinks.txt b/apps/gpu/Basel/resources/allStreetsQuadruple/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Sinks.txt
rename to apps/gpu/Basel/resources/allStreetsQuadruple/Sinks.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Sources.txt b/apps/gpu/Basel/resources/allStreetsQuadruple/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Sources.txt
rename to apps/gpu/Basel/resources/allStreetsQuadruple/Sources.txt
diff --git a/apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Streets.txt b/apps/gpu/Basel/resources/allStreetsQuadruple/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/allStreetsQuadruple/Streets.txt
rename to apps/gpu/Basel/resources/allStreetsQuadruple/Streets.txt
diff --git a/apps/gpu/LBM/Basel/resources/fourStreets/Junctions.txt b/apps/gpu/Basel/resources/fourStreets/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/fourStreets/Junctions.txt
rename to apps/gpu/Basel/resources/fourStreets/Junctions.txt
diff --git a/apps/gpu/LBM/Basel/resources/fourStreets/Sinks.txt b/apps/gpu/Basel/resources/fourStreets/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/fourStreets/Sinks.txt
rename to apps/gpu/Basel/resources/fourStreets/Sinks.txt
diff --git a/apps/gpu/LBM/Basel/resources/fourStreets/Sources.txt b/apps/gpu/Basel/resources/fourStreets/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/fourStreets/Sources.txt
rename to apps/gpu/Basel/resources/fourStreets/Sources.txt
diff --git a/apps/gpu/LBM/Basel/resources/fourStreets/Streets.txt b/apps/gpu/Basel/resources/fourStreets/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/fourStreets/Streets.txt
rename to apps/gpu/Basel/resources/fourStreets/Streets.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Junctions1.txt b/apps/gpu/Basel/resources/testStreets/Junctions1.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Junctions1.txt
rename to apps/gpu/Basel/resources/testStreets/Junctions1.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Junctions2.txt b/apps/gpu/Basel/resources/testStreets/Junctions2.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Junctions2.txt
rename to apps/gpu/Basel/resources/testStreets/Junctions2.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Junctions3.txt b/apps/gpu/Basel/resources/testStreets/Junctions3.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Junctions3.txt
rename to apps/gpu/Basel/resources/testStreets/Junctions3.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Junctions4.txt b/apps/gpu/Basel/resources/testStreets/Junctions4.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Junctions4.txt
rename to apps/gpu/Basel/resources/testStreets/Junctions4.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Junctions5.txt b/apps/gpu/Basel/resources/testStreets/Junctions5.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Junctions5.txt
rename to apps/gpu/Basel/resources/testStreets/Junctions5.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Junctions6.txt b/apps/gpu/Basel/resources/testStreets/Junctions6.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Junctions6.txt
rename to apps/gpu/Basel/resources/testStreets/Junctions6.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sinks1.txt b/apps/gpu/Basel/resources/testStreets/Sinks1.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sinks1.txt
rename to apps/gpu/Basel/resources/testStreets/Sinks1.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sinks2.txt b/apps/gpu/Basel/resources/testStreets/Sinks2.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sinks2.txt
rename to apps/gpu/Basel/resources/testStreets/Sinks2.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sinks3.txt b/apps/gpu/Basel/resources/testStreets/Sinks3.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sinks3.txt
rename to apps/gpu/Basel/resources/testStreets/Sinks3.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sinks4.txt b/apps/gpu/Basel/resources/testStreets/Sinks4.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sinks4.txt
rename to apps/gpu/Basel/resources/testStreets/Sinks4.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sinks5.txt b/apps/gpu/Basel/resources/testStreets/Sinks5.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sinks5.txt
rename to apps/gpu/Basel/resources/testStreets/Sinks5.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sinks6.txt b/apps/gpu/Basel/resources/testStreets/Sinks6.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sinks6.txt
rename to apps/gpu/Basel/resources/testStreets/Sinks6.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sources1.txt b/apps/gpu/Basel/resources/testStreets/Sources1.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sources1.txt
rename to apps/gpu/Basel/resources/testStreets/Sources1.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sources2.txt b/apps/gpu/Basel/resources/testStreets/Sources2.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sources2.txt
rename to apps/gpu/Basel/resources/testStreets/Sources2.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sources3.txt b/apps/gpu/Basel/resources/testStreets/Sources3.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sources3.txt
rename to apps/gpu/Basel/resources/testStreets/Sources3.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sources4.txt b/apps/gpu/Basel/resources/testStreets/Sources4.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sources4.txt
rename to apps/gpu/Basel/resources/testStreets/Sources4.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sources5.txt b/apps/gpu/Basel/resources/testStreets/Sources5.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sources5.txt
rename to apps/gpu/Basel/resources/testStreets/Sources5.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Sources6.txt b/apps/gpu/Basel/resources/testStreets/Sources6.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Sources6.txt
rename to apps/gpu/Basel/resources/testStreets/Sources6.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Streets1.txt b/apps/gpu/Basel/resources/testStreets/Streets1.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Streets1.txt
rename to apps/gpu/Basel/resources/testStreets/Streets1.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Streets2.txt b/apps/gpu/Basel/resources/testStreets/Streets2.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Streets2.txt
rename to apps/gpu/Basel/resources/testStreets/Streets2.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Streets3.txt b/apps/gpu/Basel/resources/testStreets/Streets3.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Streets3.txt
rename to apps/gpu/Basel/resources/testStreets/Streets3.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Streets4.txt b/apps/gpu/Basel/resources/testStreets/Streets4.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Streets4.txt
rename to apps/gpu/Basel/resources/testStreets/Streets4.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Streets5.txt b/apps/gpu/Basel/resources/testStreets/Streets5.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Streets5.txt
rename to apps/gpu/Basel/resources/testStreets/Streets5.txt
diff --git a/apps/gpu/LBM/Basel/resources/testStreets/Streets6.txt b/apps/gpu/Basel/resources/testStreets/Streets6.txt
similarity index 100%
rename from apps/gpu/LBM/Basel/resources/testStreets/Streets6.txt
rename to apps/gpu/Basel/resources/testStreets/Streets6.txt
diff --git a/apps/gpu/LBM/BaselMultiGPU/3rdPartyLinking.cmake b/apps/gpu/BaselMultiGPU/3rdPartyLinking.cmake
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/3rdPartyLinking.cmake
rename to apps/gpu/BaselMultiGPU/3rdPartyLinking.cmake
diff --git a/apps/gpu/LBM/BaselMultiGPU/CMakeLists.txt b/apps/gpu/BaselMultiGPU/CMakeLists.txt
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/CMakeLists.txt
rename to apps/gpu/BaselMultiGPU/CMakeLists.txt
diff --git a/apps/gpu/LBM/BaselMultiGPU/CMakePackage.cmake b/apps/gpu/BaselMultiGPU/CMakePackage.cmake
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/CMakePackage.cmake
rename to apps/gpu/BaselMultiGPU/CMakePackage.cmake
diff --git a/apps/gpu/LBM/BaselMultiGPU/main.cpp b/apps/gpu/BaselMultiGPU/main.cpp
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/main.cpp
rename to apps/gpu/BaselMultiGPU/main.cpp
diff --git a/apps/gpu/LBM/BaselMultiGPU/resources/ExampleStreets.txt b/apps/gpu/BaselMultiGPU/resources/ExampleStreets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/resources/ExampleStreets.txt
rename to apps/gpu/BaselMultiGPU/resources/ExampleStreets.txt
diff --git a/apps/gpu/LBM/BaselMultiGPU/resources/Junctions.txt b/apps/gpu/BaselMultiGPU/resources/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/resources/Junctions.txt
rename to apps/gpu/BaselMultiGPU/resources/Junctions.txt
diff --git a/apps/gpu/LBM/BaselMultiGPU/resources/Sinks.txt b/apps/gpu/BaselMultiGPU/resources/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/resources/Sinks.txt
rename to apps/gpu/BaselMultiGPU/resources/Sinks.txt
diff --git a/apps/gpu/LBM/BaselMultiGPU/resources/Sources.txt b/apps/gpu/BaselMultiGPU/resources/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselMultiGPU/resources/Sources.txt
rename to apps/gpu/BaselMultiGPU/resources/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/3rdPartyLinking.cmake b/apps/gpu/BaselNU/3rdPartyLinking.cmake
similarity index 100%
rename from apps/gpu/LBM/BaselNU/3rdPartyLinking.cmake
rename to apps/gpu/BaselNU/3rdPartyLinking.cmake
diff --git a/apps/gpu/LBM/BaselNU/CMakeLists.txt b/apps/gpu/BaselNU/CMakeLists.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/CMakeLists.txt
rename to apps/gpu/BaselNU/CMakeLists.txt
diff --git a/apps/gpu/LBM/BaselNU/CMakePackage.cmake b/apps/gpu/BaselNU/CMakePackage.cmake
similarity index 100%
rename from apps/gpu/LBM/BaselNU/CMakePackage.cmake
rename to apps/gpu/BaselNU/CMakePackage.cmake
diff --git a/apps/gpu/LBM/BaselNU/main.cpp b/apps/gpu/BaselNU/main.cpp
similarity index 100%
rename from apps/gpu/LBM/BaselNU/main.cpp
rename to apps/gpu/BaselNU/main.cpp
diff --git a/apps/gpu/LBM/BaselNU/resources/Junctions.txt b/apps/gpu/BaselNU/resources/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/Junctions.txt
rename to apps/gpu/BaselNU/resources/Junctions.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/Sinks.txt b/apps/gpu/BaselNU/resources/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/Sinks.txt
rename to apps/gpu/BaselNU/resources/Sinks.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/Sources.txt b/apps/gpu/BaselNU/resources/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/Sources.txt
rename to apps/gpu/BaselNU/resources/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/Streets.txt b/apps/gpu/BaselNU/resources/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/Streets.txt
rename to apps/gpu/BaselNU/resources/Streets.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreets/Junctions.txt b/apps/gpu/BaselNU/resources/allStreets/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreets/Junctions.txt
rename to apps/gpu/BaselNU/resources/allStreets/Junctions.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreets/Sinks.txt b/apps/gpu/BaselNU/resources/allStreets/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreets/Sinks.txt
rename to apps/gpu/BaselNU/resources/allStreets/Sinks.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreets/Sources.txt b/apps/gpu/BaselNU/resources/allStreets/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreets/Sources.txt
rename to apps/gpu/BaselNU/resources/allStreets/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreets/Streets.txt b/apps/gpu/BaselNU/resources/allStreets/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreets/Streets.txt
rename to apps/gpu/BaselNU/resources/allStreets/Streets.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Junctions.txt b/apps/gpu/BaselNU/resources/allStreetsDouble/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Junctions.txt
rename to apps/gpu/BaselNU/resources/allStreetsDouble/Junctions.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Sinks.txt b/apps/gpu/BaselNU/resources/allStreetsDouble/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Sinks.txt
rename to apps/gpu/BaselNU/resources/allStreetsDouble/Sinks.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Sources.txt b/apps/gpu/BaselNU/resources/allStreetsDouble/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Sources.txt
rename to apps/gpu/BaselNU/resources/allStreetsDouble/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Streets.txt b/apps/gpu/BaselNU/resources/allStreetsDouble/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsDouble/Streets.txt
rename to apps/gpu/BaselNU/resources/allStreetsDouble/Streets.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Junctions.txt b/apps/gpu/BaselNU/resources/allStreetsOneClosed/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Junctions.txt
rename to apps/gpu/BaselNU/resources/allStreetsOneClosed/Junctions.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Sinks.txt b/apps/gpu/BaselNU/resources/allStreetsOneClosed/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Sinks.txt
rename to apps/gpu/BaselNU/resources/allStreetsOneClosed/Sinks.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Sources.txt b/apps/gpu/BaselNU/resources/allStreetsOneClosed/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Sources.txt
rename to apps/gpu/BaselNU/resources/allStreetsOneClosed/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Streets.txt b/apps/gpu/BaselNU/resources/allStreetsOneClosed/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsOneClosed/Streets.txt
rename to apps/gpu/BaselNU/resources/allStreetsOneClosed/Streets.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Junctions.txt b/apps/gpu/BaselNU/resources/allStreetsQuadruple/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Junctions.txt
rename to apps/gpu/BaselNU/resources/allStreetsQuadruple/Junctions.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Sinks.txt b/apps/gpu/BaselNU/resources/allStreetsQuadruple/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Sinks.txt
rename to apps/gpu/BaselNU/resources/allStreetsQuadruple/Sinks.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Sources.txt b/apps/gpu/BaselNU/resources/allStreetsQuadruple/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Sources.txt
rename to apps/gpu/BaselNU/resources/allStreetsQuadruple/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Streets.txt b/apps/gpu/BaselNU/resources/allStreetsQuadruple/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/allStreetsQuadruple/Streets.txt
rename to apps/gpu/BaselNU/resources/allStreetsQuadruple/Streets.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/fourStreets/Junctions.txt b/apps/gpu/BaselNU/resources/fourStreets/Junctions.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/fourStreets/Junctions.txt
rename to apps/gpu/BaselNU/resources/fourStreets/Junctions.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/fourStreets/Sinks.txt b/apps/gpu/BaselNU/resources/fourStreets/Sinks.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/fourStreets/Sinks.txt
rename to apps/gpu/BaselNU/resources/fourStreets/Sinks.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/fourStreets/Sources.txt b/apps/gpu/BaselNU/resources/fourStreets/Sources.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/fourStreets/Sources.txt
rename to apps/gpu/BaselNU/resources/fourStreets/Sources.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/fourStreets/Streets.txt b/apps/gpu/BaselNU/resources/fourStreets/Streets.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/fourStreets/Streets.txt
rename to apps/gpu/BaselNU/resources/fourStreets/Streets.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Junctions1.txt b/apps/gpu/BaselNU/resources/testStreets/Junctions1.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Junctions1.txt
rename to apps/gpu/BaselNU/resources/testStreets/Junctions1.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Junctions2.txt b/apps/gpu/BaselNU/resources/testStreets/Junctions2.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Junctions2.txt
rename to apps/gpu/BaselNU/resources/testStreets/Junctions2.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Junctions3.txt b/apps/gpu/BaselNU/resources/testStreets/Junctions3.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Junctions3.txt
rename to apps/gpu/BaselNU/resources/testStreets/Junctions3.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Junctions4.txt b/apps/gpu/BaselNU/resources/testStreets/Junctions4.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Junctions4.txt
rename to apps/gpu/BaselNU/resources/testStreets/Junctions4.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Junctions5.txt b/apps/gpu/BaselNU/resources/testStreets/Junctions5.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Junctions5.txt
rename to apps/gpu/BaselNU/resources/testStreets/Junctions5.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Junctions6.txt b/apps/gpu/BaselNU/resources/testStreets/Junctions6.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Junctions6.txt
rename to apps/gpu/BaselNU/resources/testStreets/Junctions6.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sinks1.txt b/apps/gpu/BaselNU/resources/testStreets/Sinks1.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sinks1.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sinks1.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sinks2.txt b/apps/gpu/BaselNU/resources/testStreets/Sinks2.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sinks2.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sinks2.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sinks3.txt b/apps/gpu/BaselNU/resources/testStreets/Sinks3.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sinks3.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sinks3.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sinks4.txt b/apps/gpu/BaselNU/resources/testStreets/Sinks4.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sinks4.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sinks4.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sinks5.txt b/apps/gpu/BaselNU/resources/testStreets/Sinks5.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sinks5.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sinks5.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sinks6.txt b/apps/gpu/BaselNU/resources/testStreets/Sinks6.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sinks6.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sinks6.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sources1.txt b/apps/gpu/BaselNU/resources/testStreets/Sources1.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sources1.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sources1.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sources2.txt b/apps/gpu/BaselNU/resources/testStreets/Sources2.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sources2.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sources2.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sources3.txt b/apps/gpu/BaselNU/resources/testStreets/Sources3.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sources3.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sources3.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sources4.txt b/apps/gpu/BaselNU/resources/testStreets/Sources4.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sources4.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sources4.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sources5.txt b/apps/gpu/BaselNU/resources/testStreets/Sources5.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sources5.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sources5.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Sources6.txt b/apps/gpu/BaselNU/resources/testStreets/Sources6.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Sources6.txt
rename to apps/gpu/BaselNU/resources/testStreets/Sources6.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Streets1.txt b/apps/gpu/BaselNU/resources/testStreets/Streets1.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Streets1.txt
rename to apps/gpu/BaselNU/resources/testStreets/Streets1.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Streets2.txt b/apps/gpu/BaselNU/resources/testStreets/Streets2.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Streets2.txt
rename to apps/gpu/BaselNU/resources/testStreets/Streets2.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Streets3.txt b/apps/gpu/BaselNU/resources/testStreets/Streets3.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Streets3.txt
rename to apps/gpu/BaselNU/resources/testStreets/Streets3.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Streets4.txt b/apps/gpu/BaselNU/resources/testStreets/Streets4.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Streets4.txt
rename to apps/gpu/BaselNU/resources/testStreets/Streets4.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Streets5.txt b/apps/gpu/BaselNU/resources/testStreets/Streets5.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Streets5.txt
rename to apps/gpu/BaselNU/resources/testStreets/Streets5.txt
diff --git a/apps/gpu/LBM/BaselNU/resources/testStreets/Streets6.txt b/apps/gpu/BaselNU/resources/testStreets/Streets6.txt
similarity index 100%
rename from apps/gpu/LBM/BaselNU/resources/testStreets/Streets6.txt
rename to apps/gpu/BaselNU/resources/testStreets/Streets6.txt
diff --git a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp b/apps/gpu/BoundaryLayer/BoundaryLayer.cpp
similarity index 96%
rename from apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
rename to apps/gpu/BoundaryLayer/BoundaryLayer.cpp
index 1c5f8ac0318f00a6bb819b016ff11925b2ff2da5..d8b3b54b22045214c70dde4c9c2ded711ab9cf73 100644
--- a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
+++ b/apps/gpu/BoundaryLayer/BoundaryLayer.cpp
@@ -31,28 +31,27 @@
 //! \author Henry Korb, Henrik Asmuth
 //=======================================================================================
 #define _USE_MATH_DEFINES
-#include <math.h>
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <stdexcept>
-#include <fstream>
+#include <cmath>
 #include <exception>
+#include <fstream>
+#include <iostream>
 #include <memory>
 #include <numeric>
+#include <sstream>
+#include <stdexcept>
+#include <string>
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "DataTypes.h"
-#include "PointerDefinitions.h"
-
-#include "StringUtilities/StringUtil.h"
-
+#include <basics/DataTypes.h>
+#include <basics/PointerDefinitions.h>
+#include <basics/StringUtilities/StringUtil.h>
 #include <basics/config/ConfigurationFile.h>
-#include "basics/constants/NumericConstants.h"
+#include <basics/constants/NumericConstants.h>
 
 #include <logger/Logger.h>
 
+#include <parallel/MPICommunicator.h>
 
 //////////////////////////////////////////////////////////////////////////
 
@@ -61,8 +60,6 @@
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/BoundaryConditions/BoundaryCondition.h"
 
-#include "GridGenerator/grid/GridFactory.h"
-
 #include "geometries/Cuboid/Cuboid.h"
 #include "geometries/TriangularMesh/TriangularMesh.h"
 
@@ -73,7 +70,6 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
@@ -103,23 +99,19 @@ using namespace vf::basics::constant;
 
 void multipleLevel(const std::string& configPath)
 {
-    auto gridFactory = GridFactory::make();
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
     vf::basics::ConfigurationFile config;
     config.load(configPath);
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////^
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
     GridScalingFactory scalingFactory  = GridScalingFactory();
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
-    const int  nProcs = communicator.getNumberOfProcess();
-    const uint procID = vf::gpu::MpiCommunicator::getInstance().getPID();
+    const int nProcs = communicator.getNumberOfProcesses();
+    const uint procID = communicator.getProcessID();
     std::vector<uint> devices(10);
     std::iota(devices.begin(), devices.end(), 0);
     para->setDevices(devices);
@@ -221,7 +213,7 @@ void multipleLevel(const std::string& configPath)
     bool useStreams = (nProcs > 1 ? true: false);
     // useStreams=false;
     para->setUseStreams(useStreams);
-    para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+    para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
     para->setIsBodyForce( config.getValue<bool>("bodyForce") );
 
     para->setTimestepStartOut(uint(tStartOut/dt) );
@@ -266,6 +258,7 @@ void multipleLevel(const std::string& configPath)
         xGridMax += overlap;
         xGridMin -= overlap;
     }
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
     gridBuilder->addCoarseGrid( xGridMin,  0.0,  0.0,
                                 xGridMax,  L_y,  L_z, dx);
@@ -426,7 +419,6 @@ void multipleLevel(const std::string& configPath)
         SPtr<PrecursorWriter> precursorWriter = std::make_shared<PrecursorWriter>("precursor", para->getOutputPath()+precursorDirectory, posXPrecursor, 0, L_y, 0, L_z, tStartPrecursor/dt, nTWritePrecursor, useDistributions? OutputVariable::Distributions: OutputVariable::Velocities, 1000);
         para->addProbe(precursorWriter);
     }
-
     auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
     auto gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
 
diff --git a/apps/gpu/LBM/BoundaryLayer/CMakeLists.txt b/apps/gpu/BoundaryLayer/CMakeLists.txt
similarity index 81%
rename from apps/gpu/LBM/BoundaryLayer/CMakeLists.txt
rename to apps/gpu/BoundaryLayer/CMakeLists.txt
index 801b634803943d48abda690935df0867eb3418d2..248c7a1616610715d38bcbff129b226da2cfd1f2 100644
--- a/apps/gpu/LBM/BoundaryLayer/CMakeLists.txt
+++ b/apps/gpu/BoundaryLayer/CMakeLists.txt
@@ -1,6 +1,6 @@
 PROJECT(BoundaryLayer LANGUAGES CUDA CXX)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES BoundaryLayer.cpp)
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES BoundaryLayer.cpp)
 
 set_source_files_properties(BoundaryLayer.cpp PROPERTIES LANGUAGE CUDA)
 
diff --git a/apps/gpu/LBM/BoundaryLayer/configBoundaryLayer.txt b/apps/gpu/BoundaryLayer/configBoundaryLayer.txt
similarity index 100%
rename from apps/gpu/LBM/BoundaryLayer/configBoundaryLayer.txt
rename to apps/gpu/BoundaryLayer/configBoundaryLayer.txt
diff --git a/apps/gpu/LBM/ChannelFlow/CMakeLists.txt b/apps/gpu/ChannelFlow/CMakeLists.txt
similarity index 81%
rename from apps/gpu/LBM/ChannelFlow/CMakeLists.txt
rename to apps/gpu/ChannelFlow/CMakeLists.txt
index f5b1bfd40dc723a7c050091d6d1c82d5f9addbd5..3884074e05097b392d96a47287d5e5cad4c0d6f3 100644
--- a/apps/gpu/LBM/ChannelFlow/CMakeLists.txt
+++ b/apps/gpu/ChannelFlow/CMakeLists.txt
@@ -1,6 +1,6 @@
 PROJECT(ChannelFlow LANGUAGES CUDA CXX)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES ChannelFlow.cpp)
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES ChannelFlow.cpp)
 
 set_source_files_properties(ChannelFlow.cpp PROPERTIES LANGUAGE CUDA)
 
diff --git a/apps/gpu/LBM/ChannelFlow/ChannelFlow.cpp b/apps/gpu/ChannelFlow/ChannelFlow.cpp
similarity index 87%
rename from apps/gpu/LBM/ChannelFlow/ChannelFlow.cpp
rename to apps/gpu/ChannelFlow/ChannelFlow.cpp
index 1482adf275da6dabae7bdde7647ac374a0d66bb1..c716729f88d2e9d07b7647749f09127e8acf252e 100644
--- a/apps/gpu/LBM/ChannelFlow/ChannelFlow.cpp
+++ b/apps/gpu/ChannelFlow/ChannelFlow.cpp
@@ -41,22 +41,18 @@
 #include <stdexcept>
 #include <string>
 
-#include "mpi.h"
-
 //////////////////////////////////////////////////////////////////////////
 
-#include "DataTypes.h"
-
-#include "PointerDefinitions.h"
-#include "config/ConfigurationFile.h"
-#include <logger/Logger.h>
+#include <basics/DataTypes.h>
+#include <basics/PointerDefinitions.h>
+#include <basics/StringUtilities/StringUtil.h>
+#include <basics/config/ConfigurationFile.h>
 
 //////////////////////////////////////////////////////////////////////////
 
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 
 #include "GridGenerator/geometries/Sphere/Sphere.h"
 #include "GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
@@ -65,7 +61,6 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
@@ -76,6 +71,8 @@
 
 //////////////////////////////////////////////////////////////////////////
 
+#include <parallel/MPICommunicator.h>
+
 int main(int argc, char *argv[])
 {
     try {
@@ -95,31 +92,23 @@ int main(int argc, char *argv[])
         // setup simulation parameters (without config file)
         //////////////////////////////////////////////////////////////////////////
 
-        vf::gpu::Communicator &communicator = vf::gpu::MpiCommunicator::getInstance();
-        const int numberOfProcesses = communicator.getNumberOfProcess();
-        SPtr<Parameter> para = std::make_shared<Parameter>(numberOfProcesses, communicator.getPID());
+        vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
+        const int numberOfProcesses = communicator.getNumberOfProcesses();
+        const auto processID = communicator.getProcessID();
+        SPtr<Parameter> para = std::make_shared<Parameter>(numberOfProcesses, processId);
         std::vector<uint> devices(10);
         std::iota(devices.begin(), devices.end(), 0);
         para->setDevices(devices);
-        para->setMaxDev(communicator.getNumberOfProcess());
+        para->setMaxDev(communicator.getNumberOfProcesses());
         BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
 
         //////////////////////////////////////////////////////////////////////////
         // setup logger
         //////////////////////////////////////////////////////////////////////////
-
         vf::logging::Logger::changeLogPath("output/vflog_process" +
-                                           std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + ".txt");
+                                           std::to_string(processId) + ".txt");
         vf::logging::Logger::initializeLogger();
 
-        //////////////////////////////////////////////////////////////////////////
-        // setup gridGenerator
-        //////////////////////////////////////////////////////////////////////////
-
-        auto gridFactory = GridFactory::make();
-        gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-        auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-
         //////////////////////////////////////////////////////////////////////////
         // create grid
         //////////////////////////////////////////////////////////////////////////
@@ -157,9 +146,8 @@ int main(int argc, char *argv[])
         para->setTimestepEnd(timeStepEnd);
 
         para->setOutputPrefix("ChannelFlow");
-        para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+        para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
 
-        const uint generatePart = vf::gpu::MpiCommunicator::getInstance().getPID();
         real overlap = (real)8.0 * dx;
 
         if (numberOfProcesses > 1) {
@@ -168,17 +156,19 @@ int main(int argc, char *argv[])
             // add coarse grids
             //////////////////////////////////////////////////////////////////////////
 
-            real subdomainMinX = channelWidth * generatePart;
+            real subdomainMinX = channelWidth * processId;
             real subdomainMinXoverlap = subdomainMinX;
             real subdomainMaxX = subdomainMinX + channelWidth;
             real subdomainMaxXoverlap = subdomainMaxX;
 
-            if (generatePart != 0)
+            if (processID != 0)
                 subdomainMinXoverlap -= overlap;
 
-            if (generatePart != numberOfProcesses - 1)
+            if (processID != numberOfProcesses - 1)
                 subdomainMaxXoverlap += overlap;
 
+            auto gridBuilder = std::make_shared<MultipleGridBuilder>();
+
             gridBuilder->addCoarseGrid(subdomainMinXoverlap, yGridMin, zGridMin, subdomainMaxXoverlap, yGridMax,
                                        zGridMax, dx);
 
@@ -199,14 +189,14 @@ int main(int argc, char *argv[])
             // configure communication neighbors
             //////////////////////////////////////////////////////////////////////////
 
-            if (generatePart != 0) {
+            if (processID != 0) {
                 gridBuilder->findCommunicationIndices(CommunicationDirections::MX, LBM);
-                gridBuilder->setCommunicationProcess(CommunicationDirections::MX, generatePart - 1);
+                gridBuilder->setCommunicationProcess(CommunicationDirections::MX, processId - 1);
             }
 
-            if (generatePart != numberOfProcesses - 1) {
+            if (processID != numberOfProcesses - 1) {
                 gridBuilder->findCommunicationIndices(CommunicationDirections::PX, LBM);
-                gridBuilder->setCommunicationProcess(CommunicationDirections::PX, generatePart + 1);
+                gridBuilder->setCommunicationProcess(CommunicationDirections::PX, processId + 1);
             }
 
             //////////////////////////////////////////////////////////////////////////
@@ -215,10 +205,10 @@ int main(int argc, char *argv[])
 
             gridBuilder->setPeriodicBoundaryCondition(false, false, false);
 
-            if (generatePart == 0) {
+            if (processID == 0) {
                 gridBuilder->setVelocityBoundaryCondition(SideType::MX, velocityLB, 0.0, 0.0);
             }
-            if (generatePart == numberOfProcesses - 1) {
+            if (processID == numberOfProcesses - 1) {
                 gridBuilder->setPressureBoundaryCondition(SideType::PX,
                                                           0.0); // set pressure boundary condition last
                 bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflective);
diff --git a/apps/gpu/DrivenCavity/CMakeLists.txt b/apps/gpu/DrivenCavity/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8646f29c13d689eaabee4274418620636643c592
--- /dev/null
+++ b/apps/gpu/DrivenCavity/CMakeLists.txt
@@ -0,0 +1,5 @@
+PROJECT(DrivenCavity LANGUAGES CXX)
+
+#LIST(APPEND CS_COMPILER_FLAGS_CXX "-DOMPI_SKIP_MPICXX" )
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES DrivenCavity.cpp)
diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/DrivenCavity/DrivenCavity.cpp
similarity index 91%
rename from apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
rename to apps/gpu/DrivenCavity/DrivenCavity.cpp
index 245d1c052c909cef7c1ab948ca55d104419fa8cd..6f36a74a61902135ae78d4cdea43f13540e243f0 100644
--- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
+++ b/apps/gpu/DrivenCavity/DrivenCavity.cpp
@@ -41,31 +41,30 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "DataTypes.h"
-#include "PointerDefinitions.h"
+#include <basics/DataTypes.h>
+#include <basics/PointerDefinitions.h>
 
 #include <logger/Logger.h>
 
+#include <parallel/MPICommunicator.h>
+
 //////////////////////////////////////////////////////////////////////////
 
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 #include "GridGenerator/geometries/Cuboid/Cuboid.h"
 
 //////////////////////////////////////////////////////////////////////////
 
 #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
 #include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
 #include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
 
 //////////////////////////////////////////////////////////////////////////
@@ -89,14 +88,6 @@ int main()
         const uint timeStepOut = 1000;
         const uint timeStepEnd = 10000;
 
-        //////////////////////////////////////////////////////////////////////////
-        // setup gridGenerator
-        //////////////////////////////////////////////////////////////////////////
-
-        auto gridFactory = GridFactory::make();
-        gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-        auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-
         //////////////////////////////////////////////////////////////////////////
         // compute parameters in lattice units
         //////////////////////////////////////////////////////////////////////////
@@ -112,6 +103,7 @@ int main()
         //////////////////////////////////////////////////////////////////////////
         // create grid
         //////////////////////////////////////////////////////////////////////////
+        auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
         gridBuilder->addCoarseGrid(-0.5 * L, -0.5 * L, -0.5 * L, 0.5 * L, 0.5 * L, 0.5 * L, dx);
 
@@ -142,7 +134,7 @@ int main()
         para->setTimestepOut(timeStepOut);
         para->setTimestepEnd(timeStepEnd);
 
-        para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+        para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
 
         //////////////////////////////////////////////////////////////////////////
         // set boundary conditions
@@ -164,7 +156,7 @@ int main()
         // set copy mesh to simulation
         //////////////////////////////////////////////////////////////////////////
 
-        vf::gpu::Communicator &communicator = vf::gpu::MpiCommunicator::getInstance();
+        vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
         auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
         SPtr<GridProvider> gridGenerator =
diff --git a/apps/gpu/LBM/DrivenCavity/configDrivenCavity.txt b/apps/gpu/DrivenCavity/configDrivenCavity.txt
similarity index 100%
rename from apps/gpu/LBM/DrivenCavity/configDrivenCavity.txt
rename to apps/gpu/DrivenCavity/configDrivenCavity.txt
diff --git a/apps/gpu/DrivenCavityMultiGPU/CMakeLists.txt b/apps/gpu/DrivenCavityMultiGPU/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6460abb1cb56b770cf91f57239eeb8262f34595a
--- /dev/null
+++ b/apps/gpu/DrivenCavityMultiGPU/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(DrivenCavityMultiGPU LANGUAGES CXX)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES DrivenCavityMultiGPU.cpp)
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp b/apps/gpu/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
similarity index 96%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
rename to apps/gpu/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
index d6b6703659aaca6d254a1fc2f7692be4e9f22593..006f2b92335a3dd2f6c2cd97de2971cac0e61bf8 100755
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
+++ b/apps/gpu/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
@@ -1,14 +1,12 @@
 #define _USE_MATH_DEFINES
 #include <exception>
+#include <filesystem>
 #include <fstream>
 #include <iostream>
 #include <memory>
 #include <sstream>
 #include <stdexcept>
 #include <string>
-#include <filesystem>
-
-#include "mpi.h"
 
 //////////////////////////////////////////////////////////////////////////
 
@@ -24,7 +22,6 @@
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 
 #include "geometries/Cuboid/Cuboid.h"
 #include "geometries/TriangularMesh/TriangularMesh.h"
@@ -36,7 +33,6 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
@@ -53,7 +49,7 @@
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
 
 //////////////////////////////////////////////////////////////////////////
-
+#include <parallel/MPICommunicator.h>
 #include "utilities/communication.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -62,13 +58,11 @@
 
 void runVirtualFluids(const vf::basics::ConfigurationFile& config)
 {
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
-    auto gridFactory = GridFactory::make();
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
     GridScalingFactory scalingFactory = GridScalingFactory();
 
@@ -115,7 +109,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
     para->setPrintFiles(true);
     std::cout << "Write result files to " << para->getFName() << std::endl;
 
-    para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+    para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
     scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -145,7 +139,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
 
         if (para->getNumprocs() > 1) {
 
-            const uint generatePart = vf::gpu::MpiCommunicator::getInstance().getPID();
+            const uint generatePart = communicator.getProcessID();
             real overlap            = (real)8.0 * dxGrid;
             gridBuilder->setNumberOfLayers(10, 8);
 
@@ -153,7 +147,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
             const real ySplit = 0.0;
             const real zSplit = 0.0;
 
-            if (communicator.getNumberOfProcess() == 2) {
+            if (communicator.getNumberOfProcesses() == 2) {
 
                 if (generatePart == 0) {
                     gridBuilder->addCoarseGrid(xGridMin, yGridMin, zGridMin, xGridMax, yGridMax, zSplit + overlap,
@@ -200,7 +194,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
                 gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.0, 0.0, 0.0);
                 gridBuilder->setVelocityBoundaryCondition(SideType::PY, 0.0, 0.0, 0.0);
                 //////////////////////////////////////////////////////////////////////////
-            } else if (communicator.getNumberOfProcess() == 4) {
+            } else if (communicator.getNumberOfProcesses() == 4) {
 
                 if (generatePart == 0) {
                     gridBuilder->addCoarseGrid(xGridMin, yGridMin, zGridMin, xSplit + overlap, yGridMax,
@@ -284,7 +278,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
                     gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.0, 0.0, 0.0);
                 }
                 //////////////////////////////////////////////////////////////////////////
-            } else if (communicator.getNumberOfProcess() == 8) {
+            } else if (communicator.getNumberOfProcesses() == 8) {
 
                 if (generatePart == 0) {
                     gridBuilder->addCoarseGrid(xGridMin, yGridMin, zGridMin, xSplit + overlap, ySplit + overlap,
@@ -517,7 +511,7 @@ int main(int argc, char *argv[])
 
         try {
             VF_LOG_TRACE("For the default config path to work, execute the app from the project root.");
-            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/LBM/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt");
+            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt");
             runVirtualFluids(config);
 
             //////////////////////////////////////////////////////////////////////////
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt b/apps/gpu/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt
similarity index 95%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt
rename to apps/gpu/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt
index 69b6d099c97bd0bebeec71104ad484513f50c6e7..5e6c31efa177ef510ae8db66da5f4aafbe0da771 100644
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt
+++ b/apps/gpu/DrivenCavityMultiGPU/configDrivenCavityMultiGPU.txt
@@ -26,7 +26,7 @@ GridPath=/workspaces/VirtualFluids_dev/output/DrivenCavity_Results/grid/  # Arag
 ##################################################
 
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix1GPU.txt b/apps/gpu/DrivenCavityMultiGPU/configPhoenix1GPU.txt
similarity index 95%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix1GPU.txt
rename to apps/gpu/DrivenCavityMultiGPU/configPhoenix1GPU.txt
index e63db13b533d24ef44b2e4d472ffba481d79f828..64c083d726d88a6331d503ea4683020ed8212394 100644
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix1GPU.txt
+++ b/apps/gpu/DrivenCavityMultiGPU/configPhoenix1GPU.txt
@@ -25,7 +25,7 @@ GridPath=/work/y0078217/Grids/GridDrivenCavityMultiGPU/1GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix2GPU.txt b/apps/gpu/DrivenCavityMultiGPU/configPhoenix2GPU.txt
similarity index 96%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix2GPU.txt
rename to apps/gpu/DrivenCavityMultiGPU/configPhoenix2GPU.txt
index 30b1882df34dcae63674b42ce6d65a47942ff87e..c88e125fbcc9e956b74094d8e608131c21369588 100644
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix2GPU.txt
+++ b/apps/gpu/DrivenCavityMultiGPU/configPhoenix2GPU.txt
@@ -25,7 +25,7 @@ GridPath=/work/y0078217/Grids/GridDrivenCavityMultiGPU/2GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix4GPU_regressionTest.txt b/apps/gpu/DrivenCavityMultiGPU/configPhoenix4GPU_regressionTest.txt
similarity index 100%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix4GPU_regressionTest.txt
rename to apps/gpu/DrivenCavityMultiGPU/configPhoenix4GPU_regressionTest.txt
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix8GPU.txt b/apps/gpu/DrivenCavityMultiGPU/configPhoenix8GPU.txt
similarity index 96%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix8GPU.txt
rename to apps/gpu/DrivenCavityMultiGPU/configPhoenix8GPU.txt
index 85684e7589dad91e53356c16bc2eae44081d7e96..78c95032a9c7a49d760a58e77112ee7fb774758d 100644
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix8GPU.txt
+++ b/apps/gpu/DrivenCavityMultiGPU/configPhoenix8GPU.txt
@@ -25,7 +25,7 @@ GridPath=/work/y0078217/Grids/GridDrivenCavityMultiGPU/8GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix8GPU_regressionTest.txt b/apps/gpu/DrivenCavityMultiGPU/configPhoenix8GPU_regressionTest.txt
similarity index 100%
rename from apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix8GPU_regressionTest.txt
rename to apps/gpu/DrivenCavityMultiGPU/configPhoenix8GPU_regressionTest.txt
diff --git a/apps/gpu/DrivenCavityUniform/CMakeLists.txt b/apps/gpu/DrivenCavityUniform/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..78d6d693a54b251b8c3361ac908f6099f4d7ccf0
--- /dev/null
+++ b/apps/gpu/DrivenCavityUniform/CMakeLists.txt
@@ -0,0 +1,5 @@
+PROJECT(DrivenCavityUniform LANGUAGES CXX)
+
+#LIST(APPEND CS_COMPILER_FLAGS_CXX "-DOMPI_SKIP_MPICXX" )
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES DrivenCavity.cpp)
diff --git a/apps/gpu/LBM/DrivenCavityUniform/DrivenCavity.cpp b/apps/gpu/DrivenCavityUniform/DrivenCavity.cpp
similarity index 91%
rename from apps/gpu/LBM/DrivenCavityUniform/DrivenCavity.cpp
rename to apps/gpu/DrivenCavityUniform/DrivenCavity.cpp
index 05c164ea82790c4a26c5c65538d944f46d1c969c..10319c4c62ad2b1a3e5471be86e3f8fca41a49b2 100644
--- a/apps/gpu/LBM/DrivenCavityUniform/DrivenCavity.cpp
+++ b/apps/gpu/DrivenCavityUniform/DrivenCavity.cpp
@@ -41,41 +41,39 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "DataTypes.h"
-#include <logger/Logger.h>
-
-#include "PointerDefinitions.h"
+#include <basics/DataTypes.h>
+#include <basics/PointerDefinitions.h>
 
 #include <logger/Logger.h>
 
+#include <parallel/MPICommunicator.h>
+
 //////////////////////////////////////////////////////////////////////////
 
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 #include "GridGenerator/geometries/Cuboid/Cuboid.h"
 
 //////////////////////////////////////////////////////////////////////////
 
 #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
 #include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
 #include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
 
+
 //////////////////////////////////////////////////////////////////////////
 
 int main()
 {
     try {
-         vf::logging::Logger::initializeLogger();
+        vf::logging::Logger::initializeLogger();
         //////////////////////////////////////////////////////////////////////////
         // Simulation parameters
         //////////////////////////////////////////////////////////////////////////
@@ -91,20 +89,14 @@ int main()
         const uint timeStepOut = 1000;
         const uint timeStepEnd = 10000;
 
-        //////////////////////////////////////////////////////////////////////////
-        // setup gridGenerator
-        //////////////////////////////////////////////////////////////////////////
-
-        auto gridFactory = GridFactory::make();
-        gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-        auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-
         //////////////////////////////////////////////////////////////////////////
         // create grid
         //////////////////////////////////////////////////////////////////////////
 
         real dx = L / real(nx);
 
+        auto gridBuilder = std::make_shared<MultipleGridBuilder>();
+
         gridBuilder->addCoarseGrid(-0.5 * L, -0.5 * L, -0.5 * L, 0.5 * L, 0.5 * L, 0.5 * L, dx);
 
         // gridBuilder->addGrid(std::make_shared<Cuboid>(-0.25, -0.25, -0.25, 0.25, 0.25, 0.25), 1); // add fine grid
@@ -145,7 +137,7 @@ int main()
         para->setTimestepOut(timeStepOut);
         para->setTimestepEnd(timeStepEnd);
 
-        para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+        para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
 
         //////////////////////////////////////////////////////////////////////////
         // set boundary conditions
@@ -167,13 +159,12 @@ int main()
         // set copy mesh to simulation
         //////////////////////////////////////////////////////////////////////////
 
-        vf::gpu::Communicator &communicator = vf::gpu::MpiCommunicator::getInstance();
+        vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
         auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
         SPtr<GridProvider> gridGenerator =
             GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
 
-
         //////////////////////////////////////////////////////////////////////////
         // run simulation
         //////////////////////////////////////////////////////////////////////////
diff --git a/apps/gpu/LBM/DrivenCavityUniform/configDrivenCavity.txt b/apps/gpu/DrivenCavityUniform/configDrivenCavity.txt
similarity index 100%
rename from apps/gpu/LBM/DrivenCavityUniform/configDrivenCavity.txt
rename to apps/gpu/DrivenCavityUniform/configDrivenCavity.txt
diff --git a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
deleted file mode 100644
index 8384e1bc6fcfa3fd2514434b620b266e96b3626a..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT(DrivenCavity LANGUAGES CUDA CXX)
-
-#LIST(APPEND CS_COMPILER_FLAGS_CXX "-DOMPI_SKIP_MPICXX" )
-
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES DrivenCavity.cpp)
-
-set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA)
-
-set_target_properties(DrivenCavity PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/CMakeLists.txt b/apps/gpu/LBM/DrivenCavityMultiGPU/CMakeLists.txt
deleted file mode 100644
index 51b8db1edf126ebe7e2f3d5808496121270433c5..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/CMakeLists.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-PROJECT(DrivenCavityMultiGPU LANGUAGES CUDA CXX)
-
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES DrivenCavityMultiGPU.cpp)
-
-set_source_files_properties(DrivenCavityMultiGPU.cpp PROPERTIES LANGUAGE CUDA)
-
-set_target_properties(DrivenCavityMultiGPU PROPERTIES 
-	CUDA_SEPARABLE_COMPILATION ON)
\ No newline at end of file
diff --git a/apps/gpu/LBM/DrivenCavityUniform/CMakeLists.txt b/apps/gpu/LBM/DrivenCavityUniform/CMakeLists.txt
deleted file mode 100644
index 40b4f08d7500c56efae7378df6398d065e4ecbfb..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/DrivenCavityUniform/CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-PROJECT(DrivenCavityUniform LANGUAGES CUDA CXX)
-
-#LIST(APPEND CS_COMPILER_FLAGS_CXX "-DOMPI_SKIP_MPICXX" )
-
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES DrivenCavity.cpp)
-
-set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA)
-
-set_target_properties(DrivenCavityUniform PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
-
diff --git a/apps/gpu/LBM/MusselOyster/CMakeLists.txt b/apps/gpu/LBM/MusselOyster/CMakeLists.txt
deleted file mode 100644
index 595d9ff7250d984f80e8d0d54dad0b11ae7e71e2..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/MusselOyster/CMakeLists.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-PROJECT(MusselOyster LANGUAGES CUDA CXX)
-
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES MusselOyster.cpp)
-
-set_source_files_properties(MusselOyster.cpp PROPERTIES LANGUAGE CUDA)
-
-set_target_properties(MusselOyster PROPERTIES 
-	CUDA_SEPARABLE_COMPILATION ON)
\ No newline at end of file
diff --git a/apps/gpu/LBM/SphereGPU/CMakeLists.txt b/apps/gpu/LBM/SphereGPU/CMakeLists.txt
deleted file mode 100644
index 6a8f3cb1b86b149852abf4365e15fd4df9e8c0cf..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/SphereGPU/CMakeLists.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-PROJECT(SphereGPU LANGUAGES CUDA CXX)
-
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES Sphere.cpp)
-
-set_source_files_properties(Sphere.cpp PROPERTIES LANGUAGE CUDA)
-
-set_target_properties(SphereGPU PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
diff --git a/apps/gpu/LBM/lbmTest/3rdPartyLinking.cmake b/apps/gpu/LBM/lbmTest/3rdPartyLinking.cmake
deleted file mode 100644
index 6dd6ba1bc73e73dfbf01a3cc36aaeb3664e1c04c..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/lbmTest/3rdPartyLinking.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/MPI/Link.cmake)
-linkMPI(${targetName})
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/Cuda/Link.cmake)
-linkCuda(${targetName})
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/Boost/Link.cmake)
-linkBoost(${targetName} "serialization")
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/Metis/Link.cmake)
-linkMetis(${targetName})
-
-if(HULC.BUILD_JSONCPP)
-  include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/JsonCpp/Link.cmake)
-  linkJsonCpp(${targetName})
-endif()
\ No newline at end of file
diff --git a/apps/gpu/LBM/lbmTest/CMakeLists.txt b/apps/gpu/LBM/lbmTest/CMakeLists.txt
deleted file mode 100644
index 6ef6241b52aa9b5dc73a19b82f2b9fd5248c77c5..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/lbmTest/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-setTargetNameToFolderName(${CMAKE_CURRENT_LIST_DIR}) 
-
-set(linkDirectories "")
-set(libsToLink VirtualFluids_GPU GridGenerator)
-set(includeDirectories "${CMAKE_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/src/VirtualFluids_GPU" "${CMAKE_SOURCE_DIR}/src/GridGenerator" "${CMAKE_SOURCE_DIR}/src/VirtualFluidsBasics")
-
-#glob files and save in MY_SRCS
-include(CMakePackage.cmake)
-
-buildExe(${targetName} "${MY_SRCS}" "${linkDirectories}" "${libsToLink}" "${includeDirectories}")
-groupTarget(${targetName} ${lbmAppFolder})
-
-# Specify the linking to 3rdParty libs
-include(3rdPartyLinking.cmake)
\ No newline at end of file
diff --git a/apps/gpu/LBM/lbmTest/CMakePackage.cmake b/apps/gpu/LBM/lbmTest/CMakePackage.cmake
deleted file mode 100644
index 5d39e3804dbd180790629111449a7dc918292430..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/lbmTest/CMakePackage.cmake
+++ /dev/null
@@ -1,9 +0,0 @@
-#FILE ENDINGS
-resetFileEndingsToCollect()
-addCAndCPPFileTypes()
-addFileEndingToCollect("*.cu")
-addFileEndingToCollect("*.cuh")
-
-#GLOB SOURCE FILES IN MY_SRCS
-unset(MY_SRCS)
-includeRecursiveAllFilesFrom(${targetName} ${CMAKE_CURRENT_LIST_DIR})
\ No newline at end of file
diff --git a/apps/gpu/LBM/lbmTest/main.cpp b/apps/gpu/LBM/lbmTest/main.cpp
deleted file mode 100644
index 90640a3813a25e8249c7668a6e6c7779b0f01e4d..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/lbmTest/main.cpp
+++ /dev/null
@@ -1,819 +0,0 @@
-//#define MPI_LOGGING
-
-//Martin Branch
-
-#include <mpi.h>
-#if defined( MPI_LOGGING )
-	#include <mpe.h>
-#endif
-
-#include <string>
-#include <iostream>
-#include <stdexcept>
-#include <fstream>
-#define _USE_MATH_DEFINES
-#include <math.h>
-
-#include "metis.h"
-
-#include "Input/Input.h"
-#include "StringUtilities/StringUtil.h"
-
-#include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
-#include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Output/FileWriter.h"
-#include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
-
-#include "global.h"
-
-#include "geometries/Sphere/Sphere.h"
-#include "geometries/VerticalCylinder/VerticalCylinder.h"
-#include "geometries/Cuboid/Cuboid.h"
-#include "geometries/TriangularMesh/TriangularMesh.h"
-#include "geometries/Conglomerate/Conglomerate.h"
-#include "geometries/TriangularMesh/TriangularMeshStrategy.h"
-
-#include "grid/GridBuilder/LevelGridBuilder.h"
-#include "grid/GridBuilder/MultipleGridBuilder.h"
-#include "grid/BoundaryConditions/Side.h"
-#include "grid/BoundaryConditions/BoundaryCondition.h"
-#include "grid/GridFactory.h"
-
-#include "io/SimulationFileWriter/SimulationFileWriter.h"
-#include "io/GridVTKWriter/GridVTKWriter.h"
-#include "io/STLReaderWriter/STLReader.h"
-#include "io/STLReaderWriter/STLWriter.h"
-
-#include "utilities/math/Math.h"
-#include "utilities/communication.h"
-#include "utilities/transformator/TransformatorImp.h"
-
-std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
-{
-    if (para->getNumprocs() == 1)
-        return Gridpath + "/";
-    
-    return Gridpath + "/" + StringUtil::toString(para->getMyID()) + "/";
-}
-
-void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input> &input)
-{
-	Communicator* comm = Communicator::getInstanz();
-
-	para->setMaxDev(StringUtil::toInt(input->getValue("NumberOfDevices")));
-	para->setNumprocs(comm->getNumberOfProcess());
-	para->setDevices(StringUtil::toUintVector(input->getValue("Devices")));
-	para->setMyID(comm->getPID());
-	
-	std::string _path = input->getValue("Path");
-    std::string _prefix = input->getValue("Prefix");
-    std::string _gridpath = input->getValue("GridPath");
-    std::string gridPath = getGridPath(para, _gridpath);
-    para->setOutputPath(_path);
-    para->setOutputPrefix(_prefix);
-    para->setPathAndFilename(_path + "/" + _prefix);
-    para->setPrintFiles(false);
-    para->setPrintFiles(StringUtil::toBool(input->getValue("WriteGrid")));
-    para->setGeometryValues(StringUtil::toBool(input->getValue("GeometryValues")));
-    para->setCalc2ndOrderMoments(StringUtil::toBool(input->getValue("calc2ndOrderMoments")));
-    para->setCalc3rdOrderMoments(StringUtil::toBool(input->getValue("calc3rdOrderMoments")));
-    para->setCalcHighOrderMoments(StringUtil::toBool(input->getValue("calcHigherOrderMoments")));
-    para->setReadGeo(StringUtil::toBool(input->getValue("ReadGeometry")));
-    para->setCalcMedian(StringUtil::toBool(input->getValue("calcMedian")));
-    para->setConcFile(StringUtil::toBool(input->getValue("UseConcFile")));
-    para->setUseMeasurePoints(StringUtil::toBool(input->getValue("UseMeasurePoints")));
-    para->setUseWale(StringUtil::toBool(input->getValue("UseWale")));
-    para->setSimulatePorousMedia(StringUtil::toBool(input->getValue("SimulatePorousMedia")));
-    para->setD3Qxx(StringUtil::toInt(input->getValue("D3Qxx")));
-    para->setTimestepEnd(StringUtil::toInt(input->getValue("TimeEnd")));
-    para->setTimestepOut(StringUtil::toInt(input->getValue("TimeOut")));
-    para->setTimestepStartOut(StringUtil::toInt(input->getValue("TimeStartOut")));
-    para->setTimeCalcMedStart(StringUtil::toInt(input->getValue("TimeStartCalcMedian")));
-    para->setTimeCalcMedEnd(StringUtil::toInt(input->getValue("TimeEndCalcMedian")));
-    para->setPressInID(StringUtil::toInt(input->getValue("PressInID")));
-    para->setPressOutID(StringUtil::toInt(input->getValue("PressOutID")));
-    para->setPressInZ(StringUtil::toInt(input->getValue("PressInZ")));
-    para->setPressOutZ(StringUtil::toInt(input->getValue("PressOutZ")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setDiffOn(StringUtil::toBool(input->getValue("DiffOn")));
-    para->setDiffMod(StringUtil::toInt(input->getValue("DiffMod")));
-    para->setDiffusivity(StringUtil::toFloat(input->getValue("Diffusivity")));
-    para->setTemperatureInit(StringUtil::toFloat(input->getValue("Temp")));
-    para->setTemperatureBC(StringUtil::toFloat(input->getValue("TempBC")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setViscosityLB(StringUtil::toFloat(input->getValue("Viscosity_LB")));
-    para->setVelocityLB(StringUtil::toFloat(input->getValue("Velocity_LB")));
-    para->setViscosityRatio(StringUtil::toFloat(input->getValue("Viscosity_Ratio_World_to_LB")));
-    para->setVelocityRatio(StringUtil::toFloat(input->getValue("Velocity_Ratio_World_to_LB")));
-    para->setDensityRatio(StringUtil::toFloat(input->getValue("Density_Ratio_World_to_LB")));
-    para->setPressRatio(StringUtil::toFloat(input->getValue("Delta_Press")));
-    para->setRealX(StringUtil::toFloat(input->getValue("SliceRealX")));
-    para->setRealY(StringUtil::toFloat(input->getValue("SliceRealY")));
-    para->setFactorPressBC(StringUtil::toFloat(input->getValue("dfpbc")));
-    para->setGeometryFileC(input->getValue("GeometryC"));
-    para->setGeometryFileM(input->getValue("GeometryM"));
-    para->setGeometryFileF(input->getValue("GeometryF"));
-    //////////////////////////////////////////////////////////////////////////
-    para->setgeoVec(gridPath + input->getValue("geoVec"));
-    para->setcoordX(gridPath + input->getValue("coordX"));
-    para->setcoordY(gridPath + input->getValue("coordY"));
-    para->setcoordZ(gridPath + input->getValue("coordZ"));
-    para->setneighborX(gridPath + input->getValue("neighborX"));
-    para->setneighborY(gridPath + input->getValue("neighborY"));
-    para->setneighborZ(gridPath + input->getValue("neighborZ"));
-    para->setscaleCFC(gridPath + input->getValue("scaleCFC"));
-    para->setscaleCFF(gridPath + input->getValue("scaleCFF"));
-    para->setscaleFCC(gridPath + input->getValue("scaleFCC"));
-    para->setscaleFCF(gridPath + input->getValue("scaleFCF"));
-    para->setscaleOffsetCF(gridPath + input->getValue("scaleOffsetCF"));
-    para->setscaleOffsetFC(gridPath + input->getValue("scaleOffsetFC"));
-    para->setgeomBoundaryBcQs(gridPath + input->getValue("geomBoundaryBcQs"));
-    para->setgeomBoundaryBcValues(gridPath + input->getValue("geomBoundaryBcValues"));
-    para->setinletBcQs(gridPath + input->getValue("inletBcQs"));
-    para->setinletBcValues(gridPath + input->getValue("inletBcValues"));
-    para->setoutletBcQs(gridPath + input->getValue("outletBcQs"));
-    para->setoutletBcValues(gridPath + input->getValue("outletBcValues"));
-    para->settopBcQs(gridPath + input->getValue("topBcQs"));
-    para->settopBcValues(gridPath + input->getValue("topBcValues"));
-    para->setbottomBcQs(gridPath + input->getValue("bottomBcQs"));
-    para->setbottomBcValues(gridPath + input->getValue("bottomBcValues"));
-    para->setfrontBcQs(gridPath + input->getValue("frontBcQs"));
-    para->setfrontBcValues(gridPath + input->getValue("frontBcValues"));
-    para->setbackBcQs(gridPath + input->getValue("backBcQs"));
-    para->setbackBcValues(gridPath + input->getValue("backBcValues"));
-    para->setnumberNodes(gridPath + input->getValue("numberNodes"));
-    para->setLBMvsSI(gridPath + input->getValue("LBMvsSI"));
-    //////////////////////////////gridPath + ////////////////////////////////////////////
-    para->setmeasurePoints(gridPath + input->getValue("measurePoints"));
-    para->setpropellerValues(gridPath + input->getValue("propellerValues"));
-    para->setclockCycleForMP(StringUtil::toFloat(input->getValue("measureClockCycle")));
-    para->settimestepForMP(StringUtil::toInt(input->getValue("measureTimestep")));
-    para->setcpTop(gridPath + input->getValue("cpTop"));
-    para->setcpBottom(gridPath + input->getValue("cpBottom"));
-    para->setcpBottom2(gridPath + input->getValue("cpBottom2"));
-    para->setConcentration(gridPath + input->getValue("Concentration"));
-    //////////////////////////////////////////////////////////////////////////
-    //Normals - Geometry
-    para->setgeomBoundaryNormalX(gridPath + input->getValue("geomBoundaryNormalX"));
-    para->setgeomBoundaryNormalY(gridPath + input->getValue("geomBoundaryNormalY"));
-    para->setgeomBoundaryNormalZ(gridPath + input->getValue("geomBoundaryNormalZ"));
-    //Normals - Inlet
-    para->setInflowBoundaryNormalX(gridPath + input->getValue("inletBoundaryNormalX"));
-    para->setInflowBoundaryNormalY(gridPath + input->getValue("inletBoundaryNormalY"));
-    para->setInflowBoundaryNormalZ(gridPath + input->getValue("inletBoundaryNormalZ"));
-    //Normals - Outlet
-    para->setOutflowBoundaryNormalX(gridPath + input->getValue("outletBoundaryNormalX"));
-    para->setOutflowBoundaryNormalY(gridPath + input->getValue("outletBoundaryNormalY"));
-    para->setOutflowBoundaryNormalZ(gridPath + input->getValue("outletBoundaryNormalZ"));
-    //////////////////////////////////////////////////////////////////////////
-    //Forcing
-    para->setForcing(StringUtil::toFloat(input->getValue("ForcingX")), StringUtil::toFloat(input->getValue("ForcingY")), StringUtil::toFloat(input->getValue("ForcingZ")));
-    //////////////////////////////////////////////////////////////////////////
-    //Particles
-    para->setCalcParticles(StringUtil::toBool(input->getValue("calcParticles")));
-    para->setParticleBasicLevel(StringUtil::toInt(input->getValue("baseLevel")));
-    para->setParticleInitLevel(StringUtil::toInt(input->getValue("initLevel")));
-    para->setNumberOfParticles(StringUtil::toInt(input->getValue("numberOfParticles")));
-    para->setneighborWSB(gridPath + input->getValue("neighborWSB"));
-    para->setStartXHotWall(StringUtil::toDouble(input->getValue("startXHotWall")));
-    para->setEndXHotWall(StringUtil::toDouble(input->getValue("endXHotWall")));
-    //////////////////////////////////////////////////////////////////////////
-    //for Multi GPU
-    if (para->getNumprocs() > 1)
-    {
-        ////////////////////////////////////////////////////////////////////////////
-        ////1D domain decomposition
-        //std::vector<std::string> sendProcNeighbors;
-        //std::vector<std::string> recvProcNeighbors;
-        //for (int i = 0; i<para->getNumprocs();i++)
-        //{
-        // sendProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "s.dat");
-        // recvProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "r.dat");
-        //}
-        //para->setPossNeighborFiles(sendProcNeighbors, "send");
-        //para->setPossNeighborFiles(recvProcNeighbors, "recv");
-        //////////////////////////////////////////////////////////////////////////
-        //3D domain decomposition
-        std::vector<std::string> sendProcNeighborsX, sendProcNeighborsY, sendProcNeighborsZ;
-        std::vector<std::string> recvProcNeighborsX, recvProcNeighborsY, recvProcNeighborsZ;
-        for (int i = 0; i < para->getNumprocs(); i++)
-        {
-            sendProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xs.dat");
-            sendProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Ys.dat");
-            sendProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zs.dat");
-            recvProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xr.dat");
-            recvProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Yr.dat");
-            recvProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zr.dat");
-        }
-        para->setPossNeighborFilesX(sendProcNeighborsX, "send");
-        para->setPossNeighborFilesY(sendProcNeighborsY, "send");
-        para->setPossNeighborFilesZ(sendProcNeighborsZ, "send");
-        para->setPossNeighborFilesX(recvProcNeighborsX, "recv");
-        para->setPossNeighborFilesY(recvProcNeighborsY, "recv");
-        para->setPossNeighborFilesZ(recvProcNeighborsZ, "recv");
-    }
-    //////////////////////////////////////////////////////////////////////////
-    //para->setkFull(             input->getValue( "kFull" ));
-    //para->setgeoFull(           input->getValue( "geoFull" ));
-    //para->setnoSlipBcPos(       input->getValue( "noSlipBcPos" ));
-    //para->setnoSlipBcQs(          input->getValue( "noSlipBcQs" ));
-    //para->setnoSlipBcValues(      input->getValue( "noSlipBcValues" ));
-    //para->setnoSlipBcValue(     input->getValue( "noSlipBcValue" ));
-    //para->setslipBcPos(         input->getValue( "slipBcPos" ));
-    //para->setslipBcQs(          input->getValue( "slipBcQs" ));
-    //para->setslipBcValue(       input->getValue( "slipBcValue" ));
-    //para->setpressBcPos(        input->getValue( "pressBcPos" ));
-    //para->setpressBcQs(           input->getValue( "pressBcQs" ));
-    //para->setpressBcValues(       input->getValue( "pressBcValues" ));
-    //para->setpressBcValue(      input->getValue( "pressBcValue" ));
-    //para->setvelBcQs(             input->getValue( "velBcQs" ));
-    //para->setvelBcValues(         input->getValue( "velBcValues" ));
-    //para->setpropellerCylinder( input->getValue( "propellerCylinder" ));
-    //para->setpropellerQs(		 input->getValue( "propellerQs"      ));
-    //para->setwallBcQs(            input->getValue( "wallBcQs"         ));
-    //para->setwallBcValues(        input->getValue( "wallBcValues"     ));
-    //para->setperiodicBcQs(        input->getValue( "periodicBcQs"     ));
-    //para->setperiodicBcValues(    input->getValue( "periodicBcValues" ));
-    //cout << "Try this: " << para->getgeomBoundaryBcValues() << endl;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    //Restart
-    para->setTimeDoCheckPoint(StringUtil::toInt(input->getValue("TimeDoCheckPoint")));
-    para->setTimeDoRestart(StringUtil::toInt(input->getValue("TimeDoRestart")));
-    para->setDoCheckPoint(StringUtil::toBool(input->getValue("DoCheckPoint")));
-    para->setDoRestart(StringUtil::toBool(input->getValue("DoRestart")));
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    para->setMaxLevel(StringUtil::toInt(input->getValue("NOGL")));
-    para->setGridX(StringUtil::toIntVector(input->getValue("GridX")));                           
-    para->setGridY(StringUtil::toIntVector(input->getValue("GridY")));                           
-    para->setGridZ(StringUtil::toIntVector(input->getValue("GridZ")));                  
-    para->setDistX(StringUtil::toIntVector(input->getValue("DistX")));                  
-    para->setDistY(StringUtil::toIntVector(input->getValue("DistY")));                  
-    para->setDistZ(StringUtil::toIntVector(input->getValue("DistZ")));                
-
-    para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
-}
-
-
-
-void multipleLevel(const std::string& configPath)
-{
-    auto gridFactory = GridFactory::make();
-    gridFactory->setGridStrategy(Device::CPU);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
-
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-    
-    SPtr<Parameter> para = Parameter::make();
-    BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
-    SPtr<GridProvider> gridGenerator;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    bool useGridGenerator = true;
-
-    if(useGridGenerator){
-
-        enum testCase{
-			TGV,
-			TGV3D,
-			Sphere,
-			DrivAer,
-            DLC,
-            MultiGPU
-        };
-
-        int testcase = TGV3D;
-        
-		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		if (testcase == TGV)
-		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		{
-			real dx = 1.0;
-			real vx = 0.049;
-			//////////////////////////////////////////////////////////////////////////
-			//32
-			gridBuilder->addCoarseGrid(-24, -2, -16,
-										24,  2,  16, dx);
-			//////////////////////////////////////////////////////////////////////////
-			gridBuilder->setPeriodicBoundaryCondition(true, true, true);
-			//////////////////////////////////////////////////////////////////////////
-			gridBuilder->buildGrids(true); 
-			//////////////////////////////////////////////////////////////////////////
-			SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
-			//////////////////////////////////////////////////////////////////////////
-			gridBuilder->writeGridsToVtk("E:/temp/TaylorGreenVortex/results/32/TGV32turned_Grid");
-			gridBuilder->writeArrows("E:/temp/TaylorGreenVortex/results/32/TGV32turned_Grid_arrow");
-			//////////////////////////////////////////////////////////////////////////
-			SimulationFileWriter::write("E:/temp/TaylorGreenVortex/grids/turned/gridUni48x4x32/", gridBuilder, FILEFORMAT::BINARY);
-			//////////////////////////////////////////////////////////////////////////
-			return;
-			gridGenerator = GridGenerator::make(gridBuilder, para);
-		}
-
-		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		if (testcase == TGV3D)
-		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		{
-			const real PI = 3.141592653589793238462643383279;
-
-			real dx = 2.0 * PI / 32.0; // 32^3 nodes
-			//real dx = 2.0 * PI / 64.0; // 64^3 nodes
-			//real dx = 2.0 * PI / 128.0; // 128^3 nodes
-			//real dx = 2.0 * PI / 256.0; // 128^3 nodes
-			real vx = 0.049;
-
-			gridBuilder->addCoarseGrid(-PI, -PI, -PI,
-										PI,  PI,  PI, dx);
-
-			gridBuilder->setPeriodicBoundaryCondition(true, true, true);
-
-			gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
-			//////////////////////////////////////////////////////////////////////////
-			SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
-			//////////////////////////////////////////////////////////////////////////
-			//32
-			gridBuilder->writeGridsToVtk("E:/temp/TaylorGreenVortex/results3D/32/TGV3D_Grid");
-			gridBuilder->writeArrows("E:/temp/TaylorGreenVortex/results3D/32/TGV3D_Grid_arrow");
-			SimulationFileWriter::write("E:/temp/TaylorGreenVortex/grids3D/gridTGV3D/32/", gridBuilder, FILEFORMAT::BINARY); //FILEFORMAT::ASCII
-			//256
-		    //gridBuilder->writeGridsToVtk("E:/temp/TaylorGreenVortex/results3D/256/TGV3D_Grid");
-			//gridBuilder->writeArrows("E:/temp/TaylorGreenVortex/results3D/256/TGV3D_Grid_arrow");
-			//SimulationFileWriter::write("E:/temp/TaylorGreenVortex/grids3D/gridTGV3D/256/", gridBuilder, FILEFORMAT::BINARY); //FILEFORMAT::ASCII
-
-			//return;
-
-			gridGenerator = GridGenerator::make(gridBuilder, para);
-		}
-
-		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        if( testcase == Sphere)
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        {
-            real dx = 0.2;
-            real vx = 0.05;
-
-            auto SphereSTL = std::make_shared<TriangularMesh>("E:/temp/GridSphere/2018/STL/SphereNotOptimal.stl");
-
-            gridBuilder->addCoarseGrid(- 5.0, -5.0, -5.0,
-                                        10.0,  5.0,  5.0, dx);  // DrivAer
-
-            gridBuilder->setNumberOfLayers(10,8);
-            gridBuilder->addGrid(SphereSTL, 2);
-        
-            gridBuilder->addGeometry(SphereSTL);
-
-            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
-
-            gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
-            //////////////////////////////////////////////////////////////////////////
-            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
-
-            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
-
-            bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityCompressible);
-            bcFactory.setGeometryBoundaryCondition(BoundaryConditionFactory::NoSlipBC::NoSlipCompressible);
-            bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::PressureNonEquilibriumCompressible);
-            //////////////////////////////////////////////////////////////////////////
-            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
-            //////////////////////////////////////////////////////////////////////////
-
-            gridBuilder->writeGridsToVtk("E:/temp/GridSphere/2018/grids/outSphere/SphereBig3_Grid");
-            gridBuilder->writeArrows    ("E:/temp/GridSphere/2018/grids/outSphere/SphereBig3_Grid_arrow");
-
-            SimulationFileWriter::write("E:/temp/GridSphere/2018/grids/gridSphere/3lev_dxC_0_2/", gridBuilder, FILEFORMAT::BINARY); //FILEFORMAT::ASCII
-
-            //return;
-
-            gridGenerator = GridGenerator::make(gridBuilder, para);
-        }
-
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        if( testcase == DrivAer )
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        {
-            real dx = 0.2;
-            real vx = 0.05;
-
-            auto DrivAerSTL = std::make_shared<TriangularMesh>("F:/Work/Computations/gridGenerator/stl/DrivAer_Fastback_Coarse.stl");
-            //auto triangularMesh = std::make_shared<TriangularMesh>("M:/TestGridGeneration/STL/DrivAer_NoSTLGroups.stl");
-            //auto triangularMesh = std::make_shared<TriangularMesh>("M:/TestGridGeneration/STL/DrivAer_Coarse.stl");
-            //auto DrivAerSTL = std::make_shared<TriangularMesh>("stl/DrivAer_Fastback_Coarse.stl");
-
-            auto DrivAerRefBoxSTL = std::make_shared<TriangularMesh>("F:/Work/Computations/gridGenerator/stl/DrivAer_REF_BOX_Adrea.stl");
-            //auto DrivAerRefBoxSTL = std::make_shared<TriangularMesh>("stl/DrivAer_REF_BOX_Adrea.stl");
-
-            real z0 = 0.318+0.5*dx;
-
-            gridBuilder->addCoarseGrid(- 5.0, -5.0, 0.0 - z0,
-                                        15.0,  5.0, 5.0 - z0, dx);  // DrivAer
-
-            //Object* floorBox = std::make_shared<Cuboid>( -0.3, -1, -1, 4.0, 1, 0.2 );
-            //Object* wakeBox  = std::make_shared<Cuboid>(  3.5, -1, -1, 5.5, 1, 0.8 );
-
-            //Conglomerate* refRegion = new Conglomerate();
-
-            //refRegion->add(floorBox);
-            //refRegion->add(wakeBox);
-            //refRegion->add(DrivAerRefBoxSTL);
-
-            gridBuilder->setNumberOfLayers(10,8);
-            gridBuilder->addGrid(DrivAerRefBoxSTL, 2);
-        
-            //gridBuilder->setNumberOfLayers(10,8);
-            //gridBuilder->addGrid(DrivAerSTL, 5);
-
-            gridBuilder->addGeometry(DrivAerSTL);
-
-            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
-
-            gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
-
-            //////////////////////////////////////////////////////////////////////////
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
-
-            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
-
-            bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityAndPressureCompressible);
-            bcFactory.setGeometryBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityCompressible);
-            bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflective);
-
-            //////////////////////////////////////////////////////////////////////////
-
-            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
-
-            gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 4, 0.0075, -2.0, 0.0,
-                                                                                                                                     0.0075,  2.0, 0.0, -vx, 0.318);
-            gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, 3, 2.793 , -2.0, 0.0,
-                                                                                                                                     2.793 ,  2.0, 0.0, -vx, 0.318);
-
-            //////////////////////////////////////////////////////////////////////////
-
-            gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/DrivAer_Grid");
-            gridBuilder->writeArrows    ("F:/Work/Computations/gridGenerator/grid/DrivAer_Grid_arrow");
-
-            //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
-            //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
-            SimulationFileWriter::write("F:/Work/Computations/gridGenerator/grid/", gridBuilder, FILEFORMAT::BINARY);
-            //SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
-
-            return;
-
-            gridGenerator = GridGenerator::make(gridBuilder, para);
-        }
-
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        if( testcase == DLC )
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        {
-			real velocityRatio = 594.093427;
-
-			real dx = 0.2;
-			real vx = 0.065272188;
-
-			real z0 = 0.24395 + 0.5*dx;
-
-            std::vector<uint> ignorePatches = { 152, 153, 154 };
-
-            //auto VW370_SERIE_STL = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/VW370_SERIE.stl", ignorePatches);
-            auto VW370_SERIE_STL = std::make_shared<TriangularMesh>("stl/VW370_SERIE.stl", ignorePatches);
-
-            //auto DLC_RefBox = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox.stl");
-
-            //auto DLC_RefBox_1 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_4m.stl");
-            //auto DLC_RefBox_2 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_3m.stl");
-            //auto DLC_RefBox_3 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_2m.stl");
-            //auto DLC_RefBox_4 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.stl");
-
-            //auto DLC_RefBox_Level_3 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC/DLC_RefBox_Level_3.stl");
-            //auto DLC_RefBox_Level_4 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC/DLC_RefBox_Level_4.stl");
-            //auto DLC_RefBox_Level_5 = std::make_shared<TriangularMesh>("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC/DLC_RefBox_Level_5.stl");
-
-            auto DLC_RefBox_Level_3 = std::make_shared<TriangularMesh>("stl/DLC/DLC_RefBox_Level_3.stl");
-            auto DLC_RefBox_Level_4 = std::make_shared<TriangularMesh>("stl/DLC/DLC_RefBox_Level_4.stl");
-            auto DLC_RefBox_Level_5 = std::make_shared<TriangularMesh>("stl/DLC/DLC_RefBox_Level_5.stl");
-
-            //auto VW370_SERIE_STL = std::make_shared<TriangularMesh>("stl/VW370_SERIE.stl", ignorePatches);
-            //auto DLC_RefBox = std::make_shared<TriangularMesh>("stl/DLC_RefBox.lnx.stl");
-            //auto DLC_RefBox_4 = std::make_shared<TriangularMesh>("stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.lnx.stl");
-
-            gridBuilder->addCoarseGrid(-30.0, -20.0,  0.0 - z0,
-                                        50.0,  20.0, 25.0 - z0, dx);
-            
-            gridBuilder->setNumberOfLayers(10,8);
-            gridBuilder->addGrid( std::make_shared<Cuboid>( - 6.6, -6, -0.7, 20.6 , 6, 5.3  ), 1 );
-            gridBuilder->addGrid( std::make_shared<Cuboid>( -3.75, -3, -0.7, 11.75, 3, 2.65 ), 2 );
-
-            gridBuilder->setNumberOfLayers(10,8);
-            gridBuilder->addGrid(DLC_RefBox_Level_3, 3);
-            gridBuilder->addGrid(DLC_RefBox_Level_4, 4);
-        
-            Conglomerate* refinement = new Conglomerate();
-            refinement->add(DLC_RefBox_Level_5);
-            refinement->add(VW370_SERIE_STL);
-
-            gridBuilder->setNumberOfLayers(10,8);
-            gridBuilder->addGrid(refinement, 5);
-
-            gridBuilder->addGeometry(VW370_SERIE_STL);
-
-            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
-
-            gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
-
-            //////////////////////////////////////////////////////////////////////////
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
-
-            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
-
-            bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityAndPressureCompressible);
-            bcFactory.setGeometryBoundaryCondition(BoundaryConditionFactory::NoSlipBC::NoSlipCompressible);
-            bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflective);
-
-            //////////////////////////////////////////////////////////////////////////
-
-            SPtr<Grid> grid = gridBuilder->getGrid(gridBuilder->getNumberOfLevels() - 1);
-
-            real wheelsFrontX = -0.081;
-            real wheelsRearX  =  2.5486;
-
-            real wheelsFrontZ =  0.0504;
-            real wheelsRearZ  =  0.057;
-
-            real wheelsRadius =  0.318;
-
-			real wheelRotationFrequency = 1170.74376 / 60.0;
-
-			real wheelTangentialVelocity = -2.0 * M_PI * wheelsRadius * wheelRotationFrequency / velocityRatio;
-
-            std::vector<uint> frontWheelPatches = { 71, 86, 87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97, 159 };
-            std::vector<uint> rearWheelPatches  = { 82, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 160 };
-
-            for( uint patch : frontWheelPatches ){
-                gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsFrontX, -2.0, wheelsFrontZ,
-                                                                                                                                             wheelsFrontX,  2.0, wheelsFrontZ, 
-					                                                                                                                         wheelTangentialVelocity, wheelsRadius);
-            }
-
-            for( uint patch : rearWheelPatches ){
-                gridBuilder->getGeometryBoundaryCondition(gridBuilder->getNumberOfLevels() - 1)->setTangentialVelocityForPatch( grid, patch, wheelsRearX , -2.0, wheelsRearZ ,
-                                                                                                                                             wheelsRearX ,  2.0, wheelsRearZ , 
-					                                                                                                                         wheelTangentialVelocity, wheelsRadius);
-            }
-
-            //////////////////////////////////////////////////////////////////////////
-
-            //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/DLC_Grid");
-            //gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/grid/DLC_Grid_arrow");
-
-            gridBuilder->writeGridsToVtk("grid/DLC_Grid");
-            gridBuilder->writeArrows    ("grid/DLC_Grid_arrow");
-
-            //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
-            //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
-            SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
-
-            gridGenerator = GridGenerator::make(gridBuilder, para);
-        }
-
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        if( testcase == MultiGPU )
-        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        {
-            //const uint generatePart = 1;
-            const uint generatePart = Communicator::getInstanz()->getPID();
-            
-            std::ofstream logFile2;
-            
-            if( generatePart == 0 )
-                logFile2.open( "F:/Work/Computations/gridGenerator/grid/0/gridGeneratorLog.txt" );
-                //logFile2.open( "grid/0/gridGeneratorLog.txt" );
-            
-            if( generatePart == 1 )
-                logFile2.open( "F:/Work/Computations/gridGenerator/grid/1/gridGeneratorLog.txt" );
-                //logFile2.open( "grid/1/gridGeneratorLog.txt" );
-
-            real dx = 1.0 / 40.0;
-            real vx = 0.05;
-
-            auto triangularMesh = std::make_shared<TriangularMesh>("F:/Work/Computations/gridGenerator/stl/ShpereNotOptimal.stl");
-            //auto triangularMesh = std::make_shared<TriangularMesh>("stl/ShpereNotOptimal.lnx.stl");
-
-            // all
-            //gridBuilder->addCoarseGrid(-2, -2, -2,  
-            //                            4,  2,  2, dx);
-
-            real overlap = 10.0 * dx;
-
-            if( generatePart == 0 )
-                gridBuilder->addCoarseGrid(-2.0          , -2.0, -2.0,  
-                                            0.5 + overlap,  2.0,  2.0, dx);
-
-            if( generatePart == 1 )
-                gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0,  
-                                            4.0          ,  2.0,  2.0, dx);
-
-
-            gridBuilder->setNumberOfLayers(10,8);
-            gridBuilder->addGrid(triangularMesh, 1);
-
-            gridBuilder->addGeometry(triangularMesh);
-            
-            if( generatePart == 0 )
-                gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, 
-                                                                             -2.0, 2.0, 
-                                                                             -2.0, 2.0 ) );
-            
-            if( generatePart == 1 )
-                gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>(  0.5, 4.0, 
-                                                                             -2.0, 2.0, 
-                                                                             -2.0, 2.0 ) );
-
-            gridBuilder->setPeriodicBoundaryCondition(false, false, false);
-
-            gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
-            
-            if( generatePart == 0 ){
-                gridBuilder->findCommunicationIndices(CommunicationDirections::PX, LBM);
-                gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 1);
-            }
-            
-            if( generatePart == 1 ){
-                gridBuilder->findCommunicationIndices(CommunicationDirections::MX, LBM);
-                gridBuilder->setCommunicationProcess(CommunicationDirections::MX, 0);
-            }
-
-            //////////////////////////////////////////////////////////////////////////
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
-
-            if (generatePart == 0) {
-                gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-            }
-            if (generatePart == 1) {
-                gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-            }
-
-            gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
-
-            bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityCompressible);
-            bcFactory.setGeometryBoundaryCondition(BoundaryConditionFactory::NoSlipBC::NoSlipCompressible);
-            bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::PressureNonEquilibriumCompressible);
-            //////////////////////////////////////////////////////////////////////////
-
-            if (generatePart == 0) {
-                //gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/0/Test_");
-                //gridBuilder->writeArrows    ("F:/Work/Computations/gridGenerator/grid/0/Test_Arrow");
-            }
-            if (generatePart == 1) {
-                //gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/1/Test_");
-                //gridBuilder->writeArrows    ("F:/Work/Computations/gridGenerator/grid/1/Test_Arrow");
-            }
-
-            if (generatePart == 0)
-                SimulationFileWriter::write("F:/Work/Computations/gridGenerator/grid/0/", gridBuilder, FILEFORMAT::ASCII);
-                //SimulationFileWriter::write("grid/0/", gridBuilder, FILEFORMAT::ASCII);
-            if (generatePart == 1)
-                SimulationFileWriter::write("F:/Work/Computations/gridGenerator/grid/1/", gridBuilder, FILEFORMAT::ASCII);
-                //SimulationFileWriter::write("grid/1/", gridBuilder, FILEFORMAT::ASCII);
-
-            //return;
-
-            gridGenerator = GridGenerator::make(gridBuilder, para);
-        }
-
-    }
-    else
-    {
-        gridGenerator = GridReader::make(FileFormat::BINARY, para);
-        //gridGenerator = GridReader::make(FileFormat::ASCII, para);
-    }
-
-    logFile.close();
-
-    //return;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-    std::ifstream stream;
-    stream.open(configPath.c_str(), std::ios::in);
-    if (stream.fail())
-        throw std::runtime_error("can not open config file!");
-
-    UPtr<input::Input> input = input::Input::makeInput(stream, "config");
-
-    setParameters(para, input);
-
-    Simulation sim;
-    SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
-    sim.init(para, gridGenerator, fileWriter);
-    sim.run();
-}
-
-
-int main( int argc, char* argv[])
-{
-     MPI_Init(&argc, &argv);
-    std::string str, str2; 
-    if ( argv != NULL )
-    {
-        str = static_cast<std::string>(argv[0]);
-        if (argc > 1)
-        {
-            str2 = static_cast<std::string>(argv[1]);
-            try
-            {
-                multipleLevel(str2);
-            }
-            catch (const std::exception& e)
-            {
-                //MPI_Abort(MPI_COMM_WORLD, -1);
-            }
-            catch (...)
-            {
-                std::cout << "unknown exeption" << std::endl;
-            }
-        }
-        else
-        {
-            try
-            {
-                //multipleLevel("C:/Users/schoen/Desktop/bin/3D/VirtualFluidsGpuCodes/Sphere/configSphere.txt");
-				multipleLevel("C:/Users/schoen/Desktop/bin/3D/VirtualFluidsGpuCodes/TGV3D/configTGV3D.txt");
-			}
-            catch (const std::exception& e)
-            {
-                std::cout << e.what() << std::flush;
-                //MPI_Abort(MPI_COMM_WORLD, -1);
-            }
-            catch (const std::bad_alloc e)
-            {
-                std::cout << e.what() << std::flush;
-                //MPI_Abort(MPI_COMM_WORLD, -1);
-            }
-            catch (...)
-            {
-                std::cout << "unknown exeption" << std::endl;
-            }
-
-            std::cout << "\nConfiguration file must be set!: lbmgm <config file>" << std::endl << std::flush;
-            //MPI_Abort(MPI_COMM_WORLD, -1);
-        }
-    }
-
-
-   /*
-   MPE_Init_log() & MPE_Finish_log() are NOT needed when
-   liblmpe.a is linked with this program.  In that case,
-   MPI_Init() would have called MPE_Init_log() already.
-   */
-#if defined( MPI_LOGGING )
-   MPE_Init_log();
-#endif
-
-#if defined( MPI_LOGGING )
-   if ( argv != NULL )
-      MPE_Finish_log( argv[0] );
-   if ( str != "" )
-      MPE_Finish_log( str.c_str() );
-   else
-      MPE_Finish_log( "TestLog" );
-#endif
-
-   MPI_Finalize();
-   return 0;
-}
diff --git a/apps/gpu/LBM/metisTest/3rdPartyLinking.cmake b/apps/gpu/LBM/metisTest/3rdPartyLinking.cmake
deleted file mode 100644
index 6dd6ba1bc73e73dfbf01a3cc36aaeb3664e1c04c..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/metisTest/3rdPartyLinking.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/MPI/Link.cmake)
-linkMPI(${targetName})
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/Cuda/Link.cmake)
-linkCuda(${targetName})
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/Boost/Link.cmake)
-linkBoost(${targetName} "serialization")
-include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/Metis/Link.cmake)
-linkMetis(${targetName})
-
-if(HULC.BUILD_JSONCPP)
-  include (${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/JsonCpp/Link.cmake)
-  linkJsonCpp(${targetName})
-endif()
\ No newline at end of file
diff --git a/apps/gpu/LBM/metisTest/CMakeLists.txt b/apps/gpu/LBM/metisTest/CMakeLists.txt
deleted file mode 100644
index 6ef6241b52aa9b5dc73a19b82f2b9fd5248c77c5..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/metisTest/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-setTargetNameToFolderName(${CMAKE_CURRENT_LIST_DIR}) 
-
-set(linkDirectories "")
-set(libsToLink VirtualFluids_GPU GridGenerator)
-set(includeDirectories "${CMAKE_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/src/VirtualFluids_GPU" "${CMAKE_SOURCE_DIR}/src/GridGenerator" "${CMAKE_SOURCE_DIR}/src/VirtualFluidsBasics")
-
-#glob files and save in MY_SRCS
-include(CMakePackage.cmake)
-
-buildExe(${targetName} "${MY_SRCS}" "${linkDirectories}" "${libsToLink}" "${includeDirectories}")
-groupTarget(${targetName} ${lbmAppFolder})
-
-# Specify the linking to 3rdParty libs
-include(3rdPartyLinking.cmake)
\ No newline at end of file
diff --git a/apps/gpu/LBM/metisTest/CMakePackage.cmake b/apps/gpu/LBM/metisTest/CMakePackage.cmake
deleted file mode 100644
index 5d39e3804dbd180790629111449a7dc918292430..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/metisTest/CMakePackage.cmake
+++ /dev/null
@@ -1,9 +0,0 @@
-#FILE ENDINGS
-resetFileEndingsToCollect()
-addCAndCPPFileTypes()
-addFileEndingToCollect("*.cu")
-addFileEndingToCollect("*.cuh")
-
-#GLOB SOURCE FILES IN MY_SRCS
-unset(MY_SRCS)
-includeRecursiveAllFilesFrom(${targetName} ${CMAKE_CURRENT_LIST_DIR})
\ No newline at end of file
diff --git a/apps/gpu/LBM/metisTest/main.cpp b/apps/gpu/LBM/metisTest/main.cpp
deleted file mode 100644
index 9edfb9e853f1c4fff6872b15e93d4de94bd35095..0000000000000000000000000000000000000000
--- a/apps/gpu/LBM/metisTest/main.cpp
+++ /dev/null
@@ -1,829 +0,0 @@
-//#define MPI_LOGGING
-
-
-#include <mpi.h>
-#if defined( MPI_LOGGING )
-	#include <mpe.h>
-#endif
-
-#include <string>
-#include <iostream>
-#include <stdexcept>
-#include <fstream>
-#define _USE_MATH_DEFINES
-#include <math.h>
-
-#include "metis.h"
-
-#include "Input/Input.h"
-#include "StringUtilities/StringUtil.h"
-
-#include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
-#include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Output/FileWriter.h"
-
-#include "global.h"
-
-#include "geometries/Sphere/Sphere.h"
-#include "geometries/VerticalCylinder/VerticalCylinder.h"
-#include "geometries/Cuboid/Cuboid.h"
-#include "geometries/TriangularMesh/TriangularMesh.h"
-#include "geometries/Conglomerate/Conglomerate.h"
-#include "geometries/TriangularMesh/TriangularMeshStrategy.h"
-
-#include "grid/GridBuilder/LevelGridBuilder.h"
-#include "grid/GridBuilder/MultipleGridBuilder.h"
-#include "grid/BoundaryConditions/Side.h"
-#include "grid/BoundaryConditions/BoundaryCondition.h"
-#include "grid/GridFactory.h"
-
-#include "io/SimulationFileWriter/SimulationFileWriter.h"
-#include "io/GridVTKWriter/GridVTKWriter.h"
-#include "io/STLReaderWriter/STLReader.h"
-#include "io/STLReaderWriter/STLWriter.h"
-
-#include "utilities/math/Math.h"
-#include "utilities/communication.h"
-#include "utilities/transformator/TransformatorImp.h"
-
-using namespace vf::gpu;
-
-std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
-{
-    if (para->getNumprocs() == 1)
-        return Gridpath + "/";
-    
-    return Gridpath + "/" + StringUtil::toString(para->getMyID()) + "/";
-}
-
-void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input> &input)
-{
-	Communicator* comm = Communicator::getInstanz();
-
-	para->setMaxDev(StringUtil::toInt(input->getValue("NumberOfDevices")));
-	para->setNumprocs(comm->getNumberOfProcess());
-	para->setDevices(StringUtil::toUintVector(input->getValue("Devices")));
-	para->setMyID(comm->getPID());
-	
-	std::string _path = input->getValue("Path");
-    std::string _prefix = input->getValue("Prefix");
-    std::string _gridpath = input->getValue("GridPath");
-    std::string gridPath = getGridPath(para, _gridpath);
-    para->setOutputPath(_path);
-    para->setOutputPrefix(_prefix);
-    para->setPathAndFilename(_path + "/" + _prefix);
-    para->setPrintFiles(false);
-    para->setPrintFiles(StringUtil::toBool(input->getValue("WriteGrid")));
-    para->setGeometryValues(StringUtil::toBool(input->getValue("GeometryValues")));
-    para->setCalc2ndOrderMoments(StringUtil::toBool(input->getValue("calc2ndOrderMoments")));
-    para->setCalc3rdOrderMoments(StringUtil::toBool(input->getValue("calc3rdOrderMoments")));
-    para->setCalcHighOrderMoments(StringUtil::toBool(input->getValue("calcHigherOrderMoments")));
-    para->setReadGeo(StringUtil::toBool(input->getValue("ReadGeometry")));
-    para->setCalcMedian(StringUtil::toBool(input->getValue("calcMedian")));
-    para->setConcFile(StringUtil::toBool(input->getValue("UseConcFile")));
-    para->setUseMeasurePoints(StringUtil::toBool(input->getValue("UseMeasurePoints")));
-    para->setUseWale(StringUtil::toBool(input->getValue("UseWale")));
-    para->setSimulatePorousMedia(StringUtil::toBool(input->getValue("SimulatePorousMedia")));
-    para->setD3Qxx(StringUtil::toInt(input->getValue("D3Qxx")));
-    para->setTimestepEnd(StringUtil::toInt(input->getValue("TimeEnd")));
-    para->setTimestepOut(StringUtil::toInt(input->getValue("TimeOut")));
-    para->setTimestepStartOut(StringUtil::toInt(input->getValue("TimeStartOut")));
-    para->setTimeCalcMedStart(StringUtil::toInt(input->getValue("TimeStartCalcMedian")));
-    para->setTimeCalcMedEnd(StringUtil::toInt(input->getValue("TimeEndCalcMedian")));
-    para->setPressInID(StringUtil::toInt(input->getValue("PressInID")));
-    para->setPressOutID(StringUtil::toInt(input->getValue("PressOutID")));
-    para->setPressInZ(StringUtil::toInt(input->getValue("PressInZ")));
-    para->setPressOutZ(StringUtil::toInt(input->getValue("PressOutZ")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setDiffOn(StringUtil::toBool(input->getValue("DiffOn")));
-    para->setDiffMod(StringUtil::toInt(input->getValue("DiffMod")));
-    para->setDiffusivity(StringUtil::toFloat(input->getValue("Diffusivity")));
-    para->setTemperatureInit(StringUtil::toFloat(input->getValue("Temp")));
-    para->setTemperatureBC(StringUtil::toFloat(input->getValue("TempBC")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setViscosityLB(StringUtil::toFloat(input->getValue("Viscosity_LB")));
-    para->setVelocityLB(StringUtil::toFloat(input->getValue("Velocity_LB")));
-    para->setViscosityRatio(StringUtil::toFloat(input->getValue("Viscosity_Ratio_World_to_LB")));
-    para->setVelocityRatio(StringUtil::toFloat(input->getValue("Velocity_Ratio_World_to_LB")));
-    para->setDensityRatio(StringUtil::toFloat(input->getValue("Density_Ratio_World_to_LB")));
-    para->setPressRatio(StringUtil::toFloat(input->getValue("Delta_Press")));
-    para->setRealX(StringUtil::toFloat(input->getValue("SliceRealX")));
-    para->setRealY(StringUtil::toFloat(input->getValue("SliceRealY")));
-    para->setFactorPressBC(StringUtil::toFloat(input->getValue("dfpbc")));
-    para->setGeometryFileC(input->getValue("GeometryC"));
-    para->setGeometryFileM(input->getValue("GeometryM"));
-    para->setGeometryFileF(input->getValue("GeometryF"));
-    //////////////////////////////////////////////////////////////////////////
-    para->setgeoVec(gridPath + input->getValue("geoVec"));
-    para->setcoordX(gridPath + input->getValue("coordX"));
-    para->setcoordY(gridPath + input->getValue("coordY"));
-    para->setcoordZ(gridPath + input->getValue("coordZ"));
-    para->setneighborX(gridPath + input->getValue("neighborX"));
-    para->setneighborY(gridPath + input->getValue("neighborY"));
-    para->setneighborZ(gridPath + input->getValue("neighborZ"));
-    para->setscaleCFC(gridPath + input->getValue("scaleCFC"));
-    para->setscaleCFF(gridPath + input->getValue("scaleCFF"));
-    para->setscaleFCC(gridPath + input->getValue("scaleFCC"));
-    para->setscaleFCF(gridPath + input->getValue("scaleFCF"));
-    para->setscaleOffsetCF(gridPath + input->getValue("scaleOffsetCF"));
-    para->setscaleOffsetFC(gridPath + input->getValue("scaleOffsetFC"));
-    para->setgeomBoundaryBcQs(gridPath + input->getValue("geomBoundaryBcQs"));
-    para->setgeomBoundaryBcValues(gridPath + input->getValue("geomBoundaryBcValues"));
-    para->setinletBcQs(gridPath + input->getValue("inletBcQs"));
-    para->setinletBcValues(gridPath + input->getValue("inletBcValues"));
-    para->setoutletBcQs(gridPath + input->getValue("outletBcQs"));
-    para->setoutletBcValues(gridPath + input->getValue("outletBcValues"));
-    para->settopBcQs(gridPath + input->getValue("topBcQs"));
-    para->settopBcValues(gridPath + input->getValue("topBcValues"));
-    para->setbottomBcQs(gridPath + input->getValue("bottomBcQs"));
-    para->setbottomBcValues(gridPath + input->getValue("bottomBcValues"));
-    para->setfrontBcQs(gridPath + input->getValue("frontBcQs"));
-    para->setfrontBcValues(gridPath + input->getValue("frontBcValues"));
-    para->setbackBcQs(gridPath + input->getValue("backBcQs"));
-    para->setbackBcValues(gridPath + input->getValue("backBcValues"));
-    para->setnumberNodes(gridPath + input->getValue("numberNodes"));
-    para->setLBMvsSI(gridPath + input->getValue("LBMvsSI"));
-    //////////////////////////////gridPath + ////////////////////////////////////////////
-    para->setmeasurePoints(gridPath + input->getValue("measurePoints"));
-    para->setpropellerValues(gridPath + input->getValue("propellerValues"));
-    para->setclockCycleForMP(StringUtil::toFloat(input->getValue("measureClockCycle")));
-    para->settimestepForMP(StringUtil::toInt(input->getValue("measureTimestep")));
-    para->setcpTop(gridPath + input->getValue("cpTop"));
-    para->setcpBottom(gridPath + input->getValue("cpBottom"));
-    para->setcpBottom2(gridPath + input->getValue("cpBottom2"));
-    para->setConcentration(gridPath + input->getValue("Concentration"));
-    //////////////////////////////////////////////////////////////////////////
-    //Normals - Geometry
-    para->setgeomBoundaryNormalX(gridPath + input->getValue("geomBoundaryNormalX"));
-    para->setgeomBoundaryNormalY(gridPath + input->getValue("geomBoundaryNormalY"));
-    para->setgeomBoundaryNormalZ(gridPath + input->getValue("geomBoundaryNormalZ"));
-    //Normals - Inlet
-    para->setInflowBoundaryNormalX(gridPath + input->getValue("inletBoundaryNormalX"));
-    para->setInflowBoundaryNormalY(gridPath + input->getValue("inletBoundaryNormalY"));
-    para->setInflowBoundaryNormalZ(gridPath + input->getValue("inletBoundaryNormalZ"));
-    //Normals - Outlet
-    para->setOutflowBoundaryNormalX(gridPath + input->getValue("outletBoundaryNormalX"));
-    para->setOutflowBoundaryNormalY(gridPath + input->getValue("outletBoundaryNormalY"));
-    para->setOutflowBoundaryNormalZ(gridPath + input->getValue("outletBoundaryNormalZ"));
-    //////////////////////////////////////////////////////////////////////////
-    //Forcing
-    para->setForcing(StringUtil::toFloat(input->getValue("ForcingX")), StringUtil::toFloat(input->getValue("ForcingY")), StringUtil::toFloat(input->getValue("ForcingZ")));
-    //////////////////////////////////////////////////////////////////////////
-    //Particles
-    para->setCalcParticles(StringUtil::toBool(input->getValue("calcParticles")));
-    para->setParticleBasicLevel(StringUtil::toInt(input->getValue("baseLevel")));
-    para->setParticleInitLevel(StringUtil::toInt(input->getValue("initLevel")));
-    para->setNumberOfParticles(StringUtil::toInt(input->getValue("numberOfParticles")));
-    para->setneighborWSB(gridPath + input->getValue("neighborWSB"));
-    para->setStartXHotWall(StringUtil::toDouble(input->getValue("startXHotWall")));
-    para->setEndXHotWall(StringUtil::toDouble(input->getValue("endXHotWall")));
-    //////////////////////////////////////////////////////////////////////////
-    //for Multi GPU
-    if (para->getNumprocs() > 1)
-    {
-        ////////////////////////////////////////////////////////////////////////////
-        ////1D domain decomposition
-        //std::vector<std::string> sendProcNeighbors;
-        //std::vector<std::string> recvProcNeighbors;
-        //for (int i = 0; i<para->getNumprocs();i++)
-        //{
-        // sendProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "s.dat");
-        // recvProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "r.dat");
-        //}
-        //para->setPossNeighborFiles(sendProcNeighbors, "send");
-        //para->setPossNeighborFiles(recvProcNeighbors, "recv");
-        //////////////////////////////////////////////////////////////////////////
-        //3D domain decomposition
-        std::vector<std::string> sendProcNeighborsX, sendProcNeighborsY, sendProcNeighborsZ;
-        std::vector<std::string> recvProcNeighborsX, recvProcNeighborsY, recvProcNeighborsZ;
-        for (int i = 0; i < para->getNumprocs(); i++)
-        {
-            sendProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xs.dat");
-            sendProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Ys.dat");
-            sendProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zs.dat");
-            recvProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xr.dat");
-            recvProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Yr.dat");
-            recvProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zr.dat");
-        }
-        para->setPossNeighborFilesX(sendProcNeighborsX, "send");
-        para->setPossNeighborFilesY(sendProcNeighborsY, "send");
-        para->setPossNeighborFilesZ(sendProcNeighborsZ, "send");
-        para->setPossNeighborFilesX(recvProcNeighborsX, "recv");
-        para->setPossNeighborFilesY(recvProcNeighborsY, "recv");
-        para->setPossNeighborFilesZ(recvProcNeighborsZ, "recv");
-    }
-    //////////////////////////////////////////////////////////////////////////
-    //para->setkFull(             input->getValue( "kFull" ));
-    //para->setgeoFull(           input->getValue( "geoFull" ));
-    //para->setnoSlipBcPos(       input->getValue( "noSlipBcPos" ));
-    //para->setnoSlipBcQs(          input->getValue( "noSlipBcQs" ));
-    //para->setnoSlipBcValues(      input->getValue( "noSlipBcValues" ));
-    //para->setnoSlipBcValue(     input->getValue( "noSlipBcValue" ));
-    //para->setslipBcPos(         input->getValue( "slipBcPos" ));
-    //para->setslipBcQs(          input->getValue( "slipBcQs" ));
-    //para->setslipBcValue(       input->getValue( "slipBcValue" ));
-    //para->setpressBcPos(        input->getValue( "pressBcPos" ));
-    //para->setpressBcQs(           input->getValue( "pressBcQs" ));
-    //para->setpressBcValues(       input->getValue( "pressBcValues" ));
-    //para->setpressBcValue(      input->getValue( "pressBcValue" ));
-    //para->setvelBcQs(             input->getValue( "velBcQs" ));
-    //para->setvelBcValues(         input->getValue( "velBcValues" ));
-    //para->setpropellerCylinder( input->getValue( "propellerCylinder" ));
-    //para->setpropellerQs(		 input->getValue( "propellerQs"      ));
-    //para->setwallBcQs(            input->getValue( "wallBcQs"         ));
-    //para->setwallBcValues(        input->getValue( "wallBcValues"     ));
-    //para->setperiodicBcQs(        input->getValue( "periodicBcQs"     ));
-    //para->setperiodicBcValues(    input->getValue( "periodicBcValues" ));
-    //cout << "Try this: " << para->getgeomBoundaryBcValues() << endl;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    //Restart
-    para->setTimeDoCheckPoint(StringUtil::toInt(input->getValue("TimeDoCheckPoint")));
-    para->setTimeDoRestart(StringUtil::toInt(input->getValue("TimeDoRestart")));
-    para->setDoCheckPoint(StringUtil::toBool(input->getValue("DoCheckPoint")));
-    para->setDoRestart(StringUtil::toBool(input->getValue("DoRestart")));
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    para->setMaxLevel(StringUtil::toInt(input->getValue("NOGL")));
-    para->setGridX(StringUtil::toIntVector(input->getValue("GridX")));                           
-    para->setGridY(StringUtil::toIntVector(input->getValue("GridY")));                           
-    para->setGridZ(StringUtil::toIntVector(input->getValue("GridZ")));                  
-    para->setDistX(StringUtil::toIntVector(input->getValue("DistX")));                  
-    para->setDistY(StringUtil::toIntVector(input->getValue("DistY")));                  
-    para->setDistZ(StringUtil::toIntVector(input->getValue("DistZ")));                
-
-    para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
-}
-
-
-
-void multipleLevel(const std::string& configPath)
-{
-    auto gridFactory = GridFactory::make();
-    gridFactory->setGridStrategy(Device::CPU);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
-
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-    
-    SPtr<Parameter> para = Parameter::make();
-    SPtr<GridProvider> gridGenerator;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    bool useGridGenerator = true;
-
-    if(useGridGenerator){
-        
-        //const uint generatePart = 1;
-        const uint generatePart = Communicator::getInstanz()->getPID();
-            
-        real dx = 1.0 / 20.0;
-        real vx = 0.05;
-
-        auto triangularMesh = std::make_shared<TriangularMesh>("F:/Work/Computations/gridGenerator/stl/ShpereNotOptimal.stl");
-        //auto triangularMesh = std::make_shared<TriangularMesh>("stl/ShpereNotOptimal.lnx.stl");
-
-        // all
-        //gridBuilder->addCoarseGrid(-2, -2, -2,  
-        //                            4,  2,  2, dx);
-
-        real overlap = 10.0 * dx;
-
-        gridBuilder->addCoarseGrid(-2.0, -2.0, -2.0,  
-                                    4.0,  2.0,  2.0, dx);
-
-
-        gridBuilder->setNumberOfLayers(10,8);
-        gridBuilder->addGrid(triangularMesh, 1);
-
-        gridBuilder->addGeometry(triangularMesh);
-
-        gridBuilder->setPeriodicBoundaryCondition(false, false, false);
-
-        gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
-
-        //////////////////////////////////////////////////////////////////////////
-
-        gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
-        gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
-        gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
-        gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
-
-        gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-        gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-
-        gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
-
-        bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityCompressible);
-        bcFactory.setGeometryBoundaryCondition(BoundaryConditionFactory::NoSlipBC::NoSlipCompressible);
-        bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::PressureNonEquilibriumCompressible);
-
-        //////////////////////////////////////////////////////////////////////////
-        gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/Test_");
-        //gridBuilder->writeArrows    ("F:/Work/Computations/gridGenerator/grid/Test_Arrow");
-
-        //SimulationFileWriter::write("F:/Work/Computations/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
-
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-            
-        if(false)
-        {
-
-            auto getParentIndex = [&] (uint index, uint level) -> uint
-            {
-                SPtr<Grid> grid = gridBuilder->getGrid( level );
-
-                if( level != 0 )
-                {
-                    real x, y, z;
-                    grid->transIndexToCoords(index, x, y, z);
-
-                    SPtr<Grid> coarseGrid = gridBuilder->getGrid(level - 1);
-
-                    for (const auto dir : DistributionHelper::getDistribution27())
-                    {
-                        if (std::abs(dir[0]) < 0.5 || std::abs(dir[1]) < 0.5 || std::abs(dir[2]) < 0.5) continue;
-
-                        real coarseX = x + dir[0] * 0.5 * grid->getDelta();
-                        real coarseY = y + dir[1] * 0.5 * grid->getDelta();
-                        real coarseZ = z + dir[2] * 0.5 * grid->getDelta();
-
-                        // check if close enough to coarse grid coordinates
-                        if( 0.01 * grid->getDelta() < std::abs(         (coarseGrid->getStartX() - coarseX) / grid->getDelta() 
-                                                                - lround( (coarseGrid->getStartX() - coarseX) / grid->getDelta() ) ) ) continue;
-                        if( 0.01 * grid->getDelta() < std::abs(         (coarseGrid->getStartY() - coarseY) / grid->getDelta() 
-                                                                - lround( (coarseGrid->getStartY() - coarseY) / grid->getDelta() ) ) ) continue;
-                        if( 0.01 * grid->getDelta() < std::abs(         (coarseGrid->getStartZ() - coarseZ) / grid->getDelta() 
-                                                                - lround( (coarseGrid->getStartZ() - coarseZ) / grid->getDelta() ) ) ) continue;
-
-                        uint parentIndex = coarseGrid->transCoordToIndex( coarseX, coarseY, coarseZ);
-
-                        return parentIndex;
-                    }
-                }
-
-                return INVALID_INDEX;
-            };
-
-
-            std::vector<idx_t> xadj;
-            std::vector<idx_t> adjncy;
-
-            std::vector<idx_t> vwgt;
-            std::vector<idx_t> adjwgt;
-
-            idx_t vertexCounter = 0;
-            uint edgeCounter = 0;
-
-            std::cout << "Checkpoint 1:" << std::endl;
-
-            std::vector< std::vector<idx_t> > vertexIndex( gridBuilder->getNumberOfLevels() );
-
-            std::vector< uint > startVerticesPerLevel;;
-
-            for( uint level = 0; level < gridBuilder->getNumberOfLevels(); level++ )
-            {
-                SPtr<Grid> grid = gridBuilder->getGrid( level );
-
-                vertexIndex[level].resize( grid->getSize() );
-
-                startVerticesPerLevel.push_back(vertexCounter);
-
-                for (uint index = 0; index < grid->getSize(); index++)
-                {
-                    if (grid->getSparseIndex(index) == INVALID_INDEX)
-                    {
-                        vertexIndex[level][index] = INVALID_INDEX;
-                        continue;
-                    }
-
-                    uint parentIndex = getParentIndex(index, level);
-
-                    if( parentIndex != INVALID_INDEX )
-                    {
-                        SPtr<Grid> coarseGrid = gridBuilder->getGrid(level - 1);
-
-                        if( coarseGrid->getFieldEntry(parentIndex) == FLUID_CFC ||
-                            coarseGrid->getFieldEntry(parentIndex) == FLUID_FCC ||
-                            coarseGrid->getFieldEntry(parentIndex) == STOPPER_COARSE_UNDER_FINE )
-                        {
-                            //vertexIndex[level][index] = INVALID_INDEX;
-                            vertexIndex[level][index] = vertexIndex[level - 1][parentIndex];
-                            continue;
-                        }
-                    }
-
-                    vertexIndex[level][index] = vertexCounter;
-
-                    vwgt.push_back( std::pow(2, level) );
-                    //vwgt.push_back( std::pow(2, 2*level) );
-                    vertexCounter++;
-                }
-
-            }
-
-            //////////////////////////////////////////////////////////////////////////
-            //for( uint level = 0; level < gridBuilder->getNumberOfLevels(); level++ )
-            //{
-            //    SPtr<Grid> grid = gridBuilder->getGrid( level );
-
-            //    for (uint index = 0; index < grid->getSize(); index++)
-            //    {
-            //        grid->setFieldEntry(index, vertexIndex[level][index] >= startVerticesPerLevel[level] && vertexIndex[level][index] != INVALID_INDEX);
-            //    }
-            //}
-
-            //gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/VertexIndex_");
-
-            //return;
-            //////////////////////////////////////////////////////////////////////////
-
-
-            std::cout << "Checkpoint 2:" << std::endl;
-                
-            for( uint level = 0; level < gridBuilder->getNumberOfLevels(); level++ )
-            {
-                SPtr<Grid> grid = gridBuilder->getGrid( level );
-
-                for (uint index = 0; index < grid->getSize(); index++)
-                {
-                    //if (grid->getSparseIndex(index) == INVALID_INDEX) continue;
-
-                    if( vertexIndex[level][index] == INVALID_INDEX ) continue;
-
-                    if( vertexIndex[level][index] < startVerticesPerLevel[level] ) continue;
-
-                    xadj.push_back(edgeCounter);
-
-                    real x, y, z;
-                    grid->transIndexToCoords(index, x, y, z);
-
-                    for (const auto dir : DistributionHelper::getDistribution27())
-                    {
-                        const uint neighborIndex = grid->transCoordToIndex(x + dir[0] * grid->getDelta(), 
-                                                                            y + dir[1] * grid->getDelta(), 
-                                                                            z + dir[2] * grid->getDelta());
-
-                        if (neighborIndex == INVALID_INDEX) continue;
-
-                        if (neighborIndex == index) continue;
-
-                        if( vertexIndex[level][neighborIndex] == INVALID_INDEX ) continue;
-
-                        adjncy.push_back( vertexIndex[level][neighborIndex] );
-                        adjwgt.push_back( std::pow(2, level) );
-
-                        edgeCounter++;
-                    }
-
-                    if( grid->getFieldEntry(index) == FLUID_CFC ||
-                        grid->getFieldEntry(index) == FLUID_FCC ||
-                        grid->getFieldEntry(index) == STOPPER_COARSE_UNDER_FINE )
-
-                    {
-                        SPtr<Grid> fineGrid = gridBuilder->getGrid(level + 1);
-
-                        for (const auto dir : DistributionHelper::getDistribution27())
-                        {
-                            if (std::abs(dir[0]) < 0.5 || std::abs(dir[1]) < 0.5 || std::abs(dir[2]) < 0.5) continue;
-
-                            real fineX = x + dir[0] * 0.25 * grid->getDelta();
-                            real fineY = y + dir[1] * 0.25 * grid->getDelta();
-                            real fineZ = z + dir[2] * 0.25 * grid->getDelta();
-
-                            uint childIndex = fineGrid->transCoordToIndex(fineX, fineY, fineZ);
-
-                            if( fineGrid->getFieldEntry(childIndex) == INVALID_INDEX ) continue;
-                            if( vertexIndex[level + 1][childIndex]  == INVALID_INDEX ) continue;
-
-                            for (const auto dir : DistributionHelper::getDistribution27())
-                            {
-                                const uint neighborIndex = fineGrid->transCoordToIndex( fineX + dir[0] * fineGrid->getDelta(), 
-                                                                                        fineY + dir[1] * fineGrid->getDelta(), 
-                                                                                        fineZ + dir[2] * fineGrid->getDelta() );
-
-                                if(neighborIndex == INVALID_INDEX) continue;
-
-                                if (neighborIndex == childIndex) continue;
-
-                                if( vertexIndex[level + 1][neighborIndex] == INVALID_INDEX ) continue;
-
-                                adjncy.push_back( vertexIndex[level + 1][neighborIndex] );
-                                adjwgt.push_back( std::pow(2, level) );
-
-                                edgeCounter++;
-                            }
-                        }
-                    }
-                }
-            }
-
-            xadj.push_back( edgeCounter );
-
-            std::cout << "Checkpoint 3:" << std::endl;
-                
-            idx_t nWeights  = 1;
-            idx_t nParts    = 4;
-            idx_t objval    = 0;
-
-            std::vector<idx_t> part( vertexCounter );
-                
-            std::cout << vertexCounter << std::endl;
-            std::cout << edgeCounter << std::endl;
-            std::cout << xadj.size()  << std::endl;
-            std::cout << adjncy.size() << std::endl;
-
-            //int ret = METIS_PartGraphRecursive(&vertexCounter, &nWeights, xadj.data(), adjncy.data(),
-            // 				                   vwgt.data(), NULL, adjwgt.data(), &nParts, 
-            //                                   NULL, NULL, NULL, &objval, part.data());
-
-            int ret = METIS_PartGraphKway(&vertexCounter, &nWeights, xadj.data(), adjncy.data(),
-                 				            vwgt.data(), NULL, NULL/*adjwgt.data()*/, &nParts, 
-                                            NULL, NULL, NULL, &objval, part.data());
-
-            std::cout << "objval:" << objval << std::endl;
-
-            std::cout << "Checkpoint 4:" << std::endl;
-
-            //uint partCounter = 0;
-                
-            for( uint level = 0; level < gridBuilder->getNumberOfLevels(); level++ )
-            {
-                SPtr<Grid> grid = gridBuilder->getGrid( level );
-
-                for (uint index = 0; index < grid->getSize(); index++)
-                {
-                    if (grid->getSparseIndex(index) == INVALID_INDEX) continue;
-
-                    grid->setFieldEntry(index, part[vertexIndex[level][index]]);
-
-                    //partCounter++;
-                }
-            }
-
-            std::cout << "Checkpoint 5:" << std::endl;
-
-            gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/Partition_");
-
-        }
-
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-            
-        {
-
-            for( int level = gridBuilder->getNumberOfLevels()-1; level >= 0 ; level-- )
-            {
-                std::vector< std::vector<idx_t> > vertexIndex( gridBuilder->getNumberOfLevels() );
-
-                std::vector<idx_t> xadj;
-                std::vector<idx_t> adjncy;
-
-                std::vector<idx_t> vwgt;
-                std::vector<idx_t> adjwgt;
-
-                idx_t vertexCounter = 0;
-                uint edgeCounter = 0;
-
-                SPtr<Grid> grid = gridBuilder->getGrid( level );
-
-                vertexIndex[level].resize( grid->getSize() );
-
-                for (uint index = 0; index < grid->getSize(); index++)
-                {
-                    if (grid->getSparseIndex(index) == INVALID_INDEX)
-                    {
-                        vertexIndex[level][index] = INVALID_INDEX;
-                        continue;
-                    }
-
-                    vertexIndex[level][index] = vertexCounter;
-
-                    vwgt.push_back( std::pow(2, level) );
-                    //vwgt.push_back( std::pow(2, 2*level) );
-                    vertexCounter++;
-                }
-
-                for (uint index = 0; index < grid->getSize(); index++)
-                {
-                    //if (grid->getSparseIndex(index) == INVALID_INDEX) continue;
-
-                    if( vertexIndex[level][index] == INVALID_INDEX ) continue;
-
-                    xadj.push_back(edgeCounter);
-
-                    real x, y, z;
-                    grid->transIndexToCoords(index, x, y, z);
-
-                    for (const auto dir : DistributionHelper::getDistribution27())
-                    {
-                        const uint neighborIndex = grid->transCoordToIndex(x + dir[0] * grid->getDelta(), 
-                                                                            y + dir[1] * grid->getDelta(), 
-                                                                            z + dir[2] * grid->getDelta());
-
-                        if (neighborIndex == INVALID_INDEX) continue;
-
-                        if (neighborIndex == index) continue;
-
-                        if( vertexIndex[level][neighborIndex] == INVALID_INDEX ) continue;
-
-                        adjncy.push_back( vertexIndex[level][neighborIndex] );
-                        adjwgt.push_back( std::pow(2, level) );
-
-                        edgeCounter++;
-                    }
-                }
-
-                xadj.push_back( edgeCounter );
-
-                std::cout << "Checkpoint 3:" << std::endl;
-                
-                idx_t nWeights  = 1;
-                idx_t nParts    = 4;
-                idx_t objval    = 0;
-
-                std::vector<idx_t> part( vertexCounter );
-                
-                std::cout << vertexCounter << std::endl;
-                std::cout << edgeCounter << std::endl;
-                std::cout << xadj.size()  << std::endl;
-                std::cout << adjncy.size() << std::endl;
-
-                int ret = METIS_PartGraphRecursive(&vertexCounter, &nWeights, xadj.data(), adjncy.data(),
-                     				                NULL/*vwgt.data()*/, NULL, NULL/*adjwgt.data()*/, &nParts, 
-                                                    NULL, NULL, NULL, &objval, part.data());
-
-                //int ret = METIS_PartGraphKway(&vertexCounter, &nWeights, xadj.data(), adjncy.data(),
-                 		//	                  NULL/*vwgt.data()*/, NULL, NULL/*adjwgt.data()*/, &nParts, 
-                //                              NULL, NULL, NULL, &objval, part.data());
-
-                std::cout << "objval:" << objval << std::endl;
-
-                std::cout << "Checkpoint 4:" << std::endl;
-
-                for (uint index = 0; index < grid->getSize(); index++)
-                {
-                    if (vertexIndex[level][index] == INVALID_INDEX) continue;
-
-                    if( grid->getFieldEntry(index) == FLUID_CFC ||
-                        grid->getFieldEntry(index) == FLUID_FCC ||
-                        grid->getFieldEntry(index) == STOPPER_COARSE_UNDER_FINE )
-                    {
-                        SPtr<Grid> fineGrid = gridBuilder->getGrid(level+1);
-                            
-                        real x, y, z;
-                        grid->transIndexToCoords(index, x, y, z);
-
-                        for (const auto dir : DistributionHelper::getDistribution27())
-                        {
-                            if (std::abs(dir[0]) < 0.5 || std::abs(dir[1]) < 0.5 || std::abs(dir[2]) < 0.5) continue;
-
-                            real fineX = x + dir[0] * 0.25 * grid->getDelta();
-                            real fineY = y + dir[1] * 0.25 * grid->getDelta();
-                            real fineZ = z + dir[2] * 0.25 * grid->getDelta();
-
-                            uint childIndex = fineGrid->transCoordToIndex(fineX, fineY, fineZ);
-
-                            if( childIndex == INVALID_INDEX ) continue;
-
-                            fineGrid->setFieldEntry(childIndex, part[vertexIndex[level][index]]);
-                            //fineGrid->setFieldEntry(childIndex, grid->getFieldEntry(index));
-                        }
-                    }
-
-                    grid->setFieldEntry(index, part[vertexIndex[level][index]]);
-                }
-            }
-
-            gridBuilder->writeGridsToVtk("F:/Work/Computations/gridGenerator/grid/Partition_");
-
-        }
-
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-        return;
-
-        gridGenerator = GridGenerator::make(gridBuilder, para);
-    }
-    else
-    {
-        gridGenerator = GridReader::make(FileFormat::BINARY, para);
-        //gridGenerator = GridReader::make(FileFormat::ASCII, para);
-    }
-
-    logFile.close();
-
-    //return;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-    std::ifstream stream;
-    stream.open(configPath.c_str(), std::ios::in);
-    if (stream.fail())
-        throw std::runtime_error("can not open config file!");
-
-    UPtr<input::Input> input = input::Input::makeInput(stream, "config");
-
-    setParameters(para, input);
-
-    Simulation sim;
-    SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
-    sim.init(para, gridGenerator, fileWriter);
-    sim.run();
-}
-
-
-int main( int argc, char* argv[])
-{
-     MPI_Init(&argc, &argv);
-    std::string str, str2; 
-    if ( argv != NULL )
-    {
-        str = static_cast<std::string>(argv[0]);
-        if (argc > 1)
-        {
-            str2 = static_cast<std::string>(argv[1]);
-            try
-            {
-                multipleLevel(str2);
-            }
-            catch (const std::exception& e)
-            {
-                //MPI_Abort(MPI_COMM_WORLD, -1);
-            }
-            catch (...)
-            {
-                std::cout << "unknown exeption" << std::endl;
-            }
-        }
-        else
-        {
-            try
-            {
-                multipleLevel("F:/Work/Computations/gridGenerator/inp/configTest.txt");
-            }
-            catch (const std::exception& e)
-            {
-                std::cout << e.what() << std::flush;
-                //MPI_Abort(MPI_COMM_WORLD, -1);
-            }
-            catch (const std::bad_alloc e)
-            {
-                std::cout << e.what() << std::flush;
-                //MPI_Abort(MPI_COMM_WORLD, -1);
-            }
-            catch (...)
-            {
-                std::cout << "unknown exeption" << std::endl;
-            }
-
-            std::cout << "\nConfiguration file must be set!: lbmgm <config file>" << std::endl << std::flush;
-            //MPI_Abort(MPI_COMM_WORLD, -1);
-        }
-    }
-
-
-   /*
-   MPE_Init_log() & MPE_Finish_log() are NOT needed when
-   liblmpe.a is linked with this program.  In that case,
-   MPI_Init() would have called MPE_Init_log() already.
-   */
-#if defined( MPI_LOGGING )
-   MPE_Init_log();
-#endif
-
-#if defined( MPI_LOGGING )
-   if ( argv != NULL )
-      MPE_Finish_log( argv[0] );
-   if ( str != "" )
-      MPE_Finish_log( str.c_str() );
-   else
-      MPE_Finish_log( "TestLog" );
-#endif
-
-   MPI_Finalize();
-   return 0;
-}
diff --git a/apps/gpu/MusselOyster/CMakeLists.txt b/apps/gpu/MusselOyster/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..966c802b233fd333c7e7b44a57c7f4177b419ca3
--- /dev/null
+++ b/apps/gpu/MusselOyster/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(MusselOyster LANGUAGES CXX)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES MusselOyster.cpp)
diff --git a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp b/apps/gpu/MusselOyster/MusselOyster.cpp
similarity index 97%
rename from apps/gpu/LBM/MusselOyster/MusselOyster.cpp
rename to apps/gpu/MusselOyster/MusselOyster.cpp
index 5a5830d442ff83e33208ddee226e9ea34c84a2ef..191a960fc1cf54d9bd74689d4d59b211220262c2 100644
--- a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
+++ b/apps/gpu/MusselOyster/MusselOyster.cpp
@@ -25,7 +25,6 @@
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 
 #include "geometries/Sphere/Sphere.h"
 #include "geometries/TriangularMesh/TriangularMesh.h"
@@ -37,7 +36,6 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
@@ -51,6 +49,7 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "utilities/communication.h"
+#include <parallel/MPICommunicator.h>
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -86,14 +85,12 @@ const std::string simulationName("MusselOyster");
 
 void runVirtualFluids(const vf::basics::ConfigurationFile& config)
 {
-    vf::gpu::Communicator &communicator = vf::gpu::MpiCommunicator::getInstance();
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
-    auto gridFactory = GridFactory::make();
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
     SPtr<Parameter> para =
-        std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+        std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -151,7 +148,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
     std::cout << "Write result files to " << para->getFName() << std::endl;
 
     para->setUseStreams(useStreams);
-    para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+    para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
     
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
@@ -191,12 +188,12 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
             bivalveRef_1_STL = std::make_shared<TriangularMesh>(stlPath + bivalveType + "_Level1.stl");
 
         if (para->getNumprocs() > 1) {
-            const uint generatePart = vf::gpu::MpiCommunicator::getInstance().getPID();
+            const uint generatePart = communicator.getProcessID();
 
             real overlap = (real)8.0 * dxGrid;
             gridBuilder->setNumberOfLayers(10, 8);
 
-            if (communicator.getNumberOfProcess() == 2) {
+            if (communicator.getNumberOfProcesses() == 2) {
                 const real zSplit = 0.0; // round(((double)bbzp + bbzm) * 0.5);
 
                 if (generatePart == 0) {
@@ -247,7 +244,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
                 gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
                 gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); // set pressure BC after velocity BCs
                 //////////////////////////////////////////////////////////////////////////
-            } else if (communicator.getNumberOfProcess() == 4) {
+            } else if (communicator.getNumberOfProcesses() == 4) {
 
                 const real xSplit = 100.0;
                 const real zSplit = 0.0;
@@ -337,7 +334,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
                     gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); // set pressure BC after velocity BCs
                 }
                 //////////////////////////////////////////////////////////////////////////
-            } else if (communicator.getNumberOfProcess() == 8) {
+            } else if (communicator.getNumberOfProcesses() == 8) {
                 real xSplit = 140.0; // 100.0 // mit groesserem Level 1 140.0
                 real ySplit = 32.0;  // 32.0
                 real zSplit = 0.0;
@@ -577,14 +574,11 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
 
 int main(int argc, char *argv[])
 {
-    MPI_Init(&argc, &argv);
-    std::string str, str2, configFile;
-
-    if (argv != NULL) {
+    if (argc > 1) {
 
         try {
             VF_LOG_TRACE("For the default config path to work, execute the app from the project root.");
-            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/LBM/MusselOyster/configMusselOyster.txt");
+            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/MusselOyster/configMusselOyster.txt");
             runVirtualFluids(config);
 
             //////////////////////////////////////////////////////////////////////////
@@ -598,7 +592,5 @@ int main(int argc, char *argv[])
             VF_LOG_CRITICAL("Unknown exception!");
         }
     }
-
-    MPI_Finalize();
     return 0;
 }
diff --git a/apps/gpu/LBM/MusselOyster/configMusselOyster.txt b/apps/gpu/MusselOyster/configMusselOyster.txt
similarity index 81%
rename from apps/gpu/LBM/MusselOyster/configMusselOyster.txt
rename to apps/gpu/MusselOyster/configMusselOyster.txt
index 3d64ef74215db49adfdee6ba569fccb462b98d73..f3536cebd4b669a854b9ad640501f119e3020ceb 100644
--- a/apps/gpu/LBM/MusselOyster/configMusselOyster.txt
+++ b/apps/gpu/MusselOyster/configMusselOyster.txt
@@ -1,15 +1,15 @@
 # Tesla 03
-# mpiexec -n 2 "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/build/bin/Release/MusselOyster.exe" "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/apps/gpu/LBM/MusselOyster/configMusselOyster.txt"
+# mpiexec -n 2 "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/build/bin/Release/MusselOyster.exe" "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/apps/gpu/MusselOyster/configMusselOyster.txt"
 # Phoenix
-# mpirun -np 2 "./VirtualFluids_dev/build/bin/MusselOyster" "./VirtualFluids_dev/apps/gpu/LBM/MusselOyster/configMusselOyster.txt"
+# mpirun -np 2 "./VirtualFluids_dev/build/bin/MusselOyster" "./VirtualFluids_dev/apps/gpu/MusselOyster/configMusselOyster.txt"
 
 # Phoenix mpich
-# mpirun -np 4 nvprof -f -o MusselOyster.%q{PMI_RANK}.nvprof "./VirtualFluids_dev/build/bin/MusselOyster" "./VirtualFluids_dev/apps/gpu/LBM/SphereScaling/configPhoenix4GPU.txt"
+# mpirun -np 4 nvprof -f -o MusselOyster.%q{PMI_RANK}.nvprof "./VirtualFluids_dev/build/bin/MusselOyster" "./VirtualFluids_dev/apps/gpu/SphereScaling/configPhoenix4GPU.txt"
 # Phoenix openmpi
-# mpirun -np 4 nvprof -f -o MusselOyster.%q{OMPI_COMM_WORLD_RANK}.nvprof "./VirtualFluids_dev/build/bin/MusselOyster" "./VirtualFluids_dev/apps/gpu/LBM/SphereScaling/configPhoenix4GPU.txt"
+# mpirun -np 4 nvprof -f -o MusselOyster.%q{OMPI_COMM_WORLD_RANK}.nvprof "./VirtualFluids_dev/build/bin/MusselOyster" "./VirtualFluids_dev/apps/gpu/SphereScaling/configPhoenix4GPU.txt"
 
 # Aragorn
- ./bin/MusselOyster "../apps/gpu/LBM/MusselOyster/configMusselOyster.txt"
+ ./bin/MusselOyster "../apps/gpu/MusselOyster/configMusselOyster.txt"
 
 ##################################################
 #GPU Mapping
@@ -40,7 +40,7 @@ GridPath=./output/MusselOysterResults/grid/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/MusselOyster/configPhoenix1GPU.txt b/apps/gpu/MusselOyster/configPhoenix1GPU.txt
similarity index 96%
rename from apps/gpu/LBM/MusselOyster/configPhoenix1GPU.txt
rename to apps/gpu/MusselOyster/configPhoenix1GPU.txt
index 369d68be327f72ef3762a2ddaf31ff89b84e06c7..0f48e6f2cf60369aaf5a1e9116dcc8ffdda84297 100644
--- a/apps/gpu/LBM/MusselOyster/configPhoenix1GPU.txt
+++ b/apps/gpu/MusselOyster/configPhoenix1GPU.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridMusselOyster/Mussel1GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt b/apps/gpu/MusselOyster/configPhoenix8GPU.txt
similarity index 96%
rename from apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt
rename to apps/gpu/MusselOyster/configPhoenix8GPU.txt
index 2bf6955062da5c98f6a7b931c19821c52eaf15ea..97b1125a788b79fe4ebef5ed67abb65b6fbbfbfc 100644
--- a/apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt
+++ b/apps/gpu/MusselOyster/configPhoenix8GPU.txt
@@ -26,7 +26,7 @@ NumberOfDevices=4
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/SphereGPU/CMakeLists.txt b/apps/gpu/SphereGPU/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1a162d6d200e4c0e533764b8f9927314b1f28ee9
--- /dev/null
+++ b/apps/gpu/SphereGPU/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(SphereGPU LANGUAGES CXX)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES Sphere.cpp)
diff --git a/apps/gpu/LBM/SphereGPU/Sphere.cpp b/apps/gpu/SphereGPU/Sphere.cpp
similarity index 91%
rename from apps/gpu/LBM/SphereGPU/Sphere.cpp
rename to apps/gpu/SphereGPU/Sphere.cpp
index 7794217f4e42f79070b1037c86b3e74b1f94d967..3a5de66b576aaaa6999f2ca1a38f43553d86301d 100644
--- a/apps/gpu/LBM/SphereGPU/Sphere.cpp
+++ b/apps/gpu/SphereGPU/Sphere.cpp
@@ -41,18 +41,19 @@
 #include <string>
 
 //////////////////////////////////////////////////////////////////////////
+#include <basics/DataTypes.h>
+#include <basics/PointerDefinitions.h>
+#include <basics/config/ConfigurationFile.h>
 
-#include "DataTypes.h"
 #include <logger/Logger.h>
-#include "PointerDefinitions.h"
-#include "config/ConfigurationFile.h"
+
+#include <parallel/MPICommunicator.h>
 
 //////////////////////////////////////////////////////////////////////////
 
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 
 #include "GridGenerator/geometries/Sphere/Sphere.h"
 #include "GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
@@ -62,7 +63,6 @@
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
@@ -70,8 +70,7 @@
 #include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
 #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.h"
 #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.h"
-
-//////////////////////////////////////////////////////////////////////////
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
 
 int main(int argc, char *argv[])
 {
@@ -79,7 +78,6 @@ int main(int argc, char *argv[])
         //////////////////////////////////////////////////////////////////////////
         // Simulation parameters
         //////////////////////////////////////////////////////////////////////////
-
         const bool useConfigFile = true;
 
         const real L = 1.0;
@@ -94,32 +92,25 @@ int main(int argc, char *argv[])
 
         //////////////////////////////////////////////////////////////////////////
         // setup simulation parameters (with or without config file)
-        //////////////////////////
+        //////////////////////////////////////////////////////////////////////////
 
-        vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();;
         SPtr<Parameter> para;
         BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
         GridScalingFactory scalingFactory = GridScalingFactory();
         vf::basics::ConfigurationFile config;
         if (useConfigFile) {
             VF_LOG_TRACE("For the default config path to work, execute the app from the project root.");
-            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/LBM/SphereGPU/config.txt");
+            config = vf::basics::loadConfig(argc, argv, "./apps/gpu/SphereGPU/config.txt");
             para = std::make_shared<Parameter>(&config);
         } else {
             para = std::make_shared<Parameter>();
         }
 
-        //////////////////////////////////////////////////////////////////////////
-        // setup gridGenerator
-        //////////////////////////////////////////////////////////////////////////
-
-        auto gridFactory = GridFactory::make();
-        gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-        auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
 
         //////////////////////////////////////////////////////////////////////////
         // create grid
         //////////////////////////////////////////////////////////////////////////
+        auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
         real dx = L / real(nx);
         gridBuilder->addCoarseGrid(-1.0 * L, -0.6 * L, -0.6 * L,
@@ -129,7 +120,7 @@ int main(int argc, char *argv[])
         // auto sphere = std::make_shared<Sphere>(0.0, 0.0, 0.0, dSphere / 2.0);
 
         // use stl
-        std::string stlPath = "./apps/gpu/LBM/SphereGPU/sphere02.stl";
+        std::string stlPath = "./apps/gpu/SphereGPU/sphere02.stl";
         if (useConfigFile && config.contains("STLPath")) {
             stlPath = config.getValue<std::string>("STLPath");
         }
@@ -180,6 +171,8 @@ int main(int argc, char *argv[])
         para->setTimestepOut(timeStepOut);
         para->setTimestepEnd(timeStepEnd);
 
+        para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
+
         //////////////////////////////////////////////////////////////////////////
         // set boundary conditions
         //////////////////////////////////////////////////////////////////////////
@@ -207,7 +200,7 @@ int main(int argc, char *argv[])
         const uint tAveraging      = 100;
         const uint tStartOutProbe  = 0;
         const uint tOutProbe       = para->getTimestepOut();
-        SPtr<PointProbe> pointProbe = std::make_shared<PointProbe>( "pointProbe", para->getOutputPath(), tStartAveraging, tAveraging, tStartOutProbe, tOutProbe);
+        SPtr<PointProbe> pointProbe = std::make_shared<PointProbe>("pointProbe", para->getOutputPath(), tStartAveraging, tAveraging, tStartOutProbe, tOutProbe);
         std::vector<real> probeCoordsX = {0.3, 0.5};
         std::vector<real> probeCoordsY = {0.0, 0.0};
         std::vector<real> probeCoordsZ = {0.0, 0.0};
@@ -226,7 +219,7 @@ int main(int argc, char *argv[])
         //////////////////////////////////////////////////////////////////////////
         // setup to copy mesh to simulation
         //////////////////////////////////////////////////////////////////////////
-
+        vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
         auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
         SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
 
diff --git a/apps/gpu/LBM/SphereGPU/config.txt b/apps/gpu/SphereGPU/config.txt
similarity index 100%
rename from apps/gpu/LBM/SphereGPU/config.txt
rename to apps/gpu/SphereGPU/config.txt
diff --git a/apps/gpu/LBM/SphereGPU/sphere02.stl b/apps/gpu/SphereGPU/sphere02.stl
similarity index 100%
rename from apps/gpu/LBM/SphereGPU/sphere02.stl
rename to apps/gpu/SphereGPU/sphere02.stl
diff --git a/apps/gpu/SphereRefined/CMakeLists.txt b/apps/gpu/SphereRefined/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..87432021ba02e7b56b5dabade18e98d7978bce46
--- /dev/null
+++ b/apps/gpu/SphereRefined/CMakeLists.txt
@@ -0,0 +1,9 @@
+PROJECT(SphereRefined LANGUAGES CUDA CXX)
+
+#LIST(APPEND CS_COMPILER_FLAGS_CXX "-DOMPI_SKIP_MPICXX" )
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES SphereRefined.cpp)
+
+set_source_files_properties(SphereRefined.cpp PROPERTIES LANGUAGE CUDA)
+
+set_target_properties(SphereRefined PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
diff --git a/apps/gpu/SphereRefined/SphereRefined.cpp b/apps/gpu/SphereRefined/SphereRefined.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2aae0b4eb19a48e5486c908e80f257aaf463a97d
--- /dev/null
+++ b/apps/gpu/SphereRefined/SphereRefined.cpp
@@ -0,0 +1,223 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file SphereRefined.cpp
+//! \ingroup Applications
+//! \author Martin Schoenherr
+//=======================================================================================
+#define _USE_MATH_DEFINES
+#include <exception>
+#include <fstream>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+//////////////////////////////////////////////////////////////////////////
+
+#include "DataTypes.h"
+#include "PointerDefinitions.h"
+
+#include <logger/Logger.h>
+
+//////////////////////////////////////////////////////////////////////////
+
+#include "GridGenerator/grid/BoundaryConditions/Side.h"
+#include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
+#include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
+#include "GridGenerator/grid/GridFactory.h"
+#include "GridGenerator/geometries/Cuboid/Cuboid.h"
+#include "GridGenerator/geometries/Sphere/Sphere.h"
+#include "GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+#include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
+#include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
+#include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
+#include "VirtualFluids_GPU/LBM/Simulation.h"
+#include "VirtualFluids_GPU/Output/FileWriter.h"
+#include "VirtualFluids_GPU/Parameter/Parameter.h"
+#include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
+
+#include <parallel/MPICommunicator.h>
+
+//////////////////////////////////////////////////////////////////////////
+
+int main()
+{
+    try {
+        vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
+        vf::logging::Logger::initializeLogger();
+        //////////////////////////////////////////////////////////////////////////
+        // Simulation parameters
+        //////////////////////////////////////////////////////////////////////////
+        std::string path("output/SphereRefined");
+        std::string simulationName("SphereRefined");
+
+        const real L = 1.0;
+        const real dSphere = 0.2;
+        const real Re = 300.0;
+        const real velocity = 1.0;
+        const real velocityLB = (real)0.5e-2; // LB units
+        const uint nx = 50;
+
+        const uint timeStepOut = 10000;
+        const uint timeStepEnd = 10000;
+
+        //////////////////////////////////////////////////////////////////////////
+        // compute parameters in lattice units
+        //////////////////////////////////////////////////////////////////////////
+
+        const real dx = L / real(nx);
+        const real dt  = velocityLB / velocity * dx;
+
+        const real viscosityLB = nx * velocityLB / Re; // LB units
+
+        //////////////////////////////////////////////////////////////////////////
+        // create grid
+        //////////////////////////////////////////////////////////////////////////
+        auto gridBuilder = std::make_shared<MultipleGridBuilder>();
+
+        gridBuilder->addCoarseGrid(-1.0 * L, -0.6 * L, -0.6 * L, 
+                                    2.0 * L,  0.6 * L,  0.6 * L, dx);
+
+        // add fine grid
+        gridBuilder->addGrid(std::make_shared<Sphere>(0., 0., 0., 0.22), 2); 
+
+        GridScalingFactory scalingFactory = GridScalingFactory();
+        scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible);
+
+        // use primitive
+        auto sphere = std::make_shared<Sphere>(0.0, 0.0, 0.0, dSphere / 2.0);
+
+        gridBuilder->addGeometry(sphere);
+
+        gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+        gridBuilder->buildGrids(false);
+
+        //////////////////////////////////////////////////////////////////////////
+        // set parameters
+        //////////////////////////////////////////////////////////////////////////
+        SPtr<Parameter> para = std::make_shared<Parameter>();
+
+        para->setOutputPath(path);
+        para->setOutputPrefix(simulationName);
+
+        para->setPrintFiles(true);
+
+        para->setVelocityLB(velocityLB);
+        para->setViscosityLB(viscosityLB);
+
+        para->setVelocityRatio(velocity / velocityLB);
+        para->setDensityRatio(1.0);
+
+        para->setTimestepOut(timeStepOut);
+        para->setTimestepEnd(timeStepEnd);
+
+        para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
+
+        //////////////////////////////////////////////////////////////////////////
+        // set boundary conditions
+        //////////////////////////////////////////////////////////////////////////
+
+        gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+        gridBuilder->setVelocityBoundaryCondition(SideType::MX, velocityLB, 0.0, 0.0);
+        gridBuilder->setSlipBoundaryCondition(SideType::PY, 0.0, 0.0, 0.0);
+        gridBuilder->setSlipBoundaryCondition(SideType::MY, 0.0, 0.0, 0.0);
+        gridBuilder->setSlipBoundaryCondition(SideType::MZ, 0.0, 0.0, 0.0);
+        gridBuilder->setSlipBoundaryCondition(SideType::PZ, 0.0, 0.0, 0.0);
+
+        gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+
+        BoundaryConditionFactory bcFactory;
+
+        bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipCompressible);
+        bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityCompressible);
+        bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::PressureNonEquilibriumCompressible);
+
+
+        //////////////////////////////////////////////////////////////////////////
+        // set copy mesh to simulation
+        //////////////////////////////////////////////////////////////////////////
+
+
+        auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
+        SPtr<GridProvider> gridGenerator =
+            GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
+
+
+        //////////////////////////////////////////////////////////////////////////
+        // run simulation
+        //////////////////////////////////////////////////////////////////////////
+
+        VF_LOG_INFO("Start Running DrivenCavity Showcase...");
+        printf("\n");
+        VF_LOG_INFO("world parameter:");
+        VF_LOG_INFO("--------------");
+        VF_LOG_INFO("dt [s]                 = {}", dt);
+        VF_LOG_INFO("world_length   [m]     = {}", L);
+        VF_LOG_INFO("world_velocity [m/s]   = {}", velocity);
+        VF_LOG_INFO("dx [m]                 = {}", dx);
+        printf("\n");
+        VF_LOG_INFO("LB parameter:");
+        VF_LOG_INFO("--------------");
+        VF_LOG_INFO("Re                     = {}", Re);
+        VF_LOG_INFO("lb_velocity [dx/dt]    = {}", velocityLB);
+        VF_LOG_INFO("lb_viscosity [dx^2/dt] = {}", viscosityLB);
+        printf("\n");
+        VF_LOG_INFO("simulation parameter:");
+        VF_LOG_INFO("--------------");
+        VF_LOG_INFO("nx                     = {}", nx);
+        VF_LOG_INFO("ny                     = {}", nx);
+        VF_LOG_INFO("nz                     = {}", nx);
+        VF_LOG_INFO("number of nodes        = {}", nx * nx * nx);
+        VF_LOG_INFO("n timesteps            = {}", timeStepOut);
+        VF_LOG_INFO("write_nth_timestep     = {}", timeStepEnd);
+        VF_LOG_INFO("output_path            = {}", path);
+
+        Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, &scalingFactory);
+        sim.run();
+
+    } catch (const spdlog::spdlog_ex &ex) {
+        std::cout << "Log initialization failed: " << ex.what() << std::endl;
+    } catch (const std::bad_alloc &e) {
+        VF_LOG_CRITICAL("Bad Alloc: {}", e.what());
+    } catch (const std::exception &e) {
+        VF_LOG_CRITICAL("exception: {}", e.what());
+    } catch (...) {
+        VF_LOG_CRITICAL("Unknown exception!");
+    }
+
+    return 0;
+}
diff --git a/apps/gpu/SphereRefined/configSphere.txt b/apps/gpu/SphereRefined/configSphere.txt
new file mode 100644
index 0000000000000000000000000000000000000000..458346a67c7f001580494af1dc9262034613be68
--- /dev/null
+++ b/apps/gpu/SphereRefined/configSphere.txt
@@ -0,0 +1,34 @@
+##################################################
+#GPU Mapping
+##################################################
+#Devices="0 1 2 3"
+#NumberOfDevices=4
+
+##################################################
+#informations for Writing
+##################################################
+#Path = "output/"
+#Prefix="DrivenCavity" 
+#WriteGrid=true
+##################################################
+#informations for reading
+##################################################
+#GridPath="grid/"
+
+##################################################
+#number of grid levels
+##################################################
+#NOGL=1
+
+##################################################
+#LBM Version
+##################################################
+#D3Qxx=27
+#MainKernelName=CumulantAA2016CompSP27
+
+##################################################
+#simulation parameter
+##################################################
+#TimeEnd=100000
+#TimeOut=1000 
+#TimeStartOut=0
\ No newline at end of file
diff --git a/apps/gpu/SphereRefined/sphere02.stl b/apps/gpu/SphereRefined/sphere02.stl
new file mode 100644
index 0000000000000000000000000000000000000000..3ff142d1a343b2e1016b75e65dde821d7a1f8e5a
--- /dev/null
+++ b/apps/gpu/SphereRefined/sphere02.stl
@@ -0,0 +1,3138 @@
+solid Visualization Toolkit generated SLA File
+ facet normal 0.10450589731384756 0.020787518098262223 0.9943069930951618
+  outer loop
+   vertex 0.020791169255971909 0 0.097814761102199554
+   vertex 0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.088595824750780858 0.059197831240794162 0.99430699314302085
+  outer loop
+   vertex 0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex 0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.059197831240794162 0.088595824750780858 0.99430699314302085
+  outer loop
+   vertex 0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex 0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.020787518098262226 0.10450589731384755 0.9943069930951618
+  outer loop
+   vertex 0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex 1.2730919672892854e-18 0.020791169255971909 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.020787518098262219 0.10450589731384756 0.9943069930951618
+  outer loop
+   vertex 1.2730919672892854e-18 0.020791169255971909 0.097814761102199554
+   vertex -0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.059197831240794162 0.088595824750780858 0.99430699314302085
+  outer loop
+   vertex -0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex -0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.088595824750780858 0.059197831240794162 0.99430699314302085
+  outer loop
+   vertex -0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex -0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.10450589731384755 0.020787518098262226 0.9943069930951618
+  outer loop
+   vertex -0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex -0.020791169255971909 2.5461839345785708e-18 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.10450589731384756 -0.020787518098262219 0.9943069930951618
+  outer loop
+   vertex -0.020791169255971909 2.5461839345785708e-18 0.097814761102199554
+   vertex -0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.088595824750780858 -0.059197831240794162 0.99430699314302085
+  outer loop
+   vertex -0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex -0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.059197831240794162 -0.088595824750780858 0.99430699314302085
+  outer loop
+   vertex -0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex -0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal -0.020787518098262233 -0.10450589731384756 0.9943069930951618
+  outer loop
+   vertex -0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex -3.819275695072703e-18 -0.020791169255971909 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.020787518098262216 -0.10450589731384756 0.9943069930951618
+  outer loop
+   vertex -3.819275695072703e-18 -0.020791169255971909 0.097814761102199554
+   vertex 0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.059197831240794162 -0.088595824750780858 0.99430699314302085
+  outer loop
+   vertex 0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex 0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.088595824750780858 -0.059197831240794162 0.99430699314302085
+  outer loop
+   vertex 0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex 0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.10450589731384756 -0.020787518098262223 0.9943069930951618
+  outer loop
+   vertex 0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex 0.020791169255971909 0 0.097814761102199554
+   vertex 0 0 0.10000000149011612
+  endloop
+ endfacet
+ facet normal 0.10450589731384756 0.020787518098262223 -0.9943069930951618
+  outer loop
+   vertex 0.020791169255971909 0 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.088595824750780858 0.059197831240794162 -0.99430699314302085
+  outer loop
+   vertex 0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.01470157690346241 0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.059197831240794162 0.088595824750780858 -0.99430699314302085
+  outer loop
+   vertex 0.01470157690346241 0.01470157690346241 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.020787518098262226 0.10450589731384755 -0.9943069930951618
+  outer loop
+   vertex 0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 1.2730919672892854e-18 0.020791169255971909 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.020787518098262219 0.10450589731384756 -0.9943069930951618
+  outer loop
+   vertex 1.2730919672892854e-18 0.020791169255971909 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.059197831240794162 0.088595824750780858 -0.99430699314302085
+  outer loop
+   vertex -0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.01470157690346241 0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.088595824750780858 0.059197831240794162 -0.99430699314302085
+  outer loop
+   vertex -0.01470157690346241 0.01470157690346241 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.10450589731384755 0.02078751809826223 -0.9943069930951618
+  outer loop
+   vertex -0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.020791169255971909 2.5461839345785708e-18 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.10450589731384756 -0.020787518098262216 -0.9943069930951618
+  outer loop
+   vertex -0.020791169255971909 2.5461839345785708e-18 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.088595824750780858 -0.059197831240794162 -0.99430699314302085
+  outer loop
+   vertex -0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.059197831240794162 -0.088595824750780858 -0.99430699314302085
+  outer loop
+   vertex -0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.020787518098262233 -0.10450589731384756 -0.9943069930951618
+  outer loop
+   vertex -0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex -3.819275695072703e-18 -0.020791169255971909 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.020787518098262212 -0.10450589731384755 -0.9943069930951618
+  outer loop
+   vertex -3.819275695072703e-18 -0.020791169255971909 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.059197831240794162 -0.088595824750780858 -0.99430699314302085
+  outer loop
+   vertex 0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.088595824750780858 -0.059197831240794162 -0.99430699314302085
+  outer loop
+   vertex 0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.10450589731384756 -0.020787518098262223 -0.9943069930951618
+  outer loop
+   vertex 0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+   vertex 0 0 -0.10000000149011612
+   vertex 0.020791169255971909 0 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.30843476522401231 0.061351521400747594 0.94926497166124379
+  outer loop
+   vertex 0.020791169255971909 0 0.097814761102199554
+   vertex 0.040673665702342987 0 0.091354548931121826
+   vertex 0.037577565759420395 0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.30843478276930947 0.061351500668862545 0.94926496730034626
+  outer loop
+   vertex 0.020791169255971909 0 0.097814761102199554
+   vertex 0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex 0.019208535552024841 0.0079564359039068222 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.49754554609711599 0.098967962699230083 0.86177361987826373
+  outer loop
+   vertex 0.040673665702342987 0 0.091354548931121826
+   vertex 0.058778524398803711 0 0.080901697278022766
+   vertex 0.054304275661706924 0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.49754549605911413 0.098968004229828863 0.86177364399826861
+  outer loop
+   vertex 0.040673665702342987 0 0.091354548931121826
+   vertex 0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex 0.037577565759420395 0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.6632812473204962 0.13193484346784404 0.7366486163918875
+  outer loop
+   vertex 0.058778524398803711 0 0.080901697278022766
+   vertex 0.074314482510089874 0 0.06691306084394455
+   vertex 0.068657629191875458 0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.66328124731730775 0.13193484347015969 0.73664861639434354
+  outer loop
+   vertex 0.058778524398803711 0 0.080901697278022766
+   vertex 0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex 0.054304275661706924 0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.79874089113149127 0.15887934482690994 0.58031917306068981
+  outer loop
+   vertex 0.074314482510089874 0 0.06691306084394455
+   vertex 0.086602538824081421 0 0.05000000074505806
+   vertex 0.080010317265987396 0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.79874079057134661 0.15887942196636892 0.58031929035065921
+  outer loop
+   vertex 0.074314482510089874 0 0.06691306084394455
+   vertex 0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex 0.068657629191875458 0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.89882617438269374 0.17878756470117699 0.40018310178316374
+  outer loop
+   vertex 0.086602538824081421 0 0.05000000074505806
+   vertex 0.095105648040771484 0 0.030901700258255005
+   vertex 0.087866164743900299 0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.89882620092364052 0.17878753861432078 0.40018305382588132
+  outer loop
+   vertex 0.086602538824081421 0 0.05000000074505806
+   vertex 0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex 0.080010317265987396 0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.96014288401665793 0.19098433051579031 0.20408485433664575
+  outer loop
+   vertex 0.095105648040771484 0 0.030901700258255005
+   vertex 0.099452190101146698 0 0.010452846065163612
+   vertex 0.091881841421127319 0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.96014294936226929 0.19098422428494741 0.20408464632156809
+  outer loop
+   vertex 0.095105648040771484 0 0.030901700258255005
+   vertex 0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex 0.087866164743900299 0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.98078527328214282 0.19509035781625048 -0
+  outer loop
+   vertex 0.099452190101146698 0 0.010452846065163612
+   vertex 0.099452190101146698 0 -0.010452846065163612
+   vertex 0.091881841421127319 0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.98078527328214282 0.19509035781625048 -0
+  outer loop
+   vertex 0.099452190101146698 0 0.010452846065163612
+   vertex 0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex 0.091881841421127319 0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.96014290587992079 0.19098421563577428 -0.20408485898382991
+  outer loop
+   vertex 0.099452190101146698 0 -0.010452846065163612
+   vertex 0.095105648040771484 0 -0.030901700258255005
+   vertex 0.087866164743900299 0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.96014292559861558 0.1909843387869575 -0.2040846509687585
+  outer loop
+   vertex 0.099452190101146698 0 -0.010452846065163612
+   vertex 0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex 0.091881841421127319 0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.89882617942320453 0.17878753433762079 -0.40018310402734325
+  outer loop
+   vertex 0.095105648040771484 0 -0.030901700258255005
+   vertex 0.086602538824081421 0 -0.05000000074505806
+   vertex 0.080010317265987396 0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.89882619396083974 0.17878756859551068 -0.40018305607006494
+  outer loop
+   vertex 0.095105648040771484 0 -0.030901700258255005
+   vertex 0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex 0.087866164743900299 0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.79874087880382028 0.15887943951689917 -0.58031916410411333
+  outer loop
+   vertex 0.086602538824081421 0 -0.05000000074505806
+   vertex 0.074314482510089874 0 -0.06691306084394455
+   vertex 0.068657629191875458 0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.7987408154183383 0.1588793297666366 -0.58031928139408939
+  outer loop
+   vertex 0.086602538824081421 0 -0.05000000074505806
+   vertex 0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex 0.080010317265987396 0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.66328124732023808 0.13193484347074255 -0.73664861639160084
+  outer loop
+   vertex 0.074314482510089874 0 -0.06691306084394455
+   vertex 0.058778524398803711 0 -0.080901697278022766
+   vertex 0.054304275661706924 0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.66328124731817861 0.13193484346738305 -0.73664861639405699
+  outer loop
+   vertex 0.074314482510089874 0 -0.06691306084394455
+   vertex 0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex 0.068657629191875458 0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.49754554356199898 0.098968013678745081 -0.86177361548731513
+  outer loop
+   vertex 0.058778524398803711 0 -0.080901697278022766
+   vertex 0.040673665702342987 0 -0.091354548931121826
+   vertex 0.037577565759420395 0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.49754551322598684 0.098967956160755946 -0.86177363960732289
+  outer loop
+   vertex 0.058778524398803711 0 -0.080901697278022766
+   vertex 0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex 0.054304275661706924 0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.30843476568236111 0.061351497270056753 -0.94926497307189694
+  outer loop
+   vertex 0.040673665702342987 0 -0.091354548931121826
+   vertex 0.020791169255971909 0 -0.097814761102199554
+   vertex 0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.3084347739583525 0.061351523138116801 -0.94926496871099864
+  outer loop
+   vertex 0.040673665702342987 0 -0.091354548931121826
+   vertex 0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+   vertex 0.037577565759420395 0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.26147837970812587 0.17471428421919066 0.9492649660842799
+  outer loop
+   vertex 0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex 0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex 0.028760623186826706 0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.26147840938106925 0.17471426893077599 0.9492649607246284
+  outer loop
+   vertex 0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex 0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex 0.01470157690346241 0.01470157690346241 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.42179874557711361 0.28183684066621417 0.86177364398829248
+  outer loop
+   vertex 0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex 0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex 0.041562695056200027 0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.42179864590164712 0.28183687150574754 0.86177368268901633
+  outer loop
+   vertex 0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex 0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex 0.028760623186826706 0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.56230267786378618 0.37571865044532143 0.73664862327622749
+  outer loop
+   vertex 0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex 0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex 0.052548274397850037 0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.56230279592432497 0.37571862212216495 0.73664854760347465
+  outer loop
+   vertex 0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex 0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex 0.041562695056200027 0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.67713972638750908 0.45245040321610314 0.5803192428116053
+  outer loop
+   vertex 0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex 0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex 0.061237242072820663 0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.67713981980897864 0.4524503781983546 0.58031915330896144
+  outer loop
+   vertex 0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex 0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex 0.052548274397850037 0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.76198801003014671 0.50914415869095786 0.40018308090319588
+  outer loop
+   vertex 0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex 0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex 0.067249849438667297 0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.76198794657394719 0.50914418433618069 0.40018316910218049
+  outer loop
+   vertex 0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex 0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex 0.061237242072820663 0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.81396988974665174 0.54387724854201425 0.20408468120903095
+  outer loop
+   vertex 0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex 0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex 0.070323318243026733 0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.81396982149820041 0.54387729795136042 0.20408482173673517
+  outer loop
+   vertex 0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex 0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex 0.067249849438667297 0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.83146963292153175 0.55557020216110709 -0
+  outer loop
+   vertex 0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex 0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex 0.070323318243026733 0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.83146963292153175 0.55557020216110709 -0
+  outer loop
+   vertex 0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex 0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex 0.070323318243026733 0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.81396984640124925 0.54387731459104727 -0.20408467806956454
+  outer loop
+   vertex 0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex 0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex 0.067249849438667297 0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.81396986593198373 0.54387723262956311 -0.20408481859726049
+  outer loop
+   vertex 0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex 0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex 0.070323318243026733 0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.76198798009585644 0.50914420673480953 -0.40018307677589038
+  outer loop
+   vertex 0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex 0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex 0.061237242072820663 0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.76198797950532793 0.509144138294924 -0.40018316497487411
+  outer loop
+   vertex 0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex 0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex 0.067249849438667297 0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.67713976273003673 0.45245034005942358 -0.58031924964628023
+  outer loop
+   vertex 0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex 0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex 0.052548274397850037 0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.67713977536749692 0.45245043594349216 -0.58031916014362273
+  outer loop
+   vertex 0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex 0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex 0.061237242072820663 0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.56230271938745569 0.37571857098187661 -0.7366486321095076
+  outer loop
+   vertex 0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex 0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex 0.041562695056200027 0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.56230273840009004 0.37571869089438792 -0.73664855643676341
+  outer loop
+   vertex 0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex 0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex 0.052548274397850037 0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.42179871051676798 0.28183691468019506 -0.86177363694298537
+  outer loop
+   vertex 0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex 0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex 0.028760623186826706 0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.42179870086462851 0.28183681079029427 -0.86177367564370844
+  outer loop
+   vertex 0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex 0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex 0.041562695056200027 0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.26147839157789088 0.17471425703507376 -0.94926496781800662
+  outer loop
+   vertex 0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex 0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+   vertex 0.01470157690346241 0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.26147838880858149 0.17471429029992128 -0.94926496245835557
+  outer loop
+   vertex 0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex 0.01470157690346241 0.01470157690346241 -0.097814761102199554
+   vertex 0.028760623186826706 0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.17471429029992128 0.26147838880858149 0.94926496245835557
+  outer loop
+   vertex 0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex 0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex 0.015565137378871441 0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.17471425703507376 0.26147839157789088 0.94926496781800662
+  outer loop
+   vertex 0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex 0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex 0.0079564359039068222 0.019208535552024841 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.28183681079029427 0.42179870086462851 0.86177367564370844
+  outer loop
+   vertex 0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex 0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex 0.022493567317724228 0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.28183691468019506 0.42179871051676798 0.86177363694298537
+  outer loop
+   vertex 0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex 0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex 0.015565137378871441 0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.37571869089438792 0.56230273840009004 0.73664855643676341
+  outer loop
+   vertex 0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex 0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex 0.028438922017812729 0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.37571857098187661 0.56230271938745569 0.7366486321095076
+  outer loop
+   vertex 0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex 0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex 0.022493567317724228 0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.45245043594349216 0.67713977536749692 0.58031916014362273
+  outer loop
+   vertex 0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex 0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex 0.033141355961561203 0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.45245034005942358 0.67713976273003673 0.58031924964628023
+  outer loop
+   vertex 0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex 0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex 0.028438922017812729 0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.509144138294924 0.76198797950532793 0.40018316497487411
+  outer loop
+   vertex 0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex 0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex 0.036395356059074402 0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.50914420673480953 0.76198798009585644 0.40018307677589038
+  outer loop
+   vertex 0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex 0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex 0.033141355961561203 0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.54387723262956311 0.81396986593198373 0.20408481859726049
+  outer loop
+   vertex 0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex 0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex 0.038058705627918243 0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.54387731459104727 0.81396984640124925 0.20408467806956454
+  outer loop
+   vertex 0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex 0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex 0.036395356059074402 0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.55557020216110709 0.83146963292153175 -0
+  outer loop
+   vertex 0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex 0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex 0.038058705627918243 0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.55557020216110709 0.83146963292153175 -0
+  outer loop
+   vertex 0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex 0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex 0.038058705627918243 0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.54387729795136042 0.81396982149820041 -0.20408482173673517
+  outer loop
+   vertex 0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex 0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex 0.036395356059074402 0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.54387724854201425 0.81396988974665174 -0.20408468120903095
+  outer loop
+   vertex 0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex 0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex 0.038058705627918243 0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.50914418433618069 0.76198794657394719 -0.40018316910218049
+  outer loop
+   vertex 0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex 0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex 0.033141355961561203 0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.50914415869095786 0.76198801003014671 -0.40018308090319588
+  outer loop
+   vertex 0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex 0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex 0.036395356059074402 0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.4524503781983546 0.67713981980897864 -0.58031915330896144
+  outer loop
+   vertex 0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex 0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex 0.028438922017812729 0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.45245040321610314 0.67713972638750908 -0.5803192428116053
+  outer loop
+   vertex 0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex 0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex 0.033141355961561203 0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.37571862212216495 0.56230279592432497 -0.73664854760347465
+  outer loop
+   vertex 0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex 0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex 0.022493567317724228 0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.37571865044532143 0.56230267786378618 -0.73664862327622749
+  outer loop
+   vertex 0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex 0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex 0.028438922017812729 0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.28183687150574754 0.42179864590164712 -0.86177368268901633
+  outer loop
+   vertex 0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex 0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex 0.015565137378871441 0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.28183684066621417 0.42179874557711361 -0.86177364398829248
+  outer loop
+   vertex 0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex 0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex 0.022493567317724228 0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.17471426893077599 0.26147840938106925 -0.9492649607246284
+  outer loop
+   vertex 0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex 0.01470157690346241 0.01470157690346241 -0.097814761102199554
+   vertex 0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.17471428421919066 0.26147837970812587 -0.9492649660842799
+  outer loop
+   vertex 0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex 0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+   vertex 0.015565137378871441 0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.061351523138116808 0.3084347739583525 0.94926496871099864
+  outer loop
+   vertex 0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex 0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex 2.4905436306751913e-18 0.040673665702342987 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.061351497270056753 0.30843476568236106 0.94926497307189694
+  outer loop
+   vertex 0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex 2.4905436306751913e-18 0.040673665702342987 0.091354548931121826
+   vertex 1.2730919672892854e-18 0.020791169255971909 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.09896795616075596 0.49754551322598684 0.86177363960732289
+  outer loop
+   vertex 0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex 0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex 3.5991468040503975e-18 0.058778524398803711 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.098968013678745095 0.49754554356199898 0.86177361548731501
+  outer loop
+   vertex 0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex 3.5991468040503975e-18 0.058778524398803711 0.080901697278022766
+   vertex 2.4905436306751913e-18 0.040673665702342987 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.13193484346738305 0.6632812473181785 0.73664861639405688
+  outer loop
+   vertex 0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex 0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex 4.5504495898297635e-18 0.074314482510089874 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.13193484347074255 0.66328124732023797 0.73664861639160084
+  outer loop
+   vertex 0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex 4.5504495898297635e-18 0.074314482510089874 0.06691306084394455
+   vertex 3.5991468040503975e-18 0.058778524398803711 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.15887932976663663 0.79874081541833841 0.5803192813940895
+  outer loop
+   vertex 0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex 0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex 5.302876236065149e-18 0.086602538824081421 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.15887943951689923 0.79874087880382039 0.58031916410411333
+  outer loop
+   vertex 0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex 5.302876236065149e-18 0.086602538824081421 0.05000000074505806
+   vertex 4.5504495898297635e-18 0.074314482510089874 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.17878756859551068 0.89882619396083951 0.40018305607006488
+  outer loop
+   vertex 0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex 0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex 5.823541763914202e-18 0.095105648040771484 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.17878753433762079 0.89882617942320442 0.40018310402734319
+  outer loop
+   vertex 0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex 5.823541763914202e-18 0.095105648040771484 0.030901700258255005
+   vertex 5.302876236065149e-18 0.086602538824081421 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.19098433878695753 0.96014292559861558 0.2040846509687585
+  outer loop
+   vertex 0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex 0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex 6.0896904347255889e-18 0.099452190101146698 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.19098421563577431 0.96014290587992079 0.20408485898382991
+  outer loop
+   vertex 0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex 6.0896904347255889e-18 0.099452190101146698 0.010452846065163612
+   vertex 5.823541763914202e-18 0.095105648040771484 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.19509035781625048 0.98078527328214271 -0
+  outer loop
+   vertex 0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex 0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex 6.0896904347255889e-18 0.099452190101146698 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.19509035781625048 0.98078527328214271 -0
+  outer loop
+   vertex 0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex 6.0896904347255889e-18 0.099452190101146698 -0.010452846065163612
+   vertex 6.0896904347255889e-18 0.099452190101146698 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.19098422428494746 0.9601429493622694 -0.20408464632156811
+  outer loop
+   vertex 0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex 0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex 5.823541763914202e-18 0.095105648040771484 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.19098433051579031 0.96014288401665793 -0.20408485433664572
+  outer loop
+   vertex 0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex 5.823541763914202e-18 0.095105648040771484 -0.030901700258255005
+   vertex 6.0896904347255889e-18 0.099452190101146698 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.17878753861432081 0.89882620092364052 -0.40018305382588126
+  outer loop
+   vertex 0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex 0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex 5.302876236065149e-18 0.086602538824081421 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.17878756470117702 0.89882617438269363 -0.40018310178316374
+  outer loop
+   vertex 0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex 5.302876236065149e-18 0.086602538824081421 -0.05000000074505806
+   vertex 5.823541763914202e-18 0.095105648040771484 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.15887942196636895 0.79874079057134661 -0.58031929035065921
+  outer loop
+   vertex 0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex 0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex 4.5504495898297635e-18 0.074314482510089874 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.15887934482690999 0.79874089113149138 -0.58031917306068981
+  outer loop
+   vertex 0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex 4.5504495898297635e-18 0.074314482510089874 -0.06691306084394455
+   vertex 5.302876236065149e-18 0.086602538824081421 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.13193484347015971 0.66328124731730786 -0.73664861639434365
+  outer loop
+   vertex 0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex 0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex 3.5991468040503975e-18 0.058778524398803711 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.13193484346784407 0.6632812473204962 -0.73664861639188761
+  outer loop
+   vertex 0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex 3.5991468040503975e-18 0.058778524398803711 -0.080901697278022766
+   vertex 4.5504495898297635e-18 0.074314482510089874 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.098968004229828876 0.49754549605911413 -0.86177364399826861
+  outer loop
+   vertex 0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex 0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex 2.4905436306751913e-18 0.040673665702342987 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.098967962699230097 0.49754554609711604 -0.86177361987826384
+  outer loop
+   vertex 0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex 2.4905436306751913e-18 0.040673665702342987 -0.091354548931121826
+   vertex 3.5991468040503975e-18 0.058778524398803711 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.061351500668862552 0.30843478276930947 -0.94926496730034626
+  outer loop
+   vertex 0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex 0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+   vertex 1.2730919672892854e-18 0.020791169255971909 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.061351521400747608 0.30843476522401225 -0.94926497166124379
+  outer loop
+   vertex 0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex 1.2730919672892854e-18 0.020791169255971909 -0.097814761102199554
+   vertex 2.4905436306751913e-18 0.040673665702342987 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.061351521400747587 0.30843476522401225 0.94926497166124379
+  outer loop
+   vertex 1.2730919672892854e-18 0.020791169255971909 0.097814761102199554
+   vertex 2.4905436306751913e-18 0.040673665702342987 0.091354548931121826
+   vertex -0.015565137378871441 0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.061351500668862524 0.30843478276930947 0.94926496730034626
+  outer loop
+   vertex 1.2730919672892854e-18 0.020791169255971909 0.097814761102199554
+   vertex -0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex -0.0079564359039068222 0.019208535552024841 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.098967962699230083 0.49754554609711604 0.86177361987826384
+  outer loop
+   vertex 2.4905436306751913e-18 0.040673665702342987 0.091354548931121826
+   vertex 3.5991468040503975e-18 0.058778524398803711 0.080901697278022766
+   vertex -0.022493567317724228 0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.098968004229828835 0.49754549605911413 0.86177364399826861
+  outer loop
+   vertex 2.4905436306751913e-18 0.040673665702342987 0.091354548931121826
+   vertex -0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex -0.015565137378871441 0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.13193484346784401 0.66328124732049609 0.7366486163918875
+  outer loop
+   vertex 3.5991468040503975e-18 0.058778524398803711 0.080901697278022766
+   vertex 4.5504495898297635e-18 0.074314482510089874 0.06691306084394455
+   vertex -0.028438922017812729 0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.13193484347015969 0.66328124731730786 0.73664861639434365
+  outer loop
+   vertex 3.5991468040503975e-18 0.058778524398803711 0.080901697278022766
+   vertex -0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex -0.022493567317724228 0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.15887934482690991 0.79874089113149138 0.58031917306068992
+  outer loop
+   vertex 4.5504495898297635e-18 0.074314482510089874 0.06691306084394455
+   vertex 5.302876236065149e-18 0.086602538824081421 0.05000000074505806
+   vertex -0.033141355961561203 0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.15887942196636889 0.79874079057134661 0.58031929035065921
+  outer loop
+   vertex 4.5504495898297635e-18 0.074314482510089874 0.06691306084394455
+   vertex -0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex -0.028438922017812729 0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.17878756470117696 0.89882617438269374 0.4001831017831638
+  outer loop
+   vertex 5.302876236065149e-18 0.086602538824081421 0.05000000074505806
+   vertex 5.823541763914202e-18 0.095105648040771484 0.030901700258255005
+   vertex -0.036395356059074402 0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.17878753861432076 0.89882620092364052 0.40018305382588132
+  outer loop
+   vertex 5.302876236065149e-18 0.086602538824081421 0.05000000074505806
+   vertex -0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex -0.033141355961561203 0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.19098433051579028 0.96014288401665793 0.20408485433664575
+  outer loop
+   vertex 5.823541763914202e-18 0.095105648040771484 0.030901700258255005
+   vertex 6.0896904347255889e-18 0.099452190101146698 0.010452846065163612
+   vertex -0.038058705627918243 0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.19098422428494741 0.9601429493622694 0.20408464632156811
+  outer loop
+   vertex 5.823541763914202e-18 0.095105648040771484 0.030901700258255005
+   vertex -0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex -0.036395356059074402 0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.19509035781625042 0.98078527328214271 0
+  outer loop
+   vertex 6.0896904347255889e-18 0.099452190101146698 0.010452846065163612
+   vertex 6.0896904347255889e-18 0.099452190101146698 -0.010452846065163612
+   vertex -0.038058705627918243 0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.19509035781625042 0.98078527328214271 0
+  outer loop
+   vertex 6.0896904347255889e-18 0.099452190101146698 0.010452846065163612
+   vertex -0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex -0.038058705627918243 0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.19098421563577425 0.96014290587992079 -0.20408485898382991
+  outer loop
+   vertex 6.0896904347255889e-18 0.099452190101146698 -0.010452846065163612
+   vertex 5.823541763914202e-18 0.095105648040771484 -0.030901700258255005
+   vertex -0.036395356059074402 0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.19098433878695747 0.96014292559861558 -0.20408465096875852
+  outer loop
+   vertex 6.0896904347255889e-18 0.099452190101146698 -0.010452846065163612
+   vertex -0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex -0.038058705627918243 0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.17878753433762073 0.89882617942320442 -0.40018310402734325
+  outer loop
+   vertex 5.823541763914202e-18 0.095105648040771484 -0.030901700258255005
+   vertex 5.302876236065149e-18 0.086602538824081421 -0.05000000074505806
+   vertex -0.033141355961561203 0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.17878756859551062 0.89882619396083963 -0.40018305607006494
+  outer loop
+   vertex 5.823541763914202e-18 0.095105648040771484 -0.030901700258255005
+   vertex -0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex -0.036395356059074402 0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.15887943951689915 0.79874087880382016 -0.58031916410411333
+  outer loop
+   vertex 5.302876236065149e-18 0.086602538824081421 -0.05000000074505806
+   vertex 4.5504495898297635e-18 0.074314482510089874 -0.06691306084394455
+   vertex -0.028438922017812729 0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.15887932976663657 0.7987408154183383 -0.58031928139408939
+  outer loop
+   vertex 5.302876236065149e-18 0.086602538824081421 -0.05000000074505806
+   vertex -0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex -0.033141355961561203 0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.13193484347074252 0.66328124732023797 -0.73664861639160084
+  outer loop
+   vertex 4.5504495898297635e-18 0.074314482510089874 -0.06691306084394455
+   vertex 3.5991468040503975e-18 0.058778524398803711 -0.080901697278022766
+   vertex -0.022493567317724228 0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.13193484346738302 0.66328124731817861 -0.73664861639405699
+  outer loop
+   vertex 4.5504495898297635e-18 0.074314482510089874 -0.06691306084394455
+   vertex -0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex -0.028438922017812729 0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.098968013678745068 0.49754554356199898 -0.86177361548731513
+  outer loop
+   vertex 3.5991468040503975e-18 0.058778524398803711 -0.080901697278022766
+   vertex 2.4905436306751913e-18 0.040673665702342987 -0.091354548931121826
+   vertex -0.015565137378871441 0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.098967956160755932 0.49754551322598684 -0.86177363960732289
+  outer loop
+   vertex 3.5991468040503975e-18 0.058778524398803711 -0.080901697278022766
+   vertex -0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex -0.022493567317724228 0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.061351497270056739 0.30843476568236111 -0.94926497307189694
+  outer loop
+   vertex 2.4905436306751913e-18 0.040673665702342987 -0.091354548931121826
+   vertex 1.2730919672892854e-18 0.020791169255971909 -0.097814761102199554
+   vertex -0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.061351523138116801 0.30843477395835256 -0.94926496871099864
+  outer loop
+   vertex 2.4905436306751913e-18 0.040673665702342987 -0.091354548931121826
+   vertex -0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+   vertex -0.015565137378871441 0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.17471428421919066 0.26147837970812587 0.9492649660842799
+  outer loop
+   vertex -0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex -0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex -0.028760623186826706 0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.17471426893077599 0.26147840938106925 0.9492649607246284
+  outer loop
+   vertex -0.0079564359039068222 0.019208535552024841 0.097814761102199554
+   vertex -0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex -0.01470157690346241 0.01470157690346241 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.28183684066621417 0.42179874557711361 0.86177364398829248
+  outer loop
+   vertex -0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex -0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex -0.041562695056200027 0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.28183687150574754 0.42179864590164712 0.86177368268901633
+  outer loop
+   vertex -0.015565137378871441 0.037577565759420395 0.091354548931121826
+   vertex -0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex -0.028760623186826706 0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.37571865044532143 0.56230267786378618 0.73664862327622749
+  outer loop
+   vertex -0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex -0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex -0.052548274397850037 0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.37571862212216495 0.56230279592432497 0.73664854760347465
+  outer loop
+   vertex -0.022493567317724228 0.054304275661706924 0.080901697278022766
+   vertex -0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex -0.041562695056200027 0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.45245040321610314 0.67713972638750908 0.5803192428116053
+  outer loop
+   vertex -0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex -0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex -0.061237242072820663 0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.4524503781983546 0.67713981980897864 0.58031915330896144
+  outer loop
+   vertex -0.028438922017812729 0.068657629191875458 0.06691306084394455
+   vertex -0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex -0.052548274397850037 0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.50914415869095786 0.76198801003014671 0.40018308090319588
+  outer loop
+   vertex -0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex -0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex -0.067249849438667297 0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.50914418433618069 0.76198794657394719 0.40018316910218049
+  outer loop
+   vertex -0.033141355961561203 0.080010317265987396 0.05000000074505806
+   vertex -0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex -0.061237242072820663 0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.54387724854201425 0.81396988974665174 0.20408468120903095
+  outer loop
+   vertex -0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex -0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex -0.070323318243026733 0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.54387729795136042 0.81396982149820041 0.20408482173673517
+  outer loop
+   vertex -0.036395356059074402 0.087866164743900299 0.030901700258255005
+   vertex -0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex -0.067249849438667297 0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.55557020216110709 0.83146963292153175 0
+  outer loop
+   vertex -0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex -0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex -0.070323318243026733 0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.55557020216110709 0.83146963292153175 0
+  outer loop
+   vertex -0.038058705627918243 0.091881841421127319 0.010452846065163612
+   vertex -0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex -0.070323318243026733 0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.54387731459104727 0.81396984640124925 -0.20408467806956454
+  outer loop
+   vertex -0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex -0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex -0.067249849438667297 0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.54387723262956311 0.81396986593198373 -0.20408481859726049
+  outer loop
+   vertex -0.038058705627918243 0.091881841421127319 -0.010452846065163612
+   vertex -0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex -0.070323318243026733 0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.50914420673480953 0.76198798009585644 -0.40018307677589038
+  outer loop
+   vertex -0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex -0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex -0.061237242072820663 0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.509144138294924 0.76198797950532793 -0.40018316497487411
+  outer loop
+   vertex -0.036395356059074402 0.087866164743900299 -0.030901700258255005
+   vertex -0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex -0.067249849438667297 0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.45245034005942358 0.67713976273003673 -0.58031924964628023
+  outer loop
+   vertex -0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex -0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex -0.052548274397850037 0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.45245043594349216 0.67713977536749692 -0.58031916014362273
+  outer loop
+   vertex -0.033141355961561203 0.080010317265987396 -0.05000000074505806
+   vertex -0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex -0.061237242072820663 0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.37571857098187661 0.56230271938745569 -0.7366486321095076
+  outer loop
+   vertex -0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex -0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex -0.041562695056200027 0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.37571869089438792 0.56230273840009004 -0.73664855643676341
+  outer loop
+   vertex -0.028438922017812729 0.068657629191875458 -0.06691306084394455
+   vertex -0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex -0.052548274397850037 0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.28183691468019506 0.42179871051676798 -0.86177363694298537
+  outer loop
+   vertex -0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex -0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex -0.028760623186826706 0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.28183681079029427 0.42179870086462851 -0.86177367564370844
+  outer loop
+   vertex -0.022493567317724228 0.054304275661706924 -0.080901697278022766
+   vertex -0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex -0.041562695056200027 0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.17471425703507376 0.26147839157789088 -0.94926496781800662
+  outer loop
+   vertex -0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex -0.0079564359039068222 0.019208535552024841 -0.097814761102199554
+   vertex -0.01470157690346241 0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.17471429029992128 0.26147838880858149 -0.94926496245835557
+  outer loop
+   vertex -0.015565137378871441 0.037577565759420395 -0.091354548931121826
+   vertex -0.01470157690346241 0.01470157690346241 -0.097814761102199554
+   vertex -0.028760623186826706 0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.26147838880858149 0.17471429029992128 0.94926496245835557
+  outer loop
+   vertex -0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex -0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex -0.037577565759420395 0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.26147839157789088 0.17471425703507376 0.94926496781800662
+  outer loop
+   vertex -0.01470157690346241 0.01470157690346241 0.097814761102199554
+   vertex -0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex -0.019208535552024841 0.0079564359039068222 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.42179870086462851 0.28183681079029427 0.86177367564370844
+  outer loop
+   vertex -0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex -0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex -0.054304275661706924 0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.42179871051676798 0.28183691468019506 0.86177363694298537
+  outer loop
+   vertex -0.028760623186826706 0.028760623186826706 0.091354548931121826
+   vertex -0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex -0.037577565759420395 0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.56230273840009004 0.37571869089438792 0.73664855643676341
+  outer loop
+   vertex -0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex -0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex -0.068657629191875458 0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.56230271938745569 0.37571857098187661 0.7366486321095076
+  outer loop
+   vertex -0.041562695056200027 0.041562695056200027 0.080901697278022766
+   vertex -0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex -0.054304275661706924 0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.67713977536749692 0.45245043594349216 0.58031916014362273
+  outer loop
+   vertex -0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex -0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex -0.080010317265987396 0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.67713976273003673 0.45245034005942358 0.58031924964628023
+  outer loop
+   vertex -0.052548274397850037 0.052548274397850037 0.06691306084394455
+   vertex -0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex -0.068657629191875458 0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.76198797950532793 0.509144138294924 0.40018316497487411
+  outer loop
+   vertex -0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex -0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex -0.087866164743900299 0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.76198798009585644 0.50914420673480953 0.40018307677589038
+  outer loop
+   vertex -0.061237242072820663 0.061237242072820663 0.05000000074505806
+   vertex -0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex -0.080010317265987396 0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.81396986593198373 0.54387723262956311 0.20408481859726049
+  outer loop
+   vertex -0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex -0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex -0.091881841421127319 0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.81396984640124925 0.54387731459104727 0.20408467806956454
+  outer loop
+   vertex -0.067249849438667297 0.067249849438667297 0.030901700258255005
+   vertex -0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex -0.087866164743900299 0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.83146963292153175 0.55557020216110709 0
+  outer loop
+   vertex -0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex -0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex -0.091881841421127319 0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.83146963292153175 0.55557020216110709 0
+  outer loop
+   vertex -0.070323318243026733 0.070323318243026733 0.010452846065163612
+   vertex -0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex -0.091881841421127319 0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.81396982149820041 0.54387729795136042 -0.20408482173673517
+  outer loop
+   vertex -0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex -0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex -0.087866164743900299 0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.81396988974665174 0.54387724854201425 -0.20408468120903095
+  outer loop
+   vertex -0.070323318243026733 0.070323318243026733 -0.010452846065163612
+   vertex -0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex -0.091881841421127319 0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.76198794657394719 0.50914418433618069 -0.40018316910218049
+  outer loop
+   vertex -0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex -0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex -0.080010317265987396 0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.76198801003014671 0.50914415869095786 -0.40018308090319588
+  outer loop
+   vertex -0.067249849438667297 0.067249849438667297 -0.030901700258255005
+   vertex -0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex -0.087866164743900299 0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.67713981980897864 0.4524503781983546 -0.58031915330896144
+  outer loop
+   vertex -0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex -0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex -0.068657629191875458 0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.67713972638750908 0.45245040321610314 -0.5803192428116053
+  outer loop
+   vertex -0.061237242072820663 0.061237242072820663 -0.05000000074505806
+   vertex -0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex -0.080010317265987396 0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.56230279592432497 0.37571862212216495 -0.73664854760347465
+  outer loop
+   vertex -0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex -0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex -0.054304275661706924 0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.56230267786378618 0.37571865044532143 -0.73664862327622749
+  outer loop
+   vertex -0.052548274397850037 0.052548274397850037 -0.06691306084394455
+   vertex -0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex -0.068657629191875458 0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.42179864590164712 0.28183687150574754 -0.86177368268901633
+  outer loop
+   vertex -0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex -0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex -0.037577565759420395 0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.42179874557711361 0.28183684066621417 -0.86177364398829248
+  outer loop
+   vertex -0.041562695056200027 0.041562695056200027 -0.080901697278022766
+   vertex -0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex -0.054304275661706924 0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.26147840938106925 0.17471426893077599 -0.9492649607246284
+  outer loop
+   vertex -0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex -0.01470157690346241 0.01470157690346241 -0.097814761102199554
+   vertex -0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.26147837970812587 0.17471428421919066 -0.9492649660842799
+  outer loop
+   vertex -0.028760623186826706 0.028760623186826706 -0.091354548931121826
+   vertex -0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+   vertex -0.037577565759420395 0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.30843477395835256 0.061351523138116815 0.94926496871099864
+  outer loop
+   vertex -0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex -0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex -0.040673665702342987 4.9810872613503827e-18 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.30843476568236106 0.061351497270056773 0.94926497307189694
+  outer loop
+   vertex -0.019208535552024841 0.0079564359039068222 0.097814761102199554
+   vertex -0.040673665702342987 4.9810872613503827e-18 0.091354548931121826
+   vertex -0.020791169255971909 2.5461839345785708e-18 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.49754551322598684 0.098967956160755974 0.86177363960732301
+  outer loop
+   vertex -0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex -0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex -0.058778524398803711 7.1982936081007951e-18 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.49754554356199887 0.098968013678745095 0.86177361548731501
+  outer loop
+   vertex -0.037577565759420395 0.015565137378871441 0.091354548931121826
+   vertex -0.058778524398803711 7.1982936081007951e-18 0.080901697278022766
+   vertex -0.040673665702342987 4.9810872613503827e-18 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.6632812473181785 0.13193484346738307 0.73664861639405688
+  outer loop
+   vertex -0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex -0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex -0.074314482510089874 9.100899179659527e-18 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.66328124732023797 0.13193484347074261 0.73664861639160095
+  outer loop
+   vertex -0.054304275661706924 0.022493567317724228 0.080901697278022766
+   vertex -0.074314482510089874 9.100899179659527e-18 0.06691306084394455
+   vertex -0.058778524398803711 7.1982936081007951e-18 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.79874081541833841 0.15887932976663666 0.58031928139408939
+  outer loop
+   vertex -0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex -0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex -0.086602538824081421 1.0605752472130298e-17 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.79874087880382028 0.15887943951689923 0.58031916410411333
+  outer loop
+   vertex -0.068657629191875458 0.028438922017812729 0.06691306084394455
+   vertex -0.086602538824081421 1.0605752472130298e-17 0.05000000074505806
+   vertex -0.074314482510089874 9.100899179659527e-18 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.89882619396083963 0.1787875685955107 0.40018305607006494
+  outer loop
+   vertex -0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex -0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex -0.095105648040771484 1.1647083527828404e-17 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.89882617942320453 0.17878753433762085 0.40018310402734325
+  outer loop
+   vertex -0.080010317265987396 0.033141355961561203 0.05000000074505806
+   vertex -0.095105648040771484 1.1647083527828404e-17 0.030901700258255005
+   vertex -0.086602538824081421 1.0605752472130298e-17 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.96014292559861558 0.19098433878695759 0.20408465096875852
+  outer loop
+   vertex -0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex -0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex -0.099452190101146698 1.2179380869451178e-17 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.96014290587992079 0.19098421563577436 0.20408485898382991
+  outer loop
+   vertex -0.087866164743900299 0.036395356059074402 0.030901700258255005
+   vertex -0.099452190101146698 1.2179380869451178e-17 0.010452846065163612
+   vertex -0.095105648040771484 1.1647083527828404e-17 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.98078527328214271 0.19509035781625053 0
+  outer loop
+   vertex -0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex -0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex -0.099452190101146698 1.2179380869451178e-17 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.98078527328214271 0.19509035781625053 0
+  outer loop
+   vertex -0.091881841421127319 0.038058705627918243 0.010452846065163612
+   vertex -0.099452190101146698 1.2179380869451178e-17 -0.010452846065163612
+   vertex -0.099452190101146698 1.2179380869451178e-17 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.9601429493622694 0.19098422428494752 -0.20408464632156814
+  outer loop
+   vertex -0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex -0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex -0.095105648040771484 1.1647083527828404e-17 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.96014288401665793 0.19098433051579036 -0.20408485433664575
+  outer loop
+   vertex -0.091881841421127319 0.038058705627918243 -0.010452846065163612
+   vertex -0.095105648040771484 1.1647083527828404e-17 -0.030901700258255005
+   vertex -0.099452190101146698 1.2179380869451178e-17 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.89882620092364052 0.17878753861432084 -0.40018305382588126
+  outer loop
+   vertex -0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex -0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex -0.086602538824081421 1.0605752472130298e-17 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.89882617438269374 0.17878756470117704 -0.4001831017831638
+  outer loop
+   vertex -0.087866164743900299 0.036395356059074402 -0.030901700258255005
+   vertex -0.086602538824081421 1.0605752472130298e-17 -0.05000000074505806
+   vertex -0.095105648040771484 1.1647083527828404e-17 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.79874079057134661 0.15887942196636898 -0.58031929035065921
+  outer loop
+   vertex -0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex -0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex -0.074314482510089874 9.100899179659527e-18 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.79874089113149138 0.15887934482690999 -0.58031917306068981
+  outer loop
+   vertex -0.080010317265987396 0.033141355961561203 -0.05000000074505806
+   vertex -0.074314482510089874 9.100899179659527e-18 -0.06691306084394455
+   vertex -0.086602538824081421 1.0605752472130298e-17 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.66328124731730775 0.13193484347015974 -0.73664861639434365
+  outer loop
+   vertex -0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex -0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex -0.058778524398803711 7.1982936081007951e-18 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.66328124732049609 0.13193484346784407 -0.7366486163918875
+  outer loop
+   vertex -0.068657629191875458 0.028438922017812729 -0.06691306084394455
+   vertex -0.058778524398803711 7.1982936081007951e-18 -0.080901697278022766
+   vertex -0.074314482510089874 9.100899179659527e-18 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.49754549605911413 0.09896800422982889 -0.86177364399826861
+  outer loop
+   vertex -0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex -0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex -0.040673665702342987 4.9810872613503827e-18 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.49754554609711604 0.098967962699230111 -0.86177361987826384
+  outer loop
+   vertex -0.054304275661706924 0.022493567317724228 -0.080901697278022766
+   vertex -0.040673665702342987 4.9810872613503827e-18 -0.091354548931121826
+   vertex -0.058778524398803711 7.1982936081007951e-18 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.30843478276930947 0.061351500668862552 -0.94926496730034626
+  outer loop
+   vertex -0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex -0.019208535552024841 0.0079564359039068222 -0.097814761102199554
+   vertex -0.020791169255971909 2.5461839345785708e-18 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.30843476522401231 0.061351521400747615 -0.94926497166124379
+  outer loop
+   vertex -0.037577565759420395 0.015565137378871441 -0.091354548931121826
+   vertex -0.020791169255971909 2.5461839345785708e-18 -0.097814761102199554
+   vertex -0.040673665702342987 4.9810872613503827e-18 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.30843476522401225 -0.061351521400747573 0.94926497166124379
+  outer loop
+   vertex -0.020791169255971909 2.5461839345785708e-18 0.097814761102199554
+   vertex -0.040673665702342987 4.9810872613503827e-18 0.091354548931121826
+   vertex -0.037577565759420395 -0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.30843478276930947 -0.061351500668862524 0.94926496730034626
+  outer loop
+   vertex -0.020791169255971909 2.5461839345785708e-18 0.097814761102199554
+   vertex -0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex -0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.49754554609711604 -0.098967962699230055 0.86177361987826384
+  outer loop
+   vertex -0.040673665702342987 4.9810872613503827e-18 0.091354548931121826
+   vertex -0.058778524398803711 7.1982936081007951e-18 0.080901697278022766
+   vertex -0.054304275661706924 -0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.49754549605911413 -0.098968004229828835 0.86177364399826861
+  outer loop
+   vertex -0.040673665702342987 4.9810872613503827e-18 0.091354548931121826
+   vertex -0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex -0.037577565759420395 -0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.6632812473204962 -0.13193484346784398 0.7366486163918875
+  outer loop
+   vertex -0.058778524398803711 7.1982936081007951e-18 0.080901697278022766
+   vertex -0.074314482510089874 9.100899179659527e-18 0.06691306084394455
+   vertex -0.068657629191875458 -0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.66328124731730786 -0.13193484347015966 0.73664861639434365
+  outer loop
+   vertex -0.058778524398803711 7.1982936081007951e-18 0.080901697278022766
+   vertex -0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex -0.054304275661706924 -0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.79874089113149138 -0.15887934482690988 0.58031917306068992
+  outer loop
+   vertex -0.074314482510089874 9.100899179659527e-18 0.06691306084394455
+   vertex -0.086602538824081421 1.0605752472130298e-17 0.05000000074505806
+   vertex -0.080010317265987396 -0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.79874079057134661 -0.15887942196636889 0.58031929035065921
+  outer loop
+   vertex -0.074314482510089874 9.100899179659527e-18 0.06691306084394455
+   vertex -0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex -0.068657629191875458 -0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.89882617438269374 -0.17878756470117693 0.4001831017831638
+  outer loop
+   vertex -0.086602538824081421 1.0605752472130298e-17 0.05000000074505806
+   vertex -0.095105648040771484 1.1647083527828404e-17 0.030901700258255005
+   vertex -0.087866164743900299 -0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.89882620092364052 -0.17878753861432073 0.40018305382588132
+  outer loop
+   vertex -0.086602538824081421 1.0605752472130298e-17 0.05000000074505806
+   vertex -0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex -0.080010317265987396 -0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.96014288401665793 -0.19098433051579022 0.20408485433664572
+  outer loop
+   vertex -0.095105648040771484 1.1647083527828404e-17 0.030901700258255005
+   vertex -0.099452190101146698 1.2179380869451178e-17 0.010452846065163612
+   vertex -0.091881841421127319 -0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.9601429493622694 -0.19098422428494735 0.20408464632156811
+  outer loop
+   vertex -0.095105648040771484 1.1647083527828404e-17 0.030901700258255005
+   vertex -0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex -0.087866164743900299 -0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.98078527328214282 -0.19509035781625039 0
+  outer loop
+   vertex -0.099452190101146698 1.2179380869451178e-17 0.010452846065163612
+   vertex -0.099452190101146698 1.2179380869451178e-17 -0.010452846065163612
+   vertex -0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.98078527328214282 -0.19509035781625039 0
+  outer loop
+   vertex -0.099452190101146698 1.2179380869451178e-17 0.010452846065163612
+   vertex -0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex -0.091881841421127319 -0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.96014290587992079 -0.1909842156357742 -0.20408485898382989
+  outer loop
+   vertex -0.099452190101146698 1.2179380869451178e-17 -0.010452846065163612
+   vertex -0.095105648040771484 1.1647083527828404e-17 -0.030901700258255005
+   vertex -0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.96014292559861558 -0.19098433878695742 -0.2040846509687585
+  outer loop
+   vertex -0.099452190101146698 1.2179380869451178e-17 -0.010452846065163612
+   vertex -0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex -0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.89882617942320464 -0.17878753433762073 -0.40018310402734331
+  outer loop
+   vertex -0.095105648040771484 1.1647083527828404e-17 -0.030901700258255005
+   vertex -0.086602538824081421 1.0605752472130298e-17 -0.05000000074505806
+   vertex -0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.89882619396083963 -0.17878756859551059 -0.40018305607006494
+  outer loop
+   vertex -0.095105648040771484 1.1647083527828404e-17 -0.030901700258255005
+   vertex -0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex -0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.79874087880382028 -0.15887943951689912 -0.58031916410411333
+  outer loop
+   vertex -0.086602538824081421 1.0605752472130298e-17 -0.05000000074505806
+   vertex -0.074314482510089874 9.100899179659527e-18 -0.06691306084394455
+   vertex -0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.79874081541833841 -0.15887932976663655 -0.58031928139408928
+  outer loop
+   vertex -0.086602538824081421 1.0605752472130298e-17 -0.05000000074505806
+   vertex -0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex -0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.66328124732023808 -0.1319348434707425 -0.73664861639160084
+  outer loop
+   vertex -0.074314482510089874 9.100899179659527e-18 -0.06691306084394455
+   vertex -0.058778524398803711 7.1982936081007951e-18 -0.080901697278022766
+   vertex -0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.6632812473181785 -0.13193484346738299 -0.73664861639405688
+  outer loop
+   vertex -0.074314482510089874 9.100899179659527e-18 -0.06691306084394455
+   vertex -0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex -0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.49754554356199887 -0.098968013678745026 -0.86177361548731501
+  outer loop
+   vertex -0.058778524398803711 7.1982936081007951e-18 -0.080901697278022766
+   vertex -0.040673665702342987 4.9810872613503827e-18 -0.091354548931121826
+   vertex -0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.49754551322598689 -0.098967956160755918 -0.86177363960732289
+  outer loop
+   vertex -0.058778524398803711 7.1982936081007951e-18 -0.080901697278022766
+   vertex -0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex -0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.30843476568236111 -0.061351497270056739 -0.94926497307189694
+  outer loop
+   vertex -0.040673665702342987 4.9810872613503827e-18 -0.091354548931121826
+   vertex -0.020791169255971909 2.5461839345785708e-18 -0.097814761102199554
+   vertex -0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.3084347739583525 -0.06135152313811678 -0.94926496871099864
+  outer loop
+   vertex -0.040673665702342987 4.9810872613503827e-18 -0.091354548931121826
+   vertex -0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+   vertex -0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.26147837970812587 -0.17471428421919066 0.9492649660842799
+  outer loop
+   vertex -0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex -0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex -0.028760623186826706 -0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.26147840938106925 -0.17471426893077599 0.9492649607246284
+  outer loop
+   vertex -0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex -0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex -0.01470157690346241 -0.01470157690346241 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.42179874557711361 -0.28183684066621417 0.86177364398829248
+  outer loop
+   vertex -0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex -0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex -0.041562695056200027 -0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.42179864590164712 -0.28183687150574754 0.86177368268901633
+  outer loop
+   vertex -0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex -0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex -0.028760623186826706 -0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.56230267786378618 -0.37571865044532143 0.73664862327622749
+  outer loop
+   vertex -0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex -0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex -0.052548274397850037 -0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.56230279592432497 -0.37571862212216495 0.73664854760347465
+  outer loop
+   vertex -0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex -0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex -0.041562695056200027 -0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.67713972638750908 -0.45245040321610314 0.5803192428116053
+  outer loop
+   vertex -0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex -0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex -0.061237242072820663 -0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.67713981980897864 -0.4524503781983546 0.58031915330896144
+  outer loop
+   vertex -0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex -0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex -0.052548274397850037 -0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.76198801003014671 -0.50914415869095786 0.40018308090319588
+  outer loop
+   vertex -0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex -0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex -0.067249849438667297 -0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.76198794657394719 -0.50914418433618069 0.40018316910218049
+  outer loop
+   vertex -0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex -0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex -0.061237242072820663 -0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.81396988974665174 -0.54387724854201425 0.20408468120903095
+  outer loop
+   vertex -0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex -0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex -0.070323318243026733 -0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.81396982149820041 -0.54387729795136042 0.20408482173673517
+  outer loop
+   vertex -0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex -0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex -0.067249849438667297 -0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.83146963292153175 -0.55557020216110709 0
+  outer loop
+   vertex -0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex -0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex -0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.83146963292153175 -0.55557020216110709 0
+  outer loop
+   vertex -0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex -0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex -0.070323318243026733 -0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.81396984640124925 -0.54387731459104727 -0.20408467806956454
+  outer loop
+   vertex -0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex -0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex -0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.81396986593198373 -0.54387723262956311 -0.20408481859726049
+  outer loop
+   vertex -0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex -0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex -0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.76198798009585644 -0.50914420673480953 -0.40018307677589038
+  outer loop
+   vertex -0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex -0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex -0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.76198797950532793 -0.509144138294924 -0.40018316497487411
+  outer loop
+   vertex -0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex -0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex -0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.67713976273003673 -0.45245034005942358 -0.58031924964628023
+  outer loop
+   vertex -0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex -0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex -0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.67713977536749692 -0.45245043594349216 -0.58031916014362273
+  outer loop
+   vertex -0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex -0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex -0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.56230271938745569 -0.37571857098187661 -0.7366486321095076
+  outer loop
+   vertex -0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex -0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex -0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.56230273840009004 -0.37571869089438792 -0.73664855643676341
+  outer loop
+   vertex -0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex -0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex -0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.42179871051676798 -0.28183691468019506 -0.86177363694298537
+  outer loop
+   vertex -0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex -0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex -0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.42179870086462851 -0.28183681079029427 -0.86177367564370844
+  outer loop
+   vertex -0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex -0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex -0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.26147839157789088 -0.17471425703507376 -0.94926496781800662
+  outer loop
+   vertex -0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex -0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+   vertex -0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.26147838880858149 -0.17471429029992128 -0.94926496245835557
+  outer loop
+   vertex -0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex -0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+   vertex -0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.17471429029992128 -0.26147838880858149 0.94926496245835557
+  outer loop
+   vertex -0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex -0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex -0.015565137378871441 -0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.17471425703507376 -0.26147839157789088 0.94926496781800662
+  outer loop
+   vertex -0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex -0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex -0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.28183681079029427 -0.42179870086462851 0.86177367564370844
+  outer loop
+   vertex -0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex -0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex -0.022493567317724228 -0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.28183691468019506 -0.42179871051676798 0.86177363694298537
+  outer loop
+   vertex -0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex -0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex -0.015565137378871441 -0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.37571869089438792 -0.56230273840009004 0.73664855643676341
+  outer loop
+   vertex -0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex -0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex -0.028438922017812729 -0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.37571857098187661 -0.56230271938745569 0.7366486321095076
+  outer loop
+   vertex -0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex -0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex -0.022493567317724228 -0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.45245043594349216 -0.67713977536749692 0.58031916014362273
+  outer loop
+   vertex -0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex -0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex -0.033141355961561203 -0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.45245034005942358 -0.67713976273003673 0.58031924964628023
+  outer loop
+   vertex -0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex -0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex -0.028438922017812729 -0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.509144138294924 -0.76198797950532793 0.40018316497487411
+  outer loop
+   vertex -0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex -0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex -0.036395356059074402 -0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.50914420673480953 -0.76198798009585644 0.40018307677589038
+  outer loop
+   vertex -0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex -0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex -0.033141355961561203 -0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.54387723262956311 -0.81396986593198373 0.20408481859726049
+  outer loop
+   vertex -0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex -0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex -0.038058705627918243 -0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.54387731459104727 -0.81396984640124925 0.20408467806956454
+  outer loop
+   vertex -0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex -0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex -0.036395356059074402 -0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.55557020216110709 -0.83146963292153175 0
+  outer loop
+   vertex -0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex -0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex -0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.55557020216110709 -0.83146963292153175 0
+  outer loop
+   vertex -0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex -0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex -0.038058705627918243 -0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.54387729795136042 -0.81396982149820041 -0.20408482173673517
+  outer loop
+   vertex -0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex -0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex -0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.54387724854201425 -0.81396988974665174 -0.20408468120903095
+  outer loop
+   vertex -0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex -0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex -0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.50914418433618069 -0.76198794657394719 -0.40018316910218049
+  outer loop
+   vertex -0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex -0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex -0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.50914415869095786 -0.76198801003014671 -0.40018308090319588
+  outer loop
+   vertex -0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex -0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex -0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.4524503781983546 -0.67713981980897864 -0.58031915330896144
+  outer loop
+   vertex -0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex -0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex -0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.45245040321610314 -0.67713972638750908 -0.5803192428116053
+  outer loop
+   vertex -0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex -0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex -0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.37571862212216495 -0.56230279592432497 -0.73664854760347465
+  outer loop
+   vertex -0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex -0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex -0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.37571865044532143 -0.56230267786378618 -0.73664862327622749
+  outer loop
+   vertex -0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex -0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex -0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.28183687150574754 -0.42179864590164712 -0.86177368268901633
+  outer loop
+   vertex -0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex -0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex -0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.28183684066621417 -0.42179874557711361 -0.86177364398829248
+  outer loop
+   vertex -0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex -0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex -0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.17471426893077599 -0.26147840938106925 -0.9492649607246284
+  outer loop
+   vertex -0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex -0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+   vertex -0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.17471428421919066 -0.26147837970812587 -0.9492649660842799
+  outer loop
+   vertex -0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex -0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+   vertex -0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.061351523138116815 -0.3084347739583525 0.94926496871099864
+  outer loop
+   vertex -0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex -0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex -7.4716313056158803e-18 -0.040673665702342987 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.061351497270056773 -0.308434765682361 0.94926497307189694
+  outer loop
+   vertex -0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex -7.4716313056158803e-18 -0.040673665702342987 0.091354548931121826
+   vertex -3.819275695072703e-18 -0.020791169255971909 0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.098967956160755974 -0.49754551322598678 0.86177363960732289
+  outer loop
+   vertex -0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex -0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex -1.0797439998560886e-17 -0.058778524398803711 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.098968013678745109 -0.49754554356199887 0.86177361548731501
+  outer loop
+   vertex -0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex -1.0797439998560886e-17 -0.058778524398803711 0.080901697278022766
+   vertex -7.4716313056158803e-18 -0.040673665702342987 0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.1319348434673831 -0.6632812473181785 0.73664861639405688
+  outer loop
+   vertex -0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex -0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex -1.3651348769489291e-17 -0.074314482510089874 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.13193484347074261 -0.66328124732023797 0.73664861639160084
+  outer loop
+   vertex -0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex -1.3651348769489291e-17 -0.074314482510089874 0.06691306084394455
+   vertex -1.0797439998560886e-17 -0.058778524398803711 0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.15887932976663666 -0.79874081541833841 0.58031928139408939
+  outer loop
+   vertex -0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex -0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex -1.5908628708195447e-17 -0.086602538824081421 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.15887943951689926 -0.79874087880382028 0.58031916410411333
+  outer loop
+   vertex -0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex -1.5908628708195447e-17 -0.086602538824081421 0.05000000074505806
+   vertex -1.3651348769489291e-17 -0.074314482510089874 0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.17878756859551073 -0.89882619396083951 0.40018305607006494
+  outer loop
+   vertex -0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex -0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex -1.7470625291742606e-17 -0.095105648040771484 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.1787875343376209 -0.89882617942320453 0.40018310402734331
+  outer loop
+   vertex -0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex -1.7470625291742606e-17 -0.095105648040771484 0.030901700258255005
+   vertex -1.5908628708195447e-17 -0.086602538824081421 0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.19098433878695761 -0.96014292559861558 0.20408465096875852
+  outer loop
+   vertex -0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex -0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex -1.8269071304176767e-17 -0.099452190101146698 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.19098421563577436 -0.96014290587992068 0.20408485898382989
+  outer loop
+   vertex -0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex -1.8269071304176767e-17 -0.099452190101146698 0.010452846065163612
+   vertex -1.7470625291742606e-17 -0.095105648040771484 0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.19509035781625056 -0.98078527328214271 0
+  outer loop
+   vertex -0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex -0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex -1.8269071304176767e-17 -0.099452190101146698 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.19509035781625056 -0.98078527328214271 0
+  outer loop
+   vertex -0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex -1.8269071304176767e-17 -0.099452190101146698 -0.010452846065163612
+   vertex -1.8269071304176767e-17 -0.099452190101146698 0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.19098422428494752 -0.9601429493622694 -0.20408464632156814
+  outer loop
+   vertex -0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex -0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex -1.7470625291742606e-17 -0.095105648040771484 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.19098433051579039 -0.96014288401665793 -0.20408485433664575
+  outer loop
+   vertex -0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex -1.7470625291742606e-17 -0.095105648040771484 -0.030901700258255005
+   vertex -1.8269071304176767e-17 -0.099452190101146698 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal -0.17878753861432084 -0.89882620092364052 -0.40018305382588126
+  outer loop
+   vertex -0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex -0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex -1.5908628708195447e-17 -0.086602538824081421 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.17878756470117704 -0.89882617438269374 -0.4001831017831638
+  outer loop
+   vertex -0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex -1.5908628708195447e-17 -0.086602538824081421 -0.05000000074505806
+   vertex -1.7470625291742606e-17 -0.095105648040771484 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal -0.15887942196636901 -0.79874079057134661 -0.58031929035065921
+  outer loop
+   vertex -0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex -0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex -1.3651348769489291e-17 -0.074314482510089874 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.15887934482690999 -0.79874089113149138 -0.58031917306068981
+  outer loop
+   vertex -0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex -1.3651348769489291e-17 -0.074314482510089874 -0.06691306084394455
+   vertex -1.5908628708195447e-17 -0.086602538824081421 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal -0.13193484347015974 -0.66328124731730775 -0.73664861639434354
+  outer loop
+   vertex -0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex -0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex -1.0797439998560886e-17 -0.058778524398803711 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.13193484346784412 -0.66328124732049609 -0.73664861639188761
+  outer loop
+   vertex -0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex -1.0797439998560886e-17 -0.058778524398803711 -0.080901697278022766
+   vertex -1.3651348769489291e-17 -0.074314482510089874 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal -0.098968004229828904 -0.49754549605911413 -0.86177364399826872
+  outer loop
+   vertex -0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex -0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex -7.4716313056158803e-18 -0.040673665702342987 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal -0.098967962699230125 -0.49754554609711599 -0.86177361987826384
+  outer loop
+   vertex -0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex -7.4716313056158803e-18 -0.040673665702342987 -0.091354548931121826
+   vertex -1.0797439998560886e-17 -0.058778524398803711 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal -0.061351500668862566 -0.30843478276930947 -0.94926496730034626
+  outer loop
+   vertex -0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex -0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+   vertex -3.819275695072703e-18 -0.020791169255971909 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal -0.061351521400747615 -0.3084347652240122 -0.94926497166124379
+  outer loop
+   vertex -0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex -3.819275695072703e-18 -0.020791169255971909 -0.097814761102199554
+   vertex -7.4716313056158803e-18 -0.040673665702342987 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.061351521400747566 -0.30843476522401225 0.94926497166124391
+  outer loop
+   vertex -3.819275695072703e-18 -0.020791169255971909 0.097814761102199554
+   vertex -7.4716313056158803e-18 -0.040673665702342987 0.091354548931121826
+   vertex 0.015565137378871441 -0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.06135150066886251 -0.30843478276930952 0.94926496730034615
+  outer loop
+   vertex -3.819275695072703e-18 -0.020791169255971909 0.097814761102199554
+   vertex 0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex 0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.098967962699230042 -0.49754554609711604 0.86177361987826384
+  outer loop
+   vertex -7.4716313056158803e-18 -0.040673665702342987 0.091354548931121826
+   vertex -1.0797439998560886e-17 -0.058778524398803711 0.080901697278022766
+   vertex 0.022493567317724228 -0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.098968004229828821 -0.49754549605911419 0.86177364399826872
+  outer loop
+   vertex -7.4716313056158803e-18 -0.040673665702342987 0.091354548931121826
+   vertex 0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex 0.015565137378871441 -0.037577565759420395 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.13193484346784395 -0.6632812473204962 0.7366486163918875
+  outer loop
+   vertex -1.0797439998560886e-17 -0.058778524398803711 0.080901697278022766
+   vertex -1.3651348769489291e-17 -0.074314482510089874 0.06691306084394455
+   vertex 0.028438922017812729 -0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.13193484347015963 -0.66328124731730786 0.73664861639434354
+  outer loop
+   vertex -1.0797439998560886e-17 -0.058778524398803711 0.080901697278022766
+   vertex 0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex 0.022493567317724228 -0.054304275661706924 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.15887934482690988 -0.79874089113149138 0.58031917306068992
+  outer loop
+   vertex -1.3651348769489291e-17 -0.074314482510089874 0.06691306084394455
+   vertex -1.5908628708195447e-17 -0.086602538824081421 0.05000000074505806
+   vertex 0.033141355961561203 -0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.15887942196636887 -0.79874079057134661 0.58031929035065932
+  outer loop
+   vertex -1.3651348769489291e-17 -0.074314482510089874 0.06691306084394455
+   vertex 0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex 0.028438922017812729 -0.068657629191875458 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.17878756470117688 -0.89882617438269374 0.40018310178316374
+  outer loop
+   vertex -1.5908628708195447e-17 -0.086602538824081421 0.05000000074505806
+   vertex -1.7470625291742606e-17 -0.095105648040771484 0.030901700258255005
+   vertex 0.036395356059074402 -0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.17878753861432073 -0.89882620092364052 0.40018305382588132
+  outer loop
+   vertex -1.5908628708195447e-17 -0.086602538824081421 0.05000000074505806
+   vertex 0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex 0.033141355961561203 -0.080010317265987396 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.1909843305157902 -0.96014288401665793 0.20408485433664572
+  outer loop
+   vertex -1.7470625291742606e-17 -0.095105648040771484 0.030901700258255005
+   vertex -1.8269071304176767e-17 -0.099452190101146698 0.010452846065163612
+   vertex 0.038058705627918243 -0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.19098422428494732 -0.9601429493622694 0.20408464632156811
+  outer loop
+   vertex -1.7470625291742606e-17 -0.095105648040771484 0.030901700258255005
+   vertex 0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex 0.036395356059074402 -0.087866164743900299 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.19509035781625034 -0.98078527328214271 0
+  outer loop
+   vertex -1.8269071304176767e-17 -0.099452190101146698 0.010452846065163612
+   vertex -1.8269071304176767e-17 -0.099452190101146698 -0.010452846065163612
+   vertex 0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.19509035781625034 -0.98078527328214271 0
+  outer loop
+   vertex -1.8269071304176767e-17 -0.099452190101146698 0.010452846065163612
+   vertex 0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex 0.038058705627918243 -0.091881841421127319 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.19098421563577417 -0.96014290587992079 -0.20408485898382989
+  outer loop
+   vertex -1.8269071304176767e-17 -0.099452190101146698 -0.010452846065163612
+   vertex -1.7470625291742606e-17 -0.095105648040771484 -0.030901700258255005
+   vertex 0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.19098433878695739 -0.96014292559861558 -0.2040846509687585
+  outer loop
+   vertex -1.8269071304176767e-17 -0.099452190101146698 -0.010452846065163612
+   vertex 0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex 0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.17878753433762073 -0.89882617942320464 -0.40018310402734331
+  outer loop
+   vertex -1.7470625291742606e-17 -0.095105648040771484 -0.030901700258255005
+   vertex -1.5908628708195447e-17 -0.086602538824081421 -0.05000000074505806
+   vertex 0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.17878756859551054 -0.89882619396083963 -0.40018305607006488
+  outer loop
+   vertex -1.7470625291742606e-17 -0.095105648040771484 -0.030901700258255005
+   vertex 0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex 0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.15887943951689912 -0.79874087880382028 -0.58031916410411344
+  outer loop
+   vertex -1.5908628708195447e-17 -0.086602538824081421 -0.05000000074505806
+   vertex -1.3651348769489291e-17 -0.074314482510089874 -0.06691306084394455
+   vertex 0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.15887932976663652 -0.7987408154183383 -0.58031928139408939
+  outer loop
+   vertex -1.5908628708195447e-17 -0.086602538824081421 -0.05000000074505806
+   vertex 0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex 0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.13193484347074247 -0.66328124732023797 -0.73664861639160084
+  outer loop
+   vertex -1.3651348769489291e-17 -0.074314482510089874 -0.06691306084394455
+   vertex -1.0797439998560886e-17 -0.058778524398803711 -0.080901697278022766
+   vertex 0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.13193484346738296 -0.6632812473181785 -0.73664861639405688
+  outer loop
+   vertex -1.3651348769489291e-17 -0.074314482510089874 -0.06691306084394455
+   vertex 0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex 0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.098968013678745026 -0.49754554356199898 -0.86177361548731501
+  outer loop
+   vertex -1.0797439998560886e-17 -0.058778524398803711 -0.080901697278022766
+   vertex -7.4716313056158803e-18 -0.040673665702342987 -0.091354548931121826
+   vertex 0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.098967956160755904 -0.49754551322598684 -0.86177363960732289
+  outer loop
+   vertex -1.0797439998560886e-17 -0.058778524398803711 -0.080901697278022766
+   vertex 0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex 0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.061351497270056718 -0.30843476568236106 -0.94926497307189694
+  outer loop
+   vertex -7.4716313056158803e-18 -0.040673665702342987 -0.091354548931121826
+   vertex -3.819275695072703e-18 -0.020791169255971909 -0.097814761102199554
+   vertex 0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.06135152313811678 -0.30843477395835256 -0.94926496871099864
+  outer loop
+   vertex -7.4716313056158803e-18 -0.040673665702342987 -0.091354548931121826
+   vertex 0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+   vertex 0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.17471428421919066 -0.26147837970812587 0.9492649660842799
+  outer loop
+   vertex 0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex 0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex 0.028760623186826706 -0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.17471426893077599 -0.26147840938106925 0.9492649607246284
+  outer loop
+   vertex 0.0079564359039068222 -0.019208535552024841 0.097814761102199554
+   vertex 0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex 0.01470157690346241 -0.01470157690346241 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.28183684066621417 -0.42179874557711361 0.86177364398829248
+  outer loop
+   vertex 0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex 0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex 0.041562695056200027 -0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.28183687150574754 -0.42179864590164712 0.86177368268901633
+  outer loop
+   vertex 0.015565137378871441 -0.037577565759420395 0.091354548931121826
+   vertex 0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex 0.028760623186826706 -0.028760623186826706 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.37571865044532143 -0.56230267786378618 0.73664862327622749
+  outer loop
+   vertex 0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex 0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex 0.052548274397850037 -0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.37571862212216495 -0.56230279592432497 0.73664854760347465
+  outer loop
+   vertex 0.022493567317724228 -0.054304275661706924 0.080901697278022766
+   vertex 0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex 0.041562695056200027 -0.041562695056200027 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.45245040321610314 -0.67713972638750908 0.5803192428116053
+  outer loop
+   vertex 0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex 0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex 0.061237242072820663 -0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.4524503781983546 -0.67713981980897864 0.58031915330896144
+  outer loop
+   vertex 0.028438922017812729 -0.068657629191875458 0.06691306084394455
+   vertex 0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex 0.052548274397850037 -0.052548274397850037 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.50914415869095786 -0.76198801003014671 0.40018308090319588
+  outer loop
+   vertex 0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex 0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex 0.067249849438667297 -0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.50914418433618069 -0.76198794657394719 0.40018316910218049
+  outer loop
+   vertex 0.033141355961561203 -0.080010317265987396 0.05000000074505806
+   vertex 0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex 0.061237242072820663 -0.061237242072820663 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.54387724854201425 -0.81396988974665174 0.20408468120903095
+  outer loop
+   vertex 0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex 0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex 0.070323318243026733 -0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.54387729795136042 -0.81396982149820041 0.20408482173673517
+  outer loop
+   vertex 0.036395356059074402 -0.087866164743900299 0.030901700258255005
+   vertex 0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex 0.067249849438667297 -0.067249849438667297 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.55557020216110709 -0.83146963292153175 0
+  outer loop
+   vertex 0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex 0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex 0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.55557020216110709 -0.83146963292153175 0
+  outer loop
+   vertex 0.038058705627918243 -0.091881841421127319 0.010452846065163612
+   vertex 0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex 0.070323318243026733 -0.070323318243026733 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.54387731459104727 -0.81396984640124925 -0.20408467806956454
+  outer loop
+   vertex 0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex 0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex 0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.54387723262956311 -0.81396986593198373 -0.20408481859726049
+  outer loop
+   vertex 0.038058705627918243 -0.091881841421127319 -0.010452846065163612
+   vertex 0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex 0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.50914420673480953 -0.76198798009585644 -0.40018307677589038
+  outer loop
+   vertex 0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex 0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex 0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.509144138294924 -0.76198797950532793 -0.40018316497487411
+  outer loop
+   vertex 0.036395356059074402 -0.087866164743900299 -0.030901700258255005
+   vertex 0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex 0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.45245034005942358 -0.67713976273003673 -0.58031924964628023
+  outer loop
+   vertex 0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex 0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex 0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.45245043594349216 -0.67713977536749692 -0.58031916014362273
+  outer loop
+   vertex 0.033141355961561203 -0.080010317265987396 -0.05000000074505806
+   vertex 0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex 0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.37571857098187661 -0.56230271938745569 -0.7366486321095076
+  outer loop
+   vertex 0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex 0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex 0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.37571869089438792 -0.56230273840009004 -0.73664855643676341
+  outer loop
+   vertex 0.028438922017812729 -0.068657629191875458 -0.06691306084394455
+   vertex 0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex 0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.28183691468019506 -0.42179871051676798 -0.86177363694298537
+  outer loop
+   vertex 0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex 0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex 0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.28183681079029427 -0.42179870086462851 -0.86177367564370844
+  outer loop
+   vertex 0.022493567317724228 -0.054304275661706924 -0.080901697278022766
+   vertex 0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex 0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.17471425703507376 -0.26147839157789088 -0.94926496781800662
+  outer loop
+   vertex 0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex 0.0079564359039068222 -0.019208535552024841 -0.097814761102199554
+   vertex 0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.17471429029992128 -0.26147838880858149 -0.94926496245835557
+  outer loop
+   vertex 0.015565137378871441 -0.037577565759420395 -0.091354548931121826
+   vertex 0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+   vertex 0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.26147838880858149 -0.17471429029992128 0.94926496245835557
+  outer loop
+   vertex 0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex 0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex 0.037577565759420395 -0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.26147839157789088 -0.17471425703507376 0.94926496781800662
+  outer loop
+   vertex 0.01470157690346241 -0.01470157690346241 0.097814761102199554
+   vertex 0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex 0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.42179870086462851 -0.28183681079029427 0.86177367564370844
+  outer loop
+   vertex 0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex 0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex 0.054304275661706924 -0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.42179871051676798 -0.28183691468019506 0.86177363694298537
+  outer loop
+   vertex 0.028760623186826706 -0.028760623186826706 0.091354548931121826
+   vertex 0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex 0.037577565759420395 -0.015565137378871441 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.56230273840009004 -0.37571869089438792 0.73664855643676341
+  outer loop
+   vertex 0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex 0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex 0.068657629191875458 -0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.56230271938745569 -0.37571857098187661 0.7366486321095076
+  outer loop
+   vertex 0.041562695056200027 -0.041562695056200027 0.080901697278022766
+   vertex 0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex 0.054304275661706924 -0.022493567317724228 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.67713977536749692 -0.45245043594349216 0.58031916014362273
+  outer loop
+   vertex 0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex 0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex 0.080010317265987396 -0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.67713976273003673 -0.45245034005942358 0.58031924964628023
+  outer loop
+   vertex 0.052548274397850037 -0.052548274397850037 0.06691306084394455
+   vertex 0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex 0.068657629191875458 -0.028438922017812729 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.76198797950532793 -0.509144138294924 0.40018316497487411
+  outer loop
+   vertex 0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex 0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex 0.087866164743900299 -0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.76198798009585644 -0.50914420673480953 0.40018307677589038
+  outer loop
+   vertex 0.061237242072820663 -0.061237242072820663 0.05000000074505806
+   vertex 0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex 0.080010317265987396 -0.033141355961561203 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.81396986593198373 -0.54387723262956311 0.20408481859726049
+  outer loop
+   vertex 0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex 0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex 0.091881841421127319 -0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.81396984640124925 -0.54387731459104727 0.20408467806956454
+  outer loop
+   vertex 0.067249849438667297 -0.067249849438667297 0.030901700258255005
+   vertex 0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex 0.087866164743900299 -0.036395356059074402 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.83146963292153175 -0.55557020216110709 0
+  outer loop
+   vertex 0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex 0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex 0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.83146963292153175 -0.55557020216110709 0
+  outer loop
+   vertex 0.070323318243026733 -0.070323318243026733 0.010452846065163612
+   vertex 0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex 0.091881841421127319 -0.038058705627918243 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.81396982149820041 -0.54387729795136042 -0.20408482173673517
+  outer loop
+   vertex 0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex 0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex 0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.81396988974665174 -0.54387724854201425 -0.20408468120903095
+  outer loop
+   vertex 0.070323318243026733 -0.070323318243026733 -0.010452846065163612
+   vertex 0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex 0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.76198794657394719 -0.50914418433618069 -0.40018316910218049
+  outer loop
+   vertex 0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex 0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex 0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.76198801003014671 -0.50914415869095786 -0.40018308090319588
+  outer loop
+   vertex 0.067249849438667297 -0.067249849438667297 -0.030901700258255005
+   vertex 0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex 0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.67713981980897864 -0.4524503781983546 -0.58031915330896144
+  outer loop
+   vertex 0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex 0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex 0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.67713972638750908 -0.45245040321610314 -0.5803192428116053
+  outer loop
+   vertex 0.061237242072820663 -0.061237242072820663 -0.05000000074505806
+   vertex 0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex 0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.56230279592432497 -0.37571862212216495 -0.73664854760347465
+  outer loop
+   vertex 0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex 0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex 0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.56230267786378618 -0.37571865044532143 -0.73664862327622749
+  outer loop
+   vertex 0.052548274397850037 -0.052548274397850037 -0.06691306084394455
+   vertex 0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex 0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.42179864590164712 -0.28183687150574754 -0.86177368268901633
+  outer loop
+   vertex 0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex 0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex 0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.42179874557711361 -0.28183684066621417 -0.86177364398829248
+  outer loop
+   vertex 0.041562695056200027 -0.041562695056200027 -0.080901697278022766
+   vertex 0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex 0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.26147840938106925 -0.17471426893077599 -0.9492649607246284
+  outer loop
+   vertex 0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex 0.01470157690346241 -0.01470157690346241 -0.097814761102199554
+   vertex 0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.26147837970812587 -0.17471428421919066 -0.9492649660842799
+  outer loop
+   vertex 0.028760623186826706 -0.028760623186826706 -0.091354548931121826
+   vertex 0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+   vertex 0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.3084347739583525 -0.061351523138116801 0.94926496871099864
+  outer loop
+   vertex 0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex 0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex 0.040673665702342987 0 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.30843476568236111 -0.061351497270056753 0.94926497307189694
+  outer loop
+   vertex 0.019208535552024841 -0.0079564359039068222 0.097814761102199554
+   vertex 0.040673665702342987 0 0.091354548931121826
+   vertex 0.020791169255971909 0 0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.49754551322598684 -0.098967956160755946 0.86177363960732289
+  outer loop
+   vertex 0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex 0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex 0.058778524398803711 0 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.49754554356199898 -0.098968013678745081 0.86177361548731513
+  outer loop
+   vertex 0.037577565759420395 -0.015565137378871441 0.091354548931121826
+   vertex 0.058778524398803711 0 0.080901697278022766
+   vertex 0.040673665702342987 0 0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.66328124731817861 -0.13193484346738305 0.73664861639405699
+  outer loop
+   vertex 0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex 0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex 0.074314482510089874 0 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.66328124732023808 -0.13193484347074255 0.73664861639160084
+  outer loop
+   vertex 0.054304275661706924 -0.022493567317724228 0.080901697278022766
+   vertex 0.074314482510089874 0 0.06691306084394455
+   vertex 0.058778524398803711 0 0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.7987408154183383 -0.1588793297666366 0.58031928139408939
+  outer loop
+   vertex 0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex 0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex 0.086602538824081421 0 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.79874087880382028 -0.15887943951689917 0.58031916410411333
+  outer loop
+   vertex 0.068657629191875458 -0.028438922017812729 0.06691306084394455
+   vertex 0.086602538824081421 0 0.05000000074505806
+   vertex 0.074314482510089874 0 0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.89882619396083974 -0.17878756859551068 0.40018305607006494
+  outer loop
+   vertex 0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex 0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex 0.095105648040771484 0 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.89882617942320453 -0.17878753433762079 0.40018310402734325
+  outer loop
+   vertex 0.080010317265987396 -0.033141355961561203 0.05000000074505806
+   vertex 0.095105648040771484 0 0.030901700258255005
+   vertex 0.086602538824081421 0 0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.96014292559861558 -0.1909843387869575 0.2040846509687585
+  outer loop
+   vertex 0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex 0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex 0.099452190101146698 0 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.96014290587992079 -0.19098421563577428 0.20408485898382991
+  outer loop
+   vertex 0.087866164743900299 -0.036395356059074402 0.030901700258255005
+   vertex 0.099452190101146698 0 0.010452846065163612
+   vertex 0.095105648040771484 0 0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.98078527328214282 -0.19509035781625048 0
+  outer loop
+   vertex 0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex 0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex 0.099452190101146698 0 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.98078527328214282 -0.19509035781625048 0
+  outer loop
+   vertex 0.091881841421127319 -0.038058705627918243 0.010452846065163612
+   vertex 0.099452190101146698 0 -0.010452846065163612
+   vertex 0.099452190101146698 0 0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.96014294936226929 -0.19098422428494741 -0.20408464632156809
+  outer loop
+   vertex 0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex 0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex 0.095105648040771484 0 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.96014288401665793 -0.19098433051579031 -0.20408485433664575
+  outer loop
+   vertex 0.091881841421127319 -0.038058705627918243 -0.010452846065163612
+   vertex 0.095105648040771484 0 -0.030901700258255005
+   vertex 0.099452190101146698 0 -0.010452846065163612
+  endloop
+ endfacet
+ facet normal 0.89882620092364052 -0.17878753861432078 -0.40018305382588132
+  outer loop
+   vertex 0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex 0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex 0.086602538824081421 0 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.89882617438269374 -0.17878756470117699 -0.40018310178316374
+  outer loop
+   vertex 0.087866164743900299 -0.036395356059074402 -0.030901700258255005
+   vertex 0.086602538824081421 0 -0.05000000074505806
+   vertex 0.095105648040771484 0 -0.030901700258255005
+  endloop
+ endfacet
+ facet normal 0.79874079057134661 -0.15887942196636892 -0.58031929035065921
+  outer loop
+   vertex 0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex 0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex 0.074314482510089874 0 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.79874089113149127 -0.15887934482690994 -0.58031917306068981
+  outer loop
+   vertex 0.080010317265987396 -0.033141355961561203 -0.05000000074505806
+   vertex 0.074314482510089874 0 -0.06691306084394455
+   vertex 0.086602538824081421 0 -0.05000000074505806
+  endloop
+ endfacet
+ facet normal 0.66328124731730775 -0.13193484347015969 -0.73664861639434354
+  outer loop
+   vertex 0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex 0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex 0.058778524398803711 0 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.6632812473204962 -0.13193484346784404 -0.7366486163918875
+  outer loop
+   vertex 0.068657629191875458 -0.028438922017812729 -0.06691306084394455
+   vertex 0.058778524398803711 0 -0.080901697278022766
+   vertex 0.074314482510089874 0 -0.06691306084394455
+  endloop
+ endfacet
+ facet normal 0.49754549605911413 -0.098968004229828863 -0.86177364399826861
+  outer loop
+   vertex 0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex 0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex 0.040673665702342987 0 -0.091354548931121826
+  endloop
+ endfacet
+ facet normal 0.49754554609711599 -0.098967962699230083 -0.86177361987826373
+  outer loop
+   vertex 0.054304275661706924 -0.022493567317724228 -0.080901697278022766
+   vertex 0.040673665702342987 0 -0.091354548931121826
+   vertex 0.058778524398803711 0 -0.080901697278022766
+  endloop
+ endfacet
+ facet normal 0.30843478276930947 -0.061351500668862545 -0.94926496730034626
+  outer loop
+   vertex 0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex 0.019208535552024841 -0.0079564359039068222 -0.097814761102199554
+   vertex 0.020791169255971909 0 -0.097814761102199554
+  endloop
+ endfacet
+ facet normal 0.30843476522401231 -0.061351521400747594 -0.94926497166124379
+  outer loop
+   vertex 0.037577565759420395 -0.015565137378871441 -0.091354548931121826
+   vertex 0.020791169255971909 0 -0.097814761102199554
+   vertex 0.040673665702342987 0 -0.091354548931121826
+  endloop
+ endfacet
+endsolid
diff --git a/apps/gpu/LBM/SphereScaling/CMakeLists.txt b/apps/gpu/SphereScaling/CMakeLists.txt
similarity index 81%
rename from apps/gpu/LBM/SphereScaling/CMakeLists.txt
rename to apps/gpu/SphereScaling/CMakeLists.txt
index db3747f2b620cab1efc5cf50f02aee1a8fee4a54..7d2d7722190e02876dc05e581cd9ce67a3362ebd 100644
--- a/apps/gpu/LBM/SphereScaling/CMakeLists.txt
+++ b/apps/gpu/SphereScaling/CMakeLists.txt
@@ -1,6 +1,6 @@
 PROJECT(SphereScaling LANGUAGES CUDA CXX)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES SphereScaling.cpp)
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES SphereScaling.cpp)
 
 set_source_files_properties(SphereScaling.cpp PROPERTIES LANGUAGE CUDA)
 
diff --git a/apps/gpu/LBM/SphereScaling/SphereScaling.cpp b/apps/gpu/SphereScaling/SphereScaling.cpp
similarity index 97%
rename from apps/gpu/LBM/SphereScaling/SphereScaling.cpp
rename to apps/gpu/SphereScaling/SphereScaling.cpp
index a5ed466c94cb8a3c40e8dcb87cc6a15b843a3d2c..9873522362c06a9c427be296e813602839b04642 100755
--- a/apps/gpu/LBM/SphereScaling/SphereScaling.cpp
+++ b/apps/gpu/SphereScaling/SphereScaling.cpp
@@ -1,15 +1,13 @@
 #define _USE_MATH_DEFINES
+#include <cmath>
 #include <exception>
+#include <filesystem>
 #include <fstream>
 #include <iostream>
-#include <math.h>
 #include <memory>
 #include <sstream>
 #include <stdexcept>
 #include <string>
-#include <filesystem>
-
-#include "mpi.h"
 
 //////////////////////////////////////////////////////////////////////////
 
@@ -25,7 +23,6 @@
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 
 #include "geometries/Conglomerate/Conglomerate.h"
 #include "geometries/Cuboid/Cuboid.h"
@@ -39,7 +36,6 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
@@ -58,6 +54,7 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "utilities/communication.h"
+#include <parallel/MPICommunicator.h>
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -65,13 +62,9 @@
 
 void runVirtualFluids(const vf::basics::ConfigurationFile& config)
 {
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
-
-    auto gridFactory = GridFactory::make();
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
     GridScalingFactory scalingFactory = GridScalingFactory();
 
@@ -124,7 +117,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
     else
         para->setMaxLevel(1);
 
-    para->setMainKernel(vf::CollisionKernel::Compressible::CumulantK17);
+    para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
     scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -149,6 +142,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
     VF_LOG_INFO("mainKernel                       = {}\n", para->getMainKernel());
 
     //////////////////////////////////////////////////////////////////////////
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
     if (useGridGenerator) {
         real sideLengthCube;
@@ -170,12 +164,12 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
         const real dCubeLev1   = 72.0; // Phoenix: 72.0
 
         if (para->getNumprocs() > 1) {
-            const uint generatePart = vf::gpu::MpiCommunicator::getInstance().getPID();
+            const uint generatePart = communicator.getProcessID();
 
             real overlap = (real)8.0 * dxGrid;
             gridBuilder->setNumberOfLayers(10, 8);
 
-            if (communicator.getNumberOfProcess() == 2) {
+            if (communicator.getNumberOfProcesses() == 2) {
                 real zSplit = 0.5 * sideLengthCube;
 
                 if (scalingType == "weak") {
@@ -249,7 +243,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
                 // gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
                 //////////////////////////////////////////////////////////////////////////
 
-            } else if (communicator.getNumberOfProcess() == 4) {
+            } else if (communicator.getNumberOfProcesses() == 4) {
                 real ySplit = 0.5 * sideLengthCube;
                 real zSplit = 0.5 * sideLengthCube;
 
@@ -365,7 +359,7 @@ void runVirtualFluids(const vf::basics::ConfigurationFile& config)
                 gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); // set pressure BC after velocity BCs
                 // gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
                 //////////////////////////////////////////////////////////////////////////
-            } else if (communicator.getNumberOfProcess() == 8) {
+            } else if (communicator.getNumberOfProcesses() == 8) {
                 real xSplit = 0.5 * sideLengthCube;
                 real ySplit = 0.5 * sideLengthCube;
                 real zSplit = 0.5 * sideLengthCube;
@@ -658,7 +652,7 @@ int main(int argc, char *argv[])
 
         try {
             VF_LOG_INFO("For the default config path to work, execute the app from the project root.");
-            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/LBM/SphereScaling/config.txt");
+            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv, "./apps/gpu/SphereScaling/config.txt");
             runVirtualFluids(config);
 
             //////////////////////////////////////////////////////////////////////////
diff --git a/apps/gpu/LBM/SphereScaling/config.txt b/apps/gpu/SphereScaling/config.txt
similarity index 85%
rename from apps/gpu/LBM/SphereScaling/config.txt
rename to apps/gpu/SphereScaling/config.txt
index 5cfaeb492f97d348140ca3161b0738b4dd3ceaa7..b835c0b4ce0931f7775184233c8e627d97e1844b 100644
--- a/apps/gpu/LBM/SphereScaling/config.txt
+++ b/apps/gpu/SphereScaling/config.txt
@@ -1,12 +1,12 @@
 # Tesla 03
-# mpiexec -n 2 "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/build/bin/Release/SphereScaling.exe" "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/apps/gpu/LBM/SphereScaling/config.txt"
+# mpiexec -n 2 "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/build/bin/Release/SphereScaling.exe" "C:/Users/Master/Documents/MasterAnna/VirtualFluids_dev/apps/gpu/SphereScaling/config.txt"
 # Phoenix
-# mpirun -np 2 "./VirtualFluids_dev/build/bin/SphereScaling" "./VirtualFluids_dev/apps/gpu/LBM/SphereScaling/config.txt"
+# mpirun -np 2 "./VirtualFluids_dev/build/bin/SphereScaling" "./VirtualFluids_dev/apps/gpu/SphereScaling/config.txt"
 
 # Phoenix mpich
-# mpirun -np 2 nvprof -f -o SphereScaling.%q{PMI_RANK}.nvprof "./VirtualFluids_dev/build/bin/SphereScaling" "./VirtualFluids_dev/apps/gpu/LBM/SphereScaling/configPhoenix4GPU.txt"
+# mpirun -np 2 nvprof -f -o SphereScaling.%q{PMI_RANK}.nvprof "./VirtualFluids_dev/build/bin/SphereScaling" "./VirtualFluids_dev/apps/gpu/SphereScaling/configPhoenix4GPU.txt"
 # Phoenix openmpi
-# mpirun -np 2 nvprof -f -o SphereScaling.%q{OMPI_COMM_WORLD_RANK}.nvprof "./VirtualFluids_dev/build/bin/SphereScaling" "./VirtualFluids_dev/apps/gpu/LBM/SphereScaling/configPhoenix4GPU.txt"
+# mpirun -np 2 nvprof -f -o SphereScaling.%q{OMPI_COMM_WORLD_RANK}.nvprof "./VirtualFluids_dev/build/bin/SphereScaling" "./VirtualFluids_dev/apps/gpu/SphereScaling/configPhoenix4GPU.txt"
 
 ##################################################
 #GPU Mapping
@@ -34,7 +34,7 @@ GridPath=/output/grids/SphereScalingResults/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix1GPU_1LevStrongOS.txt b/apps/gpu/SphereScaling/configPhoenix1GPU_1LevStrongOS.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix1GPU_1LevStrongOS.txt
rename to apps/gpu/SphereScaling/configPhoenix1GPU_1LevStrongOS.txt
index 5488797815bd797916434e8b6a0a82ce623a8db4..e61f25ccb640beb4375a12336c40e73528096e74 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix1GPU_1LevStrongOS.txt
+++ b/apps/gpu/SphereScaling/configPhoenix1GPU_1LevStrongOS.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling1GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix1GPU_1LevStrongStream.txt b/apps/gpu/SphereScaling/configPhoenix1GPU_1LevStrongStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix1GPU_1LevStrongStream.txt
rename to apps/gpu/SphereScaling/configPhoenix1GPU_1LevStrongStream.txt
index e93f161aa16977ecd65aab230f40db0bbef60130..a205af0cf09aeb51cbd481684ca653cde6492755 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix1GPU_1LevStrongStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix1GPU_1LevStrongStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling1GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix2GPU_1LevStrongOS.txt b/apps/gpu/SphereScaling/configPhoenix2GPU_1LevStrongOS.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix2GPU_1LevStrongOS.txt
rename to apps/gpu/SphereScaling/configPhoenix2GPU_1LevStrongOS.txt
index 795e6bcb7d0dc3314f26b171c2f61d88e005a797..20602597eae3571cb228f8d9bdd6984d30b22b24 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix2GPU_1LevStrongOS.txt
+++ b/apps/gpu/SphereScaling/configPhoenix2GPU_1LevStrongOS.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling4GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix2GPU_1LevStrongStream.txt b/apps/gpu/SphereScaling/configPhoenix2GPU_1LevStrongStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix2GPU_1LevStrongStream.txt
rename to apps/gpu/SphereScaling/configPhoenix2GPU_1LevStrongStream.txt
index ef75fb88e563869b67f8aa33d839ec85c1d749b6..a1bdbe2feb3dc93d0bf858b909af9d07d34a3006 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix2GPU_1LevStrongStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix2GPU_1LevStrongStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling4GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevStrongOS.txt b/apps/gpu/SphereScaling/configPhoenix4GPU_1LevStrongOS.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevStrongOS.txt
rename to apps/gpu/SphereScaling/configPhoenix4GPU_1LevStrongOS.txt
index 99a057d31c7f15659d32776967853e076b5939ee..783b68ccc3623a11d43da29e75d05d77ede15caa 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevStrongOS.txt
+++ b/apps/gpu/SphereScaling/configPhoenix4GPU_1LevStrongOS.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling4GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevStrongStream.txt b/apps/gpu/SphereScaling/configPhoenix4GPU_1LevStrongStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevStrongStream.txt
rename to apps/gpu/SphereScaling/configPhoenix4GPU_1LevStrongStream.txt
index ea6338672305177b5119a2f557675bc491fddadc..2f95e25e0ea343ac5eb8d31e61bedea52110235a 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevStrongStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix4GPU_1LevStrongStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling4GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevWeakStream.txt b/apps/gpu/SphereScaling/configPhoenix4GPU_1LevWeakStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevWeakStream.txt
rename to apps/gpu/SphereScaling/configPhoenix4GPU_1LevWeakStream.txt
index ad05efa37ec5fadc9bc5fe9711485ec6f03e1960..6ecc44955f34c4aacc998554c367ab632239ee75 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_1LevWeakStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix4GPU_1LevWeakStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling4GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_2LevStrongStream.txt b/apps/gpu/SphereScaling/configPhoenix4GPU_2LevStrongStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix4GPU_2LevStrongStream.txt
rename to apps/gpu/SphereScaling/configPhoenix4GPU_2LevStrongStream.txt
index 45dc8c8b632f184e493dfedcc5963d8f60057022..12372f1c52ecc13a5a8902727129a880df40fc8d 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_2LevStrongStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix4GPU_2LevStrongStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling4GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix4GPU_regressionTest.txt b/apps/gpu/SphereScaling/configPhoenix4GPU_regressionTest.txt
similarity index 100%
rename from apps/gpu/LBM/SphereScaling/configPhoenix4GPU_regressionTest.txt
rename to apps/gpu/SphereScaling/configPhoenix4GPU_regressionTest.txt
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevStrongOS.txt b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevStrongOS.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevStrongOS.txt
rename to apps/gpu/SphereScaling/configPhoenix8GPU_1LevStrongOS.txt
index 892f11013d6742af416ba3b93a993b059a6fa3a0..41ef2d6a246a7c72ff00f1eaf94391aafedcd1b3 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevStrongOS.txt
+++ b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevStrongOS.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling8GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevStrongStream.txt b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevStrongStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevStrongStream.txt
rename to apps/gpu/SphereScaling/configPhoenix8GPU_1LevStrongStream.txt
index b026d6b7304f9f13effec6c899512beb804787f5..994c713a2c2f5b35fdf7a31ddd7f3b4186d3d4e7 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevStrongStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevStrongStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling8GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevWeakOS.txt b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevWeakOS.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevWeakOS.txt
rename to apps/gpu/SphereScaling/configPhoenix8GPU_1LevWeakOS.txt
index ae848a2889d1301de78c6fff42e045965fa9baf7..da9adb7ed35032b42a9f415bf523e1e641aab1bd 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevWeakOS.txt
+++ b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevWeakOS.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling8GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevWeakStream.txt b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevWeakStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevWeakStream.txt
rename to apps/gpu/SphereScaling/configPhoenix8GPU_1LevWeakStream.txt
index fc8403eca0bcf96645c85b81c3109ec7619f34d2..2ef3c31b63bfbf7abe176cfd7b7536d0ac73eb73 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_1LevWeakStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix8GPU_1LevWeakStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling8GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_2LevStrongStream.txt b/apps/gpu/SphereScaling/configPhoenix8GPU_2LevStrongStream.txt
similarity index 96%
rename from apps/gpu/LBM/SphereScaling/configPhoenix8GPU_2LevStrongStream.txt
rename to apps/gpu/SphereScaling/configPhoenix8GPU_2LevStrongStream.txt
index a6d54810d8d4f0ded262a61c5535764c2f6f91b3..d37a513612fb8e88764b5ba0db859f296d88c7fc 100644
--- a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_2LevStrongStream.txt
+++ b/apps/gpu/SphereScaling/configPhoenix8GPU_2LevStrongStream.txt
@@ -26,7 +26,7 @@ GridPath=/work/y0078217/Grids/GridSphereScaling/SphereScaling8GPU/
 #LBM Version
 ##################################################
 #D3Qxx=27
-#MainKernelName=CumulantK17CompChim
+#MainKernelName=K17CompressibleNavierStokes
 
 ##################################################
 #simulation parameter
diff --git a/apps/gpu/LBM/SphereScaling/configPhoenix8GPU_regressionTest.txt b/apps/gpu/SphereScaling/configPhoenix8GPU_regressionTest.txt
similarity index 100%
rename from apps/gpu/LBM/SphereScaling/configPhoenix8GPU_regressionTest.txt
rename to apps/gpu/SphereScaling/configPhoenix8GPU_regressionTest.txt
diff --git a/apps/gpu/LBM/TGV_3D/CMakeLists.txt b/apps/gpu/TGV_3D/CMakeLists.txt
similarity index 100%
rename from apps/gpu/LBM/TGV_3D/CMakeLists.txt
rename to apps/gpu/TGV_3D/CMakeLists.txt
diff --git a/apps/gpu/LBM/TGV_3D/TGV_3D.cpp b/apps/gpu/TGV_3D/TGV_3D.cpp
similarity index 94%
rename from apps/gpu/LBM/TGV_3D/TGV_3D.cpp
rename to apps/gpu/TGV_3D/TGV_3D.cpp
index c813bc319c085506420638dac3ef623b110dc771..6bb6d2b9201a4f21e5b70d31b8e9c60ad5a8a34c 100644
--- a/apps/gpu/LBM/TGV_3D/TGV_3D.cpp
+++ b/apps/gpu/TGV_3D/TGV_3D.cpp
@@ -35,14 +35,12 @@
 #include <filesystem>
 #include <fstream>
 #include <iostream>
-#include <math.h>
+#include <cmath>
 #include <memory>
 #include <sstream>
 #include <stdexcept>
 #include <string>
 
-#include "mpi.h"
-
 //////////////////////////////////////////////////////////////////////////
 
 #include "DataTypes.h"
@@ -58,7 +56,6 @@
 #include "GridGenerator/grid/BoundaryConditions/Side.h"
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
-#include "GridGenerator/grid/GridFactory.h"
 
 #include "GridGenerator/io/GridVTKWriter/GridVTKWriter.h"
 #include "GridGenerator/io/STLReaderWriter/STLReader.h"
@@ -67,7 +64,6 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
@@ -77,7 +73,7 @@
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
 
-
+#include <parallel/MPICommunicator.h>
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -132,20 +128,11 @@ std::string simulationName("TGV_3D");
 
 void multipleLevel(const std::string& configPath)
 {
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
-
-    //UbLog::reportingLevel() = UbLog::logLevelFromString("DEBUG5");
-
-    auto gridFactory = GridFactory::make();
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
-
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
     vf::basics::ConfigurationFile config;
     config.load(configPath);
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -166,6 +153,7 @@ void multipleLevel(const std::string& configPath)
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 	real dx = 2.0 * PI / real(nx);
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
 	gridBuilder->addCoarseGrid(-PI, -PI, -PI,
 								PI,  PI,  PI, dx);
@@ -254,7 +242,7 @@ void multipleLevel(const std::string& configPath)
 
     } );
 
-    para->setMainKernel( kernel );
+    para->configureMainKernel( kernel );
 
     if( !useLimiter )
         para->setQuadricLimiters( 1000000.0, 1000000.0, 1000000.0 );
diff --git a/apps/gpu/LBM/TGV_3D/config.txt b/apps/gpu/TGV_3D/config.txt
similarity index 100%
rename from apps/gpu/LBM/TGV_3D/config.txt
rename to apps/gpu/TGV_3D/config.txt
diff --git a/apps/gpu/LBM/TGV_3D_GridRef/CMakeLists.txt b/apps/gpu/TGV_3D_GridRef/CMakeLists.txt
similarity index 100%
rename from apps/gpu/LBM/TGV_3D_GridRef/CMakeLists.txt
rename to apps/gpu/TGV_3D_GridRef/CMakeLists.txt
diff --git a/apps/gpu/LBM/TGV_3D_GridRef/TGV_3D_GridRef.cpp b/apps/gpu/TGV_3D_GridRef/TGV_3D_GridRef.cpp
similarity index 94%
rename from apps/gpu/LBM/TGV_3D_GridRef/TGV_3D_GridRef.cpp
rename to apps/gpu/TGV_3D_GridRef/TGV_3D_GridRef.cpp
index 876496783e61867a45843b0aa871bbc794eca73f..4dc29b9309643a82fb82572ec37fb69468cebb51 100644
--- a/apps/gpu/LBM/TGV_3D_GridRef/TGV_3D_GridRef.cpp
+++ b/apps/gpu/TGV_3D_GridRef/TGV_3D_GridRef.cpp
@@ -67,7 +67,7 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
+#include "parallel/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
@@ -77,6 +77,7 @@
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -122,7 +123,7 @@ uint gpuIndex = 0;
 bool useLimiter = false;
 bool useWale = false;
 
-std::string kernel( "CumulantK17CompChimRedesigned" );
+std::string kernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
 
 std::string path("D:/out/TGV_3D/"); //MOLLOK
 
@@ -131,18 +132,12 @@ std::string simulationName("TGV_3D_Gridref_noSqPress");
 
 void multipleLevel(const std::string& configPath)
 {
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
-
-    auto gridFactory = GridFactory::make();
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
-
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    //vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
 
     vf::basics::ConfigurationFile config;
     config.load(configPath);
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
     GridScalingFactory scalingFactory = GridScalingFactory();
 
@@ -158,11 +153,11 @@ void multipleLevel(const std::string& configPath)
 
     const real viscosity = nx / ( 2.0 * PI ) * velocity / Re;
 
-    *logging::out << logging::Logger::INFO_HIGH << "velocity = " << velocity << " s\n";
-
-    *logging::out << logging::Logger::INFO_HIGH << "viscosity = " << viscosity << "\n";
+    VF_LOG_INFO("velocity = {}", velocity);
+    VF_LOG_INFO("viscosity = {}", viscosity);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
 	real dx = 2.0 * PI / real(nx);
 
@@ -268,7 +263,7 @@ void multipleLevel(const std::string& configPath)
 
     } );
 
-    para->setMainKernel( kernel );
+    para->configureMainKernel( kernel );
 
     if( !useLimiter )
         para->setQuadricLimiters( 1000000.0, 1000000.0, 1000000.0 );
diff --git a/apps/gpu/LBM/TGV_3D_GridRef/config.txt b/apps/gpu/TGV_3D_GridRef/config.txt
similarity index 100%
rename from apps/gpu/LBM/TGV_3D_GridRef/config.txt
rename to apps/gpu/TGV_3D_GridRef/config.txt
diff --git a/apps/gpu/LBM/TGV_3D_MultiGPU/CMakeLists.txt b/apps/gpu/TGV_3D_MultiGPU/CMakeLists.txt
similarity index 100%
rename from apps/gpu/LBM/TGV_3D_MultiGPU/CMakeLists.txt
rename to apps/gpu/TGV_3D_MultiGPU/CMakeLists.txt
diff --git a/apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp b/apps/gpu/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp
similarity index 99%
rename from apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp
rename to apps/gpu/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp
index e643c4f72019c681bc7ae4b2711d46e3399dad71..f409b417378b0a2eab05b65181fac4d86e981c50 100644
--- a/apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp
+++ b/apps/gpu/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp
@@ -127,7 +127,7 @@ bool useWale = false;
 int mpirank;
 int mpiWorldSize;
 
-std::string kernel( "CumulantK17CompChim" );
+std::string kernel( "K17CompressibleNavierStokes" );
 
 //std::string path("F:/Work/Computations/out/TaylorGreen3DNew/"); //LEGOLAS
 //std::string path("results/"); //PHOENIX
@@ -309,7 +309,7 @@ void multipleLevel(const std::string& configPath)
 
     } );
 
-    para->setMainKernel(kernel);
+    para->configureMainKernel(kernel);
 
     if( !useLimiter )
         para->setQuadricLimiters( 1000000.0, 1000000.0, 1000000.0 );
diff --git a/apps/gpu/LBM/TGV_3D_MultiGPU/config.txt b/apps/gpu/TGV_3D_MultiGPU/config.txt
similarity index 100%
rename from apps/gpu/LBM/TGV_3D_MultiGPU/config.txt
rename to apps/gpu/TGV_3D_MultiGPU/config.txt
diff --git a/apps/gpu/LBM/WTG_RUB/CMakeLists.txt b/apps/gpu/WTG_RUB/CMakeLists.txt
similarity index 82%
rename from apps/gpu/LBM/WTG_RUB/CMakeLists.txt
rename to apps/gpu/WTG_RUB/CMakeLists.txt
index 606987dfb093c9c93bbd25bf5ff68fdc81311e1b..d67ec1c079fa418bcfc7374aa7aa7673756329a8 100644
--- a/apps/gpu/LBM/WTG_RUB/CMakeLists.txt
+++ b/apps/gpu/WTG_RUB/CMakeLists.txt
@@ -1,6 +1,6 @@
 PROJECT(WTG_RUB LANGUAGES CUDA CXX)
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES WTG_RUB.cpp)
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES WTG_RUB.cpp)
 
 set_source_files_properties(WTG_RUB.cpp PROPERTIES LANGUAGE CUDA)
 
diff --git a/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp b/apps/gpu/WTG_RUB/WTG_RUB.cpp
similarity index 97%
rename from apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp
rename to apps/gpu/WTG_RUB/WTG_RUB.cpp
index 00fe00a24eb454c9aa0973d6ebe20f22c6a52369..129c08731a60ad2f75b62cdfaa4baa5eec92f00b 100644
--- a/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp
+++ b/apps/gpu/WTG_RUB/WTG_RUB.cpp
@@ -31,7 +31,7 @@
 //! \author Martin Schoenherr
 //=======================================================================================
 #define _USE_MATH_DEFINES
-#include <math.h>
+#include <cmath>
 #include <string>
 #include <sstream>
 #include <iostream>
@@ -41,8 +41,6 @@
 #include <memory>
 #include <filesystem>
 
-#include "mpi.h"
-
 //////////////////////////////////////////////////////////////////////////
 
 #include "DataTypes.h"
@@ -68,7 +66,6 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
@@ -76,7 +73,9 @@
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
 #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
 
+#include <parallel/MPICommunicator.h>
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -129,11 +128,8 @@ std::string chooseVariation();
 
 void multipleLevel(const std::string& configPath)
 {
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
-
-    auto gridFactory = GridFactory::make();
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
+    //auto gridBuilder = MultipleGridBuilder::makeShared();
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -191,6 +187,7 @@ void multipleLevel(const std::string& configPath)
     // bool reset_diff = false;
     bool reset_flow = false;
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
     gridBuilder->addCoarseGrid(x_min, y_min, z_min,
                                x_max, y_max, z_max, dx);
@@ -218,7 +215,7 @@ void multipleLevel(const std::string& configPath)
     vf::basics::ConfigurationFile config;
     config.load(configPath);
 
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -227,8 +224,8 @@ void multipleLevel(const std::string& configPath)
 	//const real vx = velocityLB / (real)sqrt(2.0); // LB units
 	//const real vy = velocityLB / (real)sqrt(2.0); // LB units
 
-    VF_LOG_INFO("velocityLB [dx/dt] = " << velocityLB);
-    VF_LOG_INFO("viscosityLB [dx^2/dt] = " << viscosityLB);
+    VF_LOG_INFO("velocityLB [dx/dt] = {}", velocityLB);
+    VF_LOG_INFO("viscosityLB [dx^2/dt] = {}", viscosityLB);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -246,7 +243,7 @@ void multipleLevel(const std::string& configPath)
 
     para->setVelocityRatio(velocity/ velocityLB);
 
-	para->setMainKernel("CumulantK17CompChim"); // CumulantK17Unified, CumulantK17CompChim
+	para->configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
 
 	para->setInitialCondition([&](real coordX, real coordY, real coordZ, real &rho, real &vx, real &vy, real &vz) {
         rho = (real)0.0;
@@ -406,14 +403,14 @@ void addFineGrids(SPtr<MultipleGridBuilder> gridBuilder, uint &maxLevel, real &r
         // FineGrid Level 2 -> dx = 1 cm; lvl 2
         auto FG2_1 = std::make_shared<Cuboid>(-20, -20, -5 + z_offset, 760, 200, 10 + z_offset);
         auto FG2_2 = std::make_shared<Cuboid>(500, -20,  5 + z_offset, 680, 210, 50 + z_offset);
-        auto FG2   = new Conglomerate();
+        auto FG2   = std::make_shared<Conglomerate>();
         FG2->add(FG2_1);
         FG2->add(FG2_2);
 
         // FineGrid Level 3 ->dx = 5 mm; lvl 3
         auto FG3_1 = std::make_shared<Cuboid>(517, -20, -5 + z_offset, 665, 200, 30 + z_offset);
         auto FG3_2 = std::make_shared<Cuboid>(550, 58, -5 + z_offset, 650, 132, 40 + z_offset);
-        auto FG3   = new Conglomerate();
+        auto FG3   = std::make_shared<Conglomerate>();
         FG3->add(FG3_1);
         FG3->add(FG3_2);
 
@@ -463,7 +460,7 @@ void addFineGrids(SPtr<MultipleGridBuilder> gridBuilder, uint &maxLevel, real &r
         //auto FG1_1 = std::make_shared<Cuboid>(-20, -20, -5 + z_offset, 760, 200, 10 + z_offset);
         auto FG1_1 = std::make_shared<Cuboid>(-20, -20, -5 + z_offset, 760, 200, 20 + z_offset);
         auto FG1_2 = std::make_shared<Cuboid>(500, -20,  5 + z_offset, 680, 210, 50 + z_offset);
-        auto FG1   = new Conglomerate();
+        auto FG1   = std::make_shared<Conglomerate>();
         FG1->add(FG1_1);
         FG1->add(FG1_2);
 
@@ -510,14 +507,14 @@ void addFineGrids(SPtr<MultipleGridBuilder> gridBuilder, uint &maxLevel, real &r
         // FineGrid Level 1 -> dx = 8.0 mm; lvl 1
         auto FG1_1 = std::make_shared<Cuboid>(-20, -20, -5 + z_offset, 780, 200, 30 + z_offset);
         auto FG1_2 = std::make_shared<Cuboid>(500, -20, 5 + z_offset, 720, 210, 75 + z_offset);
-        auto FG1 = new Conglomerate();
+        auto FG1   = std::make_shared<Conglomerate>();
         FG1->add(FG1_1);
         FG1->add(FG1_2);
 
         // FineGrid Level 2 -> dx = 4.0 mm; lvl 2
         auto FG2_1 = std::make_shared<Cuboid>(-20, -20, -5 + z_offset, 760, 200, 10 + z_offset);
         auto FG2_2 = std::make_shared<Cuboid>(520, -20, 5 + z_offset, 700, 210, 50 + z_offset);
-        auto FG2 = new Conglomerate();
+        auto FG2   = std::make_shared<Conglomerate>();
         FG2->add(FG2_1);
         FG2->add(FG2_2);
 
@@ -565,7 +562,7 @@ void addFineGrids(SPtr<MultipleGridBuilder> gridBuilder, uint &maxLevel, real &r
         // FineGrid Level 2 -> dx = 1 cm; lvl 2
         auto FG2_1 = std::make_shared<Cuboid>(-20, -20, -5 + z_offset, 760, 200, 10 + z_offset);
         auto FG2_2 = std::make_shared<Cuboid>(500, -20, 5 + z_offset, 680, 210, 50 + z_offset);
-        auto FG2 = new Conglomerate();
+        auto FG2   = std::make_shared<Conglomerate>();
         FG2->add(FG2_1);
         FG2->add(FG2_2);
 
diff --git a/apps/gpu/LBM/WTG_RUB/configDrivenCavity.txt b/apps/gpu/WTG_RUB/configDrivenCavity.txt
similarity index 100%
rename from apps/gpu/LBM/WTG_RUB/configDrivenCavity.txt
rename to apps/gpu/WTG_RUB/configDrivenCavity.txt
diff --git a/apps/gpu/LBM/gridGeneratorTest/CMakeLists.txt b/apps/gpu/gridGeneratorTest/CMakeLists.txt
similarity index 51%
rename from apps/gpu/LBM/gridGeneratorTest/CMakeLists.txt
rename to apps/gpu/gridGeneratorTest/CMakeLists.txt
index 6493b72cfd996a6866fe0fb07291dd2e3438dd03..b946a710edffbdcb98894e0d49763c6ead3dabf9 100644
--- a/apps/gpu/LBM/gridGeneratorTest/CMakeLists.txt
+++ b/apps/gpu/gridGeneratorTest/CMakeLists.txt
@@ -1,5 +1,3 @@
-PROJECT(GridGeneratorTest LANGUAGES CUDA CXX)
+PROJECT(GridGeneratorTest LANGUAGES CXX)
 
 vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES gridGenerator.cpp)
-
-set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA)
diff --git a/apps/gpu/LBM/gridGeneratorTest/config.txt b/apps/gpu/gridGeneratorTest/config.txt
similarity index 100%
rename from apps/gpu/LBM/gridGeneratorTest/config.txt
rename to apps/gpu/gridGeneratorTest/config.txt
diff --git a/apps/gpu/LBM/gridGeneratorTest/gridGenerator.cpp b/apps/gpu/gridGeneratorTest/gridGenerator.cpp
similarity index 90%
rename from apps/gpu/LBM/gridGeneratorTest/gridGenerator.cpp
rename to apps/gpu/gridGeneratorTest/gridGenerator.cpp
index 90cc4c0ab33745c65688db4bf170b25a9099da51..e9ef5ae4790105471c227800d494f68deeb73c8d 100644
--- a/apps/gpu/LBM/gridGeneratorTest/gridGenerator.cpp
+++ b/apps/gpu/gridGeneratorTest/gridGenerator.cpp
@@ -1,24 +1,14 @@
-//#define MPI_LOGGING
-
-//Martin Branch
-
-#include <mpi.h>
-#if defined( MPI_LOGGING )
-	#include <mpe.h>
-#endif
-
-#include <string>
+#include <fstream>
 #include <iostream>
 #include <stdexcept>
-#include <fstream>
+#include <string>
 #define _USE_MATH_DEFINES
-#include <math.h>
+#include <cmath>
 
 #include "StringUtilities/StringUtil.h"
 #include "basics/config/ConfigurationFile.h"
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
@@ -55,45 +45,26 @@
 #include "utilities/communication.h"
 #include "utilities/transformator/TransformatorImp.h"
 
+#include <parallel/MPICommunicator.h>
 
-void multipleLevel(const std::string& configPath)
+void runVirtualFluids(const vf::basics::ConfigurationFile &config)
 {
-    auto gridFactory = GridFactory::make();
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
-    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
-
-    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
+    auto gridBuilder = std::make_shared<MultipleGridBuilder>();
 
-    vf::gpu::Communicator& communicator = vf::gpu::MpiCommunicator::getInstance();
-    vf::basics::ConfigurationFile config;
-    config.load(configPath);
-    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcess(), communicator.getPID(), &config);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNumberOfProcesses(), communicator.getProcessID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
 
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     bool useGridGenerator = true;
 
-    if(useGridGenerator){
-
-        enum testCase{
-			TGV,
-			TGV3D,
-			SphereTest,
-			DrivAer,
-            PaperPlane,
-            DLC,
-            MultiGPU,
-            StlGroupTest
-        };
+    if (useGridGenerator) {
+        enum testCase { TGV, TGV3D, SphereTest, DrivAer, PaperPlane, DLC, MultiGPU, StlGroupTest };
 
         int testcase = SphereTest;
 
-		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		if (testcase == TGV)
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		{
@@ -180,7 +151,7 @@ void multipleLevel(const std::string& configPath)
 
             para->setUseWale(false);
 
-            para->setMainKernel("CumulantK15Comp");
+            para->configureMainKernel("CumulantK15Comp");
 
             //////////////////////////////////////////////////////////////////////////
 
@@ -265,7 +236,7 @@ void multipleLevel(const std::string& configPath)
 
             para->setUseWale(false);
 
-            para->setMainKernel("CumulantK20Comp");
+            para->configureMainKernel("CumulantK20Comp");
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -368,7 +339,7 @@ void multipleLevel(const std::string& configPath)
 
             para->setUseWale(false);
 
-            para->setMainKernel("CumulantAA2016CompSP27");
+            para->configureMainKernel("CumulantAA2016CompSP27");
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -446,8 +417,8 @@ void multipleLevel(const std::string& configPath)
 
             para->setUseWale(false);
 
-            para->setMainKernel("CumulantAA2016CompSP27");
-            //para->setMainKernel(kernelMapper->getEnum("CumulantOneCompSP27"));
+            para->configureMainKernel("CumulantAA2016CompSP27");
+            //para->configureMainKernel(kernelMapper->getEnum("CumulantOneCompSP27"));
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -540,7 +511,7 @@ void multipleLevel(const std::string& configPath)
             gridBuilder->addGrid(DLC_RefBox_Level_3, 3);
             gridBuilder->addGrid(DLC_RefBox_Level_4, 4);
 
-            Conglomerate* refinement = new Conglomerate();
+            auto refinement = std::make_shared<Conglomerate>();
             refinement->add(DLC_RefBox_Level_5);
             refinement->add(VW370_SERIE_STL);
 
@@ -555,10 +526,10 @@ void multipleLevel(const std::string& configPath)
 
             //////////////////////////////////////////////////////////////////////////
 
-            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
-            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx, 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx, 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx, 0.0, 0.0);
+            gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx, 0.0, 0.0);
 
             gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
             gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
@@ -643,13 +614,13 @@ void multipleLevel(const std::string& configPath)
 
             para->setUseWale(false);
 
-            para->setMainKernel("CumulantK15Comp");
+            para->configureMainKernel("CumulantK15Comp");
 
             para->setDevices( { 0, 1 } );
             para->setMaxDev(2);
 
             //const uint generatePart = 1;
-            const uint generatePart = communicator.getPID();
+            const uint generatePart = communicator.getProcessID();
 
             std::ofstream logFile2;
 
@@ -700,12 +671,12 @@ void multipleLevel(const std::string& configPath)
             gridBuilder->buildGrids(true); // buildGrids() has to be called before setting the BCs!!!!
 
             if( generatePart == 0 ){
-                gridBuilder->findCommunicationIndices(CommunicationDirections::PX, LBM);
+                gridBuilder->findCommunicationIndices(CommunicationDirections::PX);
                 gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 1);
             }
 
             if( generatePart == 1 ){
-                gridBuilder->findCommunicationIndices(CommunicationDirections::MX, LBM);
+                gridBuilder->findCommunicationIndices(CommunicationDirections::MX);
                 gridBuilder->setCommunicationProcess(CommunicationDirections::MX, 0);
             }
 
@@ -752,75 +723,46 @@ void multipleLevel(const std::string& configPath)
             //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
         }
 
-    }
-    else
-    {
+    } else {
         //gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
         //gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
     }
 
-    logFile.close();
-
     //return;
 
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
 
     SPtr<GridProvider> gridGenerator;
-    if( useGridGenerator ) gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
-    else                   gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
+    if (useGridGenerator)
+        gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
+    else
+        gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
 
-    SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
     Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory);
     sim.run();
 }
 
-int main( int argc, char* argv[])
+int main(int argc, char *argv[])
 {
-    MPI_Init(&argc, &argv);
-    std::string str, str2;
-    if ( argv != NULL )
-    {
-        //str = static_cast<std::string>(argv[0]);
-
-        try
-        {
-            //////////////////////////////////////////////////////////////////////////
-
-			std::string targetPath;
-
-			targetPath = __FILE__;
-
-#ifdef _WIN32
-			targetPath = targetPath.substr(0, targetPath.find_last_of('\\') + 1);
-#else
-			targetPath = targetPath.substr(0, targetPath.find_last_of('/') + 1);
-#endif
+    if (argc > 1) {
 
-			std::cout << targetPath << std::endl;
-
-			multipleLevel(targetPath + "config.txt");
+        try {
+            VF_LOG_TRACE("For the default config path to work, execute the app from the project root.");
+            vf::basics::ConfigurationFile config = vf::basics::loadConfig(argc, argv);
+            runVirtualFluids(config);
 
             //////////////////////////////////////////////////////////////////////////
-		}
-        catch (const std::bad_alloc& e)
-        {
-            std::cout << "Bad alloc: " << e.what() << std::flush;
-        }
-        catch (const std::exception& e)
-        {
-            std::cout << e.what() << std::flush;
+        } catch (const spdlog::spdlog_ex &ex) {
+            std::cout << "Log initialization failed: " << ex.what() << std::endl;
+        } catch (const std::bad_alloc &e) {
+            VF_LOG_CRITICAL("Bad Alloc: {}", e.what());
+        } catch (const std::exception &e) {
+            VF_LOG_CRITICAL("exception: {}", e.what());
+        } catch (...) {
+            VF_LOG_CRITICAL("Unknown exception!");
         }
-        catch (...)
-        {
-            std::cout << "unknown exeption" << std::endl;
-        }
-
     }
-
-   MPI_Finalize();
-   return 0;
+    return 0;
 }
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp
index 3564f65025a38d37c577b6ea6a882e6f48fd1e65..8646cc1991802b10d284c41acade4f5002df906b 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp
@@ -9,9 +9,10 @@
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
 
 #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 
+#include <parallel/MPICommunicator.h>
+
 std::shared_ptr<Parameter> vf::gpu::tests::makeParameter(std::shared_ptr<SimulationParameter> simPara)
 {
     auto para = std::make_shared<Parameter>(1, 0);
@@ -97,7 +98,7 @@ std::shared_ptr<Parameter> vf::gpu::tests::makeParameter(std::shared_ptr<Simulat
     // TODO: Find out if we still need this
     // para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
 
-    para->setMainKernel(simPara->getKernelConfiguration()->getMainKernel());
+    para->configureMainKernel(simPara->getKernelConfiguration()->getMainKernel());
     para->setMultiKernelOn(simPara->getKernelConfiguration()->getMultiKernelOn());
     para->setMultiKernelLevel(simPara->getKernelConfiguration()->getMultiKernelLevel());
     para->setMultiKernel(simPara->getKernelConfiguration()->getMultiKernel());
@@ -119,8 +120,9 @@ const std::function<void()> vf::gpu::tests::makeVirtualFluidSimulation(std::shar
     auto cudaManager = std::make_shared<CudaMemoryManager>(para);
     auto grid = makeGridReader(condition, para, cudaManager);
     BoundaryConditionFactory bc_factory;
+    vf::parallel::Communicator &communicator = *vf::parallel::MPICommunicator::getInstance();
     auto simulation =
-        std::make_shared<Simulation>(para, cudaManager, vf::gpu::MpiCommunicator::getInstance(), *grid.get(), &bc_factory);
+        std::make_shared<Simulation>(para, cudaManager, communicator, *grid.get(), &bc_factory);
     simulation->setDataWriter(dataWriter);
 
     return [simulation]() { simulation->run(); };
diff --git a/apps/gpu/tests/NumericalTests/configK17chim_nu10tm3.txt b/apps/gpu/tests/NumericalTests/configK17chim_nu10tm3.txt
index 6ca01d34f0d8fb224f67cdf786160c30dd2bbd97..34db5ea1deff1bbecf61c1b49686c19babfddb50 100644
--- a/apps/gpu/tests/NumericalTests/configK17chim_nu10tm3.txt
+++ b/apps/gpu/tests/NumericalTests/configK17chim_nu10tm3.txt
@@ -6,7 +6,7 @@ Devices=0
 ##################################################
 #	       Basic Simulation Parameter			 #
 ##################################################
-KernelsToTest=CumulantK17CompChim
+KernelsToTest=K17CompressibleNavierStokesChimeraLegacy
 NumberOfTimeSteps=20
 Viscosity=0.001
 Rho0=1.0
diff --git a/apps/gpu/wifi/UniformInflow/configUniformInflow.txt b/apps/gpu/wifi/UniformInflow/configUniformInflow.txt
new file mode 100755
index 0000000000000000000000000000000000000000..8509a4ef259a168b31781e63e724371f15e0b46e
--- /dev/null
+++ b/apps/gpu/wifi/UniformInflow/configUniformInflow.txt
@@ -0,0 +1,34 @@
+##################################################
+#informations for Writing
+##################################################
+Path = output/wifi/
+##################################################
+#informations for reading
+##################################################
+GridPath = .
+##################################################
+Devices = 0 
+##################################################
+tStartOut           = 0
+tOut                = 10000
+tEnd                = 10000
+##################################################
+tStartAveraging     = 0
+tStartTmpAveraging  = 0
+tAveraging          = 10
+tStartOutProbe      = 10
+tOutProbe           = 10
+##################################################
+Ma = 0.05
+nodesPerDiameter = 32
+bodyForce = true
+SGSconstant = 0.333
+TurbulenceModel = QR
+QuadricLimiterP = 100000.0
+QuadricLimiterM = 100000.0
+QuadricLimiterD = 100000.0
+
+##################################################
+turbineDiameter = 126
+NumberOfNodesPerAL = 100
+# SmearingWidth = 15
\ No newline at end of file
diff --git a/apps/gpu/wifi/UniformInflow/uniform_inflow.py b/apps/gpu/wifi/UniformInflow/uniform_inflow.py
new file mode 100755
index 0000000000000000000000000000000000000000..1c71d7c362326d2f49166f76350ab4b8d0ccf1c0
--- /dev/null
+++ b/apps/gpu/wifi/UniformInflow/uniform_inflow.py
@@ -0,0 +1,150 @@
+#%%
+import numpy as np
+from pathlib import Path
+from mpi4py import MPI
+from pyfluids import basics, gpu, logger
+from wiFI.wind_farm import create_wind_farm_from_json
+from wiFI.logging.logger import LoggerConfig
+from wiFI.aeroelastics.stiff_rotor import StiffRotorGPU
+from wiFI.interfaces.implementations.velocity_provider.VirtualFluids import VFFarm 
+import multiprocessing as mp
+
+mp.set_start_method("spawn", force=True)
+#%%
+def main():
+    communicator = gpu.MpiCommunicator.get_instance()
+    sim_name = "NREL5MW"
+    sim_dir = Path("/workspaces/VirtualFluids_dev/output/wifi/")
+    config_file = Path("apps/gpu/wifi/UniformInflow")/"configUniformInflow.txt"
+    farm_file = Path("/workspaces/VirtualFluids_dev/wifi/resources/turbine_data/NREL5MW")/"SingleTurbine.json"
+    use_tip_correction = False
+    tip_speed_ratio = 7.5
+    #%%
+    logger.Logger.initialize_logger()
+    #%%
+    grid_builder = gpu.grid_generator.MultipleGridBuilder()
+
+    config = basics.ConfigurationFile()
+    config.load(str(config_file))
+
+    para = gpu.Parameter(communicator.get_number_of_process(), communicator.get_pid(), config)
+    para.set_use_streams(True)
+    bc_factory = gpu.BoundaryConditionFactory()
+
+    grid_scaling_factory = gpu.GridScalingFactory()
+    grid_scaling_factory.set_scaling_factory(gpu.GridScaling.ScaleCompressible)
+
+    #%%
+    turbine_diameter = config.get_float_value("turbineDiameter", 126)
+
+
+    viscosity = config.get_float_value("viscosity", 1.56e-5)
+
+    velocity  = 8
+    mach = config.get_float_value("Ma", 0.05)
+    nodes_per_diameter = config.get_uint_value("NodesPerDiameter", 32)
+
+    density = config.get_float_value("Density", 1.225)
+    level = 0
+    n_blade_nodes  = config.get_int_value("NumberOfNodesPerAL", 32)
+
+
+    # all in s
+    t_start_out   = config.get_float_value("tStartOut")
+    t_out         = config.get_float_value("tOut")
+    t_end         = config.get_float_value("tEnd") # total time of simulation
+
+    t_start_averaging      = config.get_float_value("tStartAveraging")
+    t_start_tmp_averaging  = config.get_float_value("tStartTmpAveraging")
+    t_averaging            = config.get_float_value("tAveraging")
+    t_start_out_probe      = config.get_float_value("tStartOutProbe")
+    t_out_probe            = config.get_float_value("tOutProbe")
+
+    #%%
+    length = np.array([4,3,3])*turbine_diameter
+    dx = turbine_diameter / nodes_per_diameter
+    dt = dx * mach / (np.sqrt(3) * velocity)
+    velocity_LB = velocity * dt / dx # LB units
+    viscosity_LB = viscosity * dt / (dx * dx) # LB units
+    pressure_gradient = 0
+    epsilon = dx*pow(2,-level)*1.5
+
+    logger.vf_log_info(f"velocity  [dx/dt] = {velocity_LB}")
+    logger.vf_log_info(f"dt   = {dt}")
+    logger.vf_log_info(f"dx   = {dx}")
+    logger.vf_log_info(f"viscosity [10^8 dx^2/dt] = {viscosity_LB*1e8}")
+    logger.vf_log_info(f"dpdx  = {pressure_gradient}")
+    logger.vf_log_info(f"mach number  = {mach}")
+
+    farm = create_wind_farm_from_json(farm_file, sim_dir, tip_speed_ratio, velocity, True, log_turbine=True, logger_config=LoggerConfig(0, 1.0, timesteps_in_buffer=1))
+    
+    farm.turbine.add_blade_forces_logging(True)
+    farm.turbine.add_blade_coordinate_logging(True)
+    farm.turbine.add_blade_velocities_logging(True)
+
+    #%%
+    para.set_output_prefix(sim_name)
+    para.set_print_files(True)
+
+    para.set_forcing(0, 0, 0)
+    para.set_velocity_LB(velocity_LB)
+    para.set_viscosity_LB(viscosity_LB)    
+    para.set_velocity_ratio(dx/dt)
+    para.set_viscosity_ratio(dx*dx/dt)
+
+    para.set_main_kernel("CumulantK17")
+
+    para.set_timestep_start_out(int(t_start_out))
+    # para.set_timestep_out(20)
+    para.set_timestep_out(int(t_out))
+    para.set_timestep_end(int(t_end))
+    para.set_is_body_force(True)
+    #%%
+    tm_factory = gpu.TurbulenceModelFactory(para)
+    tm_factory.read_config_file(config)
+    #%%
+    grid_builder.add_coarse_grid(-1.*turbine_diameter, -0.5 * length[1], -0.5 * length[2], length[0]-1.*turbine_diameter, 0.5 * length[1], 0.5 * length[2], dx)
+    grid_builder.set_periodic_boundary_condition(False, True, True)
+    grid_builder.build_grids(False)
+
+
+
+    grid_builder.set_velocity_boundary_condition(gpu.SideType.MX, velocity_LB, 0.0, 0.0)
+    grid_builder.set_pressure_boundary_condition(gpu.SideType.PX, 0)
+
+    bc_factory.set_velocity_boundary_condition(gpu.VelocityBC.VelocityCompressible)
+    bc_factory.set_pressure_boundary_condition(gpu.PressureBC.OutflowNonReflective)
+
+    #%%
+    para.set_initial_condition_uniform(velocity_LB, 0, 0)
+
+    coupled_farm = VFFarm(farm, density, epsilon, level, dt, dx,  n_blade_nodes, StiffRotorGPU, (density, ), use_tip_correction, 0)
+    para.add_actuator(coupled_farm)
+
+    # wall_model_probe = gpu.probes.WallModelProbe("wallModelProbe", para.get_output_path(), int(t_start_averaging/dt), int(t_start_tmp_averaging/dt), int(t_averaging/dt), int(t_start_out_probe/dt), int(t_out_probe/dt))
+    # wall_model_probe.add_all_available_statistics()
+    # wall_model_probe.set_file_name_to_n_out()
+    # wall_model_probe.set_force_output_to_stress(True)
+    # if para.get_is_body_force():
+    #     wall_model_probe.set_evaluate_pressure_gradient(True)
+    # para.add_probe(wall_model_probe)
+
+    # plane_locs = [farm.positions.x[0] + i*turbine_diameter for i in range(-1,6)]
+
+    # for n_probe, probe_pos in enumerate(plane_locs):
+    #     plane_probe = gpu.probes.PlaneProbe(f"planeProbe_{n_probe+1}", para.get_output_path(), int(t_start_averaging/dt), int(t_averaging/dt), int(t_start_out_probe/dt), int(t_out_probe/dt))
+    #     plane_probe.set_probe_plane(probe_pos, 0, 0, dx, length[1], length[2])
+    #     plane_probe.add_all_available_statistics()
+    #     para.add_probe(plane_probe)
+
+    #%%
+    cuda_memory_manager = gpu.CudaMemoryManager(para)
+    grid_generator = gpu.GridProvider.make_grid_generator(grid_builder, para, cuda_memory_manager, communicator)
+    #%%
+    sim = gpu.Simulation(para, cuda_memory_manager, communicator, grid_generator, bc_factory, tm_factory, grid_scaling_factory)
+    #%%
+    sim.run()
+    MPI.Finalize()
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
diff --git a/gpu.cmake b/gpu.cmake
index 6bdbf656326c4d733ec2c5b5d08751b3055a7b00..8f3fde523efa4cbf2f0884723728832f82a53231 100644
--- a/gpu.cmake
+++ b/gpu.cmake
@@ -5,20 +5,23 @@
 add_subdirectory(src/gpu/GridGenerator)
 add_subdirectory(src/gpu/VirtualFluids_GPU)
 
-if(BUILD_VF_ALL_SAMPLES)
-    list(APPEND USER_APPS 
-    "apps/gpu/LBM/ActuatorLine"
-    "apps/gpu/LBM/SphereScaling" 
-    "apps/gpu/LBM/TGV_3D")
-endif()
-
 #############################################################
 ###                  Apps                                 ###
 #############################################################
 
-add_subdirectory(apps/gpu/LBM/DrivenCavity)
-add_subdirectory(apps/gpu/LBM/SphereGPU)
-add_subdirectory(apps/gpu/LBM/BoundaryLayer)
+if(BUILD_VF_ALL_SAMPLES)
+    list(APPEND USER_APPS
+    "apps/gpu/DrivenCavityUniform"
+    "apps/gpu/DrivenCavityMultiGPU"
+    "apps/gpu/ActuatorLine"
+    "apps/gpu/SphereScaling" 
+    "apps/gpu/TGV_3D"
+    "apps/gpu/gridGeneratorTest")
+endif()
+
+add_subdirectory(apps/gpu/DrivenCavity)
+add_subdirectory(apps/gpu/SphereGPU)
+add_subdirectory(apps/gpu/BoundaryLayer)
 
 #############################################################
 ###                   Numeric Tests                       ###
diff --git a/pythonbindings/CMakeLists.txt b/pythonbindings/CMakeLists.txt
index c9bef9ef080e6e995b903837475f7c2e401152ee..8dbf9047ac964b2886a180c6be5d1b753e4fcb24 100644
--- a/pythonbindings/CMakeLists.txt
+++ b/pythonbindings/CMakeLists.txt
@@ -41,18 +41,27 @@ target_include_directories(lbm_bindings PRIVATE ${CMAKE_SOURCE_DIR}/src/)
 target_include_directories(lbm_bindings PRIVATE ${CMAKE_BINARY_DIR})
 add_dependencies(python_bindings lbm_bindings)
 
+pybind11_add_module(communicator_bindings MODULE src/communicator.cpp)
+set_target_properties(  communicator_bindings PROPERTIES
+                        LIBRARY_OUTPUT_DIRECTORY ${PYFLUIDS_DIR}
+                        OUTPUT_NAME "communicator")
+target_link_libraries(communicator_bindings PRIVATE parallel)
+target_include_directories(communicator_bindings PRIVATE ${CMAKE_SOURCE_DIR}/src/)
+target_include_directories(communicator_bindings PRIVATE ${CMAKE_BINARY_DIR})
+target_compile_definitions(communicator_bindings PRIVATE VF_MPI)
+add_dependencies(python_bindings communicator_bindings)
+
 
 IF(BUILD_VF_GPU)
     pybind11_add_module(gpu_bindings MODULE src/gpu/gpu.cpp)
     set_target_properties(  gpu_bindings PROPERTIES
                             LIBRARY_OUTPUT_DIRECTORY ${PYFLUIDS_DIR}
                             OUTPUT_NAME "gpu")
-    target_link_libraries(gpu_bindings PRIVATE basics)
     set_source_files_properties(src/gpu/gpu.cpp PROPERTIES LANGUAGE CUDA)
 
     target_include_directories(gpu_bindings PRIVATE ${VF_THIRD_DIR}/cuda_samples/)
 
-    target_link_libraries(gpu_bindings PRIVATE GridGenerator VirtualFluids_GPU)
+    target_link_libraries(gpu_bindings PRIVATE basics GridGenerator VirtualFluids_GPU parallel)
 
     target_include_directories(gpu_bindings PRIVATE ${CMAKE_SOURCE_DIR}/src/)
     target_include_directories(gpu_bindings PRIVATE ${CMAKE_BINARY_DIR})
@@ -70,15 +79,9 @@ IF(BUILD_VF_CPU)
     target_include_directories(cpu_bindings PRIVATE ${CMAKE_SOURCE_DIR}/src/)
     target_include_directories(cpu_bindings PRIVATE ${CMAKE_BINARY_DIR})
 
-    target_compile_definitions(cpu_bindings PUBLIC VF_DOUBLE_ACCURACY) # TODO: remove this and always set it dynamically
-    target_compile_definitions(basics_bindings PUBLIC VF_DOUBLE_ACCURACY)
-    target_compile_definitions(logger_bindings PUBLIC VF_DOUBLE_ACCURACY)
-    target_compile_definitions(lbm_bindings PUBLIC VF_DOUBLE_ACCURACY)
-
     target_compile_definitions(cpu_bindings PRIVATE VF_METIS VF_MPI)
     add_dependencies(python_bindings cpu_bindings)
 
-
     # include bindings for muparsers
     pybind11_add_module(pymuparser MODULE src/muParser.cpp)
 
@@ -91,3 +94,16 @@ IF(BUILD_VF_CPU)
     target_compile_definitions(pymuparser PRIVATE VF_METIS VF_MPI)
     target_link_libraries(pymuparser PRIVATE muparser)
 ENDIF()
+
+if(BUILD_VF_DOUBLE_ACCURACY)
+IF(BUILD_VF_CPU)
+    target_compile_definitions(cpu_bindings PRIVATE VF_DOUBLE_ACCURACY)
+endif()
+    target_compile_definitions(basics_bindings PRIVATE VF_DOUBLE_ACCURACY)
+    target_compile_definitions(logger_bindings PRIVATE VF_DOUBLE_ACCURACY)
+    target_compile_definitions(lbm_bindings PRIVATE VF_DOUBLE_ACCURACY)
+    IF(BUILD_VF_GPU)
+    target_compile_definitions(gpu_bindings PRIVATE VF_DOUBLE_ACCURACY)
+    endif()
+    target_compile_definitions(communicator_bindings PRIVATE VF_DOUBLE_ACCURACY)
+endif()
\ No newline at end of file
diff --git a/pythonbindings/pyfluids-stubs/gpu/__init__.pyi b/pythonbindings/pyfluids-stubs/gpu/__init__.pyi
index cc6e3906477e5206a7d3be159cda15909aa1ba68..8f78fd3387dc59c94ddf2315635e674a7330dae9 100644
--- a/pythonbindings/pyfluids-stubs/gpu/__init__.pyi
+++ b/pythonbindings/pyfluids-stubs/gpu/__init__.pyi
@@ -178,7 +178,8 @@ class GridProvider:
     @staticmethod
     def make_grid_generator(builder: grid_generator.GridBuilder, para: Parameter, cuda_memory_manager: CudaMemoryManager, communicator: MpiCommunicator) -> GridProvider: ...
 
-
+class MultipleGridBuilder:
+    def __init__(self) -> None: ...
 
 class GridScaling:
     __members__: ClassVar[dict] = ...  # read-only
diff --git a/pythonbindings/pyfluids/__init__.py b/pythonbindings/pyfluids/__init__.py
index f0537b758267e22a72e5030340de7b87d52f35c3..5b4197972c0a8738c551e57e635415e3858f53e6 100644
--- a/pythonbindings/pyfluids/__init__.py
+++ b/pythonbindings/pyfluids/__init__.py
@@ -33,22 +33,26 @@ r"""
 =======================================================================================
 """
 try:
-    from .bindings import basics
+    from . import basics
 except ImportError:
     print("Basics bindings not included")
 try:
-    from .bindings import logger
+    from . import logger
 except ImportError:
     print("Logger bindings not included")
 try:
-    from .bindings import lbm
+    from . import lbm
 except ImportError:
     print("LBM bindings not included")
 try:
-    from .bindings import gpu
+    from . import communicator
+except ImportError:
+    print("communicator bindings not included")
+try:
+    from . import gpu
 except ImportError:
     print("GPU bindings not included")
 try:
-    from .bindings import cpu
+    from . import cpu
 except ImportError:
     print("CPU bindings not included")
\ No newline at end of file
diff --git a/pythonbindings/src/gpu/submodules/communicator.cpp b/pythonbindings/src/communicator.cpp
similarity index 78%
rename from pythonbindings/src/gpu/submodules/communicator.cpp
rename to pythonbindings/src/communicator.cpp
index f17fa749461b522ffb3254cad7f9b6675d3de4fc..fe706bb9eba4083f2a1a705a3ee615b727de77c8 100644
--- a/pythonbindings/src/gpu/submodules/communicator.cpp
+++ b/pythonbindings/src/communicator.cpp
@@ -30,18 +30,20 @@
 //! \ingroup submodules
 //! \author Henry Korb
 //=======================================================================================
+#include <pybind11/cast.h>
 #include <pybind11/pybind11.h>
-#include <gpu/VirtualFluids_GPU/Communication/MpiCommunicator.h>
 
-namespace communicator
+#include <parallel/MPICommunicator.h>
+
+namespace communicator_bindings
 {
-    namespace py = pybind11;
+namespace py = pybind11;
 
-    void makeModule(py::module_ &parentModule)
-    {
-        py::class_<vf::gpu::MpiCommunicator, std::unique_ptr<vf::gpu::MpiCommunicator, py::nodelete>>(parentModule, "MpiCommunicator")
-        .def_static("get_instance", &vf::gpu::MpiCommunicator::getInstance, py::return_value_policy::reference)
-        .def("get_number_of_process", &vf::gpu::MpiCommunicator::getNumberOfProcess)
-        .def("get_pid", &vf::gpu::MpiCommunicator::getPID);
-    }
-}
\ No newline at end of file
+PYBIND11_MODULE(communicator, m)
+{
+    py::class_<vf::parallel::MPICommunicator, std::shared_ptr<vf::parallel::MPICommunicator>>(m, "Communicator")
+        .def_static("get_instance", &vf::parallel::MPICommunicator::getInstance)
+        .def("get_number_of_processes", &vf::parallel::MPICommunicator::getNumberOfProcesses)
+        .def("get_process_id", py::overload_cast<>(&vf::parallel::MPICommunicator::getProcessID, py::const_));
+}
+} // namespace communicator_bindings
diff --git a/pythonbindings/src/gpu/gpu.cpp b/pythonbindings/src/gpu/gpu.cpp
index 8946b1d8af7655682a19e793119b27ab77f6f542..dcb4ded4b1f0f92748323081b7de9504c2995542 100644
--- a/pythonbindings/src/gpu/gpu.cpp
+++ b/pythonbindings/src/gpu/gpu.cpp
@@ -35,7 +35,6 @@
 #include "submodules/simulation.cpp"
 #include "submodules/parameter.cpp"
 #include "submodules/boundary_conditions.cpp"
-#include "submodules/communicator.cpp"
 #include "submodules/cuda_memory_manager.cpp"
 #include "submodules/probes.cpp"
 #include "submodules/precursor_writer.cpp"
@@ -48,23 +47,20 @@
 
 namespace gpu_bindings
 {
-    namespace py = pybind11;
-
-    PYBIND11_MODULE(gpu, m)
-    {
-        simulation::makeModule(m);
-        parameter::makeModule(m);
-        pre_collision_interactor::makeModule(m);
-        actuator_farm::makeModule(m);
-        boundary_conditions::makeModule(m);
-        transient_bc_setter::makeModule(m);
-        communicator::makeModule(m); 
-        cuda_memory_manager::makeModule(m);
-        probes::makeModule(m);
-        precursor_writer::makeModule(m);
-        grid_generator::makeModule(m);
-        grid_provider::makeModule(m);
-        turbulence_model::makeModule(m);
-        grid_scaling_factory::makeModule(m);
-    }
-}
\ No newline at end of file
+PYBIND11_MODULE(gpu, m)
+{
+    simulation::makeModule(m);
+    parameter::makeModule(m);
+    pre_collision_interactor::makeModule(m);
+    actuator_farm::makeModule(m);
+    boundary_conditions::makeModule(m);
+    transient_bc_setter::makeModule(m);
+    cuda_memory_manager::makeModule(m);
+    probes::makeModule(m);
+    precursor_writer::makeModule(m);
+    grid_generator::makeModule(m);
+    grid_provider::makeModule(m);
+    turbulence_model::makeModule(m);
+    grid_scaling_factory::makeModule(m);
+}
+} // namespace gpu_bindings
diff --git a/pythonbindings/src/gpu/submodules/grid_generator.cpp b/pythonbindings/src/gpu/submodules/grid_generator.cpp
index f4c2b733e7b099309b3fdc238ee71c22d940cced..6c57900e4298094b59355e82a22433e1b647e059 100644
--- a/pythonbindings/src/gpu/submodules/grid_generator.cpp
+++ b/pythonbindings/src/gpu/submodules/grid_generator.cpp
@@ -38,7 +38,6 @@
 #include "gpu/GridGenerator/geometries/Cuboid/Cuboid.h"
 #include "gpu/GridGenerator/geometries/Sphere/Sphere.h"
 #include "gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
-#include "gpu/GridGenerator/grid/GridFactory.h"
 #include "gpu/GridGenerator/grid/GridBuilder/GridBuilder.h"
 #include "gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
@@ -63,9 +62,6 @@ namespace grid_generator
         // .value("MZ", CommunicationDirections::MZ)
         // .value("PZ", CommunicationDirections::PZ);
 
-        py::class_<GridFactory, std::shared_ptr<GridFactory>>(gridGeneratorModule, "GridFactory")
-        .def_static("make", &GridFactory::make, py::return_value_policy::reference);
-
         py::class_<BoundingBox, std::shared_ptr<BoundingBox>>(gridGeneratorModule, "BoundingBox")
         .def(py::init<real, real, real, real, real, real>(), py::arg("min_x"), py::arg("max_x"), py::arg("min_y"), py::arg("max_y"), py::arg("min_z"), py::arg("max_z"));
 
@@ -99,7 +95,7 @@ namespace grid_generator
         .def("set_stress_boundary_condition", &LevelGridBuilder::setStressBoundaryCondition, py::arg("side_type"), py::arg("normal_x"), py::arg("normal_y"), py::arg("normal_z"), py::arg("sampling_offset"), py::arg("z0"), py::arg("dx"));
 
         py::class_<MultipleGridBuilder, LevelGridBuilder, std::shared_ptr<MultipleGridBuilder>>(gridGeneratorModule, "MultipleGridBuilder")
-        .def_static("make_shared", &MultipleGridBuilder::makeShared, py::return_value_policy::reference, py::arg("grid_factory"))
+        .def(py::init())
         .def("add_coarse_grid", &MultipleGridBuilder::addCoarseGrid, py::arg("start_x"), py::arg("start_y"), py::arg("start_z"), py::arg("end_x"), py::arg("end_y"), py::arg("end_z"), py::arg("delta"))
         .def("add_grid", py::overload_cast<SPtr<Object>>(&MultipleGridBuilder::addGrid), py::arg("grid_shape"))
         .def("add_grid", py::overload_cast<SPtr<Object>, uint>(&MultipleGridBuilder::addGrid), py::arg("grid_shape"), py::arg("level_fine"))
diff --git a/pythonbindings/src/gpu/submodules/parameter.cpp b/pythonbindings/src/gpu/submodules/parameter.cpp
index e1d8a1f63eb877ec7ae42beb858b0b7cb9253815..53c270f16327aee73b55e746d1d0bb94993203a2 100644
--- a/pythonbindings/src/gpu/submodules/parameter.cpp
+++ b/pythonbindings/src/gpu/submodules/parameter.cpp
@@ -83,7 +83,7 @@ namespace parameter
         .def("set_max_dev", &Parameter::setMaxDev, py::arg("max_dev"))
         .def("set_is_body_force", &Parameter::setIsBodyForce, py::arg("is_body_force"))
         .def("set_use_streams", &Parameter::setUseStreams, py::arg("use_streams"))
-        .def("set_main_kernel", &Parameter::setMainKernel, py::arg("kernel"))
+        .def("set_main_kernel", &Parameter::configureMainKernel, py::arg("kernel"))
         .def("set_AD_kernel", &Parameter::setADKernel, py::arg("ad_kernel"))
         .def("set_has_wall_model_monitor", &Parameter::setHasWallModelMonitor, py::arg("has_wall_monitor"))
         .def("set_outflow_pressure_correction_factor", &Parameter::setOutflowPressureCorrectionFactor, py::arg("correction_factor"))
diff --git a/pythonbindings/src/gpu/submodules/simulation.cpp b/pythonbindings/src/gpu/submodules/simulation.cpp
index d32ef272a1fd26510439dde6ab3a9438d68009a7..545fe082fe59cacabde07052ccf1b041d0af7e25 100644
--- a/pythonbindings/src/gpu/submodules/simulation.cpp
+++ b/pythonbindings/src/gpu/submodules/simulation.cpp
@@ -32,7 +32,6 @@
 //=======================================================================================
 #include <pybind11/pybind11.h>
 #include <gpu/VirtualFluids_GPU/LBM/Simulation.h>
-#include <gpu/VirtualFluids_GPU/Communication/Communicator.h>
 #include <gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactory.h>
 #include <gpu/VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactory.h>
 #include <gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h>
@@ -43,6 +42,7 @@
 #include "gpu/VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
 #include "gpu/VirtualFluids_GPU/TurbulenceModels/TurbulenceModelFactory.h"
 #include "gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h"
+#include "parallel/Communicator.h"
 
 namespace simulation
 {
@@ -54,7 +54,7 @@ namespace simulation
         py::class_<Simulation>(parentModule, "Simulation")
         .def(py::init<  std::shared_ptr<Parameter>,
                         std::shared_ptr<CudaMemoryManager>,
-                        vf::gpu::Communicator &,
+                        vf::parallel::Communicator &,
                         GridProvider &,
                         BoundaryConditionFactory*,
                         GridScalingFactory*>(), 
@@ -66,7 +66,7 @@ namespace simulation
                         py::arg("gridScalingFactory"))
         .def(py::init<  std::shared_ptr<Parameter>,
                         std::shared_ptr<CudaMemoryManager>,
-                        vf::gpu::Communicator &,
+                        vf::parallel::Communicator &,
                         GridProvider &,
                         BoundaryConditionFactory*>(), 
                         py::arg("parameter"),
@@ -76,7 +76,7 @@ namespace simulation
                         py::arg("bcFactory"))
         .def(py::init<  std::shared_ptr<Parameter>,
                         std::shared_ptr<CudaMemoryManager>,
-                        vf::gpu::Communicator &,
+                        vf::parallel::Communicator &,
                         GridProvider &,
                         BoundaryConditionFactory*,
                         std::shared_ptr<TurbulenceModelFactory>,
diff --git a/regression-tests/driven_cavity_uniform_test.sh b/regression-tests/driven_cavity_uniform_test.sh
index deb1300cad5914e69a4f2c01428bbef31d7af6d3..c7bb78d014cdd4b2103932c5a9e5134bd8f7b767 100755
--- a/regression-tests/driven_cavity_uniform_test.sh
+++ b/regression-tests/driven_cavity_uniform_test.sh
@@ -7,7 +7,7 @@ source ./regression-tests/__regression_test_executer.sh
 REFERENCE_DATA_DIR=regression_tests/gpu/DrivenCavity_uniform
 
 # 2. set cmake flags for the build of VirtualFluids
-CMAKE_FLAGS="--preset=make_gpu -DCMAKE_BUILD_TYPE=Release -DCMAKE_CUDA_ARCHITECTURES=75 -DUSER_APPS="apps/gpu/LBM/DrivenCavityUniform""
+CMAKE_FLAGS="--preset=make_gpu -DCMAKE_BUILD_TYPE=Release -DCMAKE_CUDA_ARCHITECTURES=75 -DUSER_APPS="apps/gpu/DrivenCavityUniform""
 
 # 3. define the application to be executed
 APPLICATION=./build/bin/DrivenCavityUniform
diff --git a/regression-tests/flow_around_cylinder_test.sh b/regression-tests/flow_around_cylinder_test.sh
index 63f90886b79002dcffe6beb24e626922ca95fe78..1b0440abef66afb0aed4efc0f05173f1917ab24b 100755
--- a/regression-tests/flow_around_cylinder_test.sh
+++ b/regression-tests/flow_around_cylinder_test.sh
@@ -4,7 +4,7 @@ source ./regression-tests/__regression_test_executer.sh
 
 
 # 1. set reference data directory (must match the folder structure in https://github.com/irmb/test_data)
-REFERENCE_DATA_DIR=regression_tests/cpu/FlowAroundCylinder_2023_04
+REFERENCE_DATA_DIR=regression_tests/cpu/FlowAroundCylinder_2023_06
 
 # 2. set cmake flags for the build of VirtualFluids
 CMAKE_FLAGS="--preset=make_cpu -DCMAKE_BUILD_TYPE=Release"
diff --git a/regression-tests/multigpu_test/rocket4GPU.yml b/regression-tests/multigpu_test/rocket4GPU.yml
index a7ece055707c26a7a27e9c12be3447dc1b77855f..e8722cf367832104a12935af5bbbe660ce8e7fcc 100755
--- a/regression-tests/multigpu_test/rocket4GPU.yml
+++ b/regression-tests/multigpu_test/rocket4GPU.yml
@@ -31,8 +31,8 @@ copy:
     to: "multigpu_test/CMakePresets.json"
     overwrite: true
 
-  - from: "apps/gpu/LBM/"
-    to: "multigpu_test/apps/gpu/LBM/"
+  - from: "apps/gpu/"
+    to: "multigpu_test/apps/gpu/"
     overwrite: true
 
 collect:
diff --git a/regression-tests/multigpu_test/rocket8GPU.yml b/regression-tests/multigpu_test/rocket8GPU.yml
index 4b434fc8a2433dab513649800dbe3f160d986edd..d179dbc84d1f80b0efb9fcb368bffaa2732c26da 100755
--- a/regression-tests/multigpu_test/rocket8GPU.yml
+++ b/regression-tests/multigpu_test/rocket8GPU.yml
@@ -31,8 +31,8 @@ copy:
     to: "multigpu_test/CMakePresets.json"
     overwrite: true
 
-  - from: "apps/gpu/LBM/"
-    to: "multigpu_test/apps/gpu/LBM/"
+  - from: "apps/gpu/"
+    to: "multigpu_test/apps/gpu/"
     overwrite: true
 
 collect:
diff --git a/regression-tests/multigpu_test/slurm4GPU.job b/regression-tests/multigpu_test/slurm4GPU.job
index 0be42c51bac9a341b56eb705f9bdb518883f507d..ce678a57945c87f881f88887e88d79dff51bef0e 100755
--- a/regression-tests/multigpu_test/slurm4GPU.job
+++ b/regression-tests/multigpu_test/slurm4GPU.job
@@ -26,13 +26,13 @@ module list
 cd multigpu_test
 rm -rf build && mkdir -p build
 cd build
-cmake .. -DBUILD_VF_GPU=ON -DCMAKE_CUDA_ARCHITECTURES=60 -DUSER_APPS=apps/gpu/LBM/DrivenCavityMultiGPU\;apps/gpu/LBM/SphereScaling
+cmake .. -DBUILD_VF_GPU=ON -DCMAKE_CUDA_ARCHITECTURES=60 -DUSER_APPS=apps/gpu/DrivenCavityMultiGPU\;apps/gpu/SphereScaling
 make -j 16
 cd ..
 mkdir -p output
 
 echo $'\n\n\n\n---First test: DrivenCavityMultiGPU on 4 GPUs\n\n'
-mpirun -np 4 "./build/bin/DrivenCavityMultiGPU" "apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix4GPU_regressionTest.txt"
+mpirun -np 4 "./build/bin/DrivenCavityMultiGPU" "apps/gpu/DrivenCavityMultiGPU/configPhoenix4GPU_regressionTest.txt"
 
 echo $'\n\n\n\n---Second test: SphereScaling on 4 GPUs\n\n'
-mpirun -np 4 "./build/bin/SphereScaling"        "apps/gpu/LBM/SphereScaling/configPhoenix4GPU_regressionTest.txt"
\ No newline at end of file
+mpirun -np 4 "./build/bin/SphereScaling"        "apps/gpu/SphereScaling/configPhoenix4GPU_regressionTest.txt"
\ No newline at end of file
diff --git a/regression-tests/multigpu_test/slurm8GPU.job b/regression-tests/multigpu_test/slurm8GPU.job
index bb7bf55c70eb6b178eff3f52e18c35d7cafd6938..0b97ce0cd17325f59d28c9fe0da92724201b1304 100755
--- a/regression-tests/multigpu_test/slurm8GPU.job
+++ b/regression-tests/multigpu_test/slurm8GPU.job
@@ -26,13 +26,13 @@ module list
 cd multigpu_test
 rm -rf build && mkdir -p build
 cd build
-cmake .. -DBUILD_VF_GPU=ON -DCMAKE_CUDA_ARCHITECTURES=60 -DUSER_APPS=apps/gpu/LBM/DrivenCavityMultiGPU\;apps/gpu/LBM/SphereScaling
+cmake .. -DBUILD_VF_GPU=ON -DCMAKE_CUDA_ARCHITECTURES=60 -DUSER_APPS=apps/gpu/DrivenCavityMultiGPU\;apps/gpu/SphereScaling
 make -j 16
 cd ..
 mkdir -p output
 
 echo $'\n\n\n\n---First test: DrivenCavityMultiGPU on 8 GPUs\n\n'
-mpirun -np 8 "./build/bin/DrivenCavityMultiGPU" "apps/gpu/LBM/DrivenCavityMultiGPU/configPhoenix8GPU_regressionTest.txt"
+mpirun -np 8 "./build/bin/DrivenCavityMultiGPU" "apps/gpu/DrivenCavityMultiGPU/configPhoenix8GPU_regressionTest.txt"
 
 echo $'\n\n\n\n---Second test: SphereScaling on 8 GPUs\n\n'
-mpirun -np 8 "./build/bin/SphereScaling"        "apps/gpu/LBM/SphereScaling/configPhoenix8GPU_regressionTest.txt"
\ No newline at end of file
+mpirun -np 8 "./build/bin/SphereScaling"        "apps/gpu/SphereScaling/configPhoenix8GPU_regressionTest.txt"
\ No newline at end of file
diff --git a/regression-tests/refined_sphere_in_channel_test.sh b/regression-tests/refined_sphere_in_channel_test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..51b6fa9481761f9727b4e4d7dc96945acae49265
--- /dev/null
+++ b/regression-tests/refined_sphere_in_channel_test.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+source ./regression-tests/__regression_test_executer.sh
+
+# 1. set reference data directory (must match the folder structure in https://github.com/irmb/test_data)
+REFERENCE_DATA_DIR=regression_tests/gpu/SphereInChannel_3Levels
+
+# 2. set cmake flags for the build of VirtualFluids
+CMAKE_FLAGS="--preset=make_gpu -DCMAKE_BUILD_TYPE=Release -DCMAKE_CUDA_ARCHITECTURES=75 -DUSER_APPS=apps/gpu/SphereRefined"
+
+# 3. define the application to be executed
+APPLICATION=./build/bin/SphereRefined
+
+# 4. set the path to the produced data
+RESULT_DATA_DIR=output/SphereRefined
+
+
+run_regression_test "$REFERENCE_DATA_DIR" "$CMAKE_FLAGS" "$APPLICATION" "$RESULT_DATA_DIR"
+
+# fieldcompare dir output/Sphere reference_data/regression_tests/gpu/SphereInChannel --include-files "*.vtu"
\ No newline at end of file
diff --git a/sonar-project.properties b/sonar-project.properties
index a25bb1af8070f0ea5b75f67e624211f38fef38bf..3448b44658ea84e7a89c59a06e0d0d687539f002 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -21,6 +21,8 @@ sonar.sourceEncoding=UTF-8
 
 sonar.cxx.coverage.reportPath=coverage/coverage.xml
 
+sonar.cxx.coverage.exclusions=./src/**/*Test.*
+
 sonar.cxx.cppcheck.reportPath=cppcheck.xml
 
 sonar.cxx.clangtidy.reportPath=build/clangtidy.txt
diff --git a/src/basics/writer/WbWriter.h b/src/basics/writer/WbWriter.h
index 55dceb7cb4a64dc90f0677796cab52135b726f56..dfb31c7f484f107bd860ea9244442810a06a2e59 100644
--- a/src/basics/writer/WbWriter.h
+++ b/src/basics/writer/WbWriter.h
@@ -40,6 +40,7 @@
 #include <string>
 #include <vector>
 
+#include <basics/DataTypes.h>
 #include <basics/utilities/UbException.h>
 #include <basics/utilities/UbSystem.h>
 #include <basics/utilities/UbTuple.h>
@@ -83,6 +84,16 @@ public:
     {
         throw UbException(UB_EXARGS, "not implemented for " + (std::string) typeid(*this).name());
     }
+    virtual std::string writePolyLines(const std::string & /*filename*/, real*  /*coordinatesX*/,
+                                                            real*  /*coordinatesY*/, real* /*coordinatesZ*/, uint  /*numberOfCoordinates*/)
+    {
+        throw UbException(UB_EXARGS, "not implemented for " + (std::string) typeid(*this).name());
+    }
+    virtual std::string writePolyLines(const std::string & /*filename*/, std::vector<real>&  /*coordinatesX*/,
+                                                            std::vector<real>&  /*coordinatesY*/,  std::vector<real>& /*coordinatesZ*/)
+    {
+        throw UbException(UB_EXARGS, "not implemented for " + (std::string) typeid(*this).name());
+    }
     virtual std::string writeLinesWithNodeData(const std::string & /*filename*/, std::vector<UbTupleFloat3> & /*nodes*/,
                                                std::vector<UbTupleInt2> & /*lines*/)
     {
diff --git a/src/basics/writer/WbWriterVtkXmlBinary.cpp b/src/basics/writer/WbWriterVtkXmlBinary.cpp
index 55c3541983ea4248512508146792832a34a1c563..748820e94052620283b8f9836058e96ad4f5bdd0 100644
--- a/src/basics/writer/WbWriterVtkXmlBinary.cpp
+++ b/src/basics/writer/WbWriterVtkXmlBinary.cpp
@@ -39,50 +39,78 @@
 
 using namespace std;
 
-/*===============================================================================*/
-const std::string WbWriterVtkXmlBinary::pvdEndTag = "   </Collection>\n</VTKFile>";
-/*===============================================================================*/
-string WbWriterVtkXmlBinary::writeCollection(const string &filename, const vector<string> &filenames,
-                                             const double &timeStep, const bool &sepGroups)
+ofstream createFileStream(const std::string &vtkFilename)
 {
-    string vtkfilename = filename + ".pvd";
-    ofstream out(vtkfilename.c_str());
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
+    ofstream outputFileStream(vtkFilename.c_str(), ios::out | ios::binary);
+    if (!outputFileStream) {
+        outputFileStream.clear();
+        const std::string path = UbSystem::getPathFromString(vtkFilename);
+        if (!path.empty()) {
             UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str());
+            outputFileStream.open(vtkFilename.c_str(), ios::out | ios::binary);
         }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
+        if (!outputFileStream) throw UbException(UB_EXARGS, "couldn't open file " + vtkFilename);
     }
+    return outputFileStream;
+}
 
-    string endian;
-    if (UbSystem::isLittleEndian())
-        endian = "LittleEndian";
-    else
-        endian = "BigEndian";
-    out << "<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"" << endian << "\" >" << endl;
-    out << "   <Collection>" << endl;
+void addCollectionHeader(std::ofstream &outputFileStream)
+{
+    std::string endian = UbSystem::isLittleEndian() ? "LittleEndian" : "BigEndian";
+    outputFileStream << "<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"" << endian << "\" >" << endl;
+    outputFileStream << "   <Collection>" << endl;
+}
 
+void addCollectionDatasetsForTimeStep(std::ofstream &outputFileStream, const vector<string> &filenames, double timeStep, bool separateGroups)
+{
     int group = 0, part = 0;
     for (size_t i = 0; i < filenames.size(); i++) {
-        out << "       <DataSet timestep=\"" << timeStep << "\" group=\"" << group << "\" part=\"" << part
-            << "\" file=\"" << filenames[i] << "\"/>" << endl;
-        if (sepGroups)
+        outputFileStream << "       <DataSet timestep=\"" << timeStep << "\" group=\"" << group << "\" part=\"" << part << "\" file=\"" << filenames[i] << "\"/>" << endl;
+        if (separateGroups)
             group++;
         else
             part++;
     }
-    out << pvdEndTag;
-    out.close();
+}
 
-    return vtkfilename;
+std::string getCollectionEndString()
+{
+    return "   </Collection>\n</VTKFile>";
+}
+
+void finalizeCollectionFile(std::ofstream &outputFileStream)
+{
+    outputFileStream << getCollectionEndString();
+    outputFileStream.close();
+}
+
+std::string WbWriterVtkXmlBinary::writeCollectionForTimeSeries(const std::string &filename,
+                                                               const std::map<uint, std::vector<std::string>> &filesNamesForTimeSteps, bool separateGroups) const
+{
+    std::string vtkFilename = filename + ".pvd";
+    ofstream out = createFileStream(vtkFilename);
+    addCollectionHeader(out);
+    for (auto [timeStep, filenames]: filesNamesForTimeSteps) {
+        addCollectionDatasetsForTimeStep(out, filenames, timeStep, separateGroups);
+    }
+    finalizeCollectionFile(out);
+    return vtkFilename;
+}
+
+string WbWriterVtkXmlBinary::writeCollection(const string &filename, const vector<string> &filenames,
+                                             const double &timeStep, const bool &separateGroups) const
+{
+    std::string vtkFilename = filename + ".pvd";
+    ofstream out = createFileStream(vtkFilename);
+    addCollectionHeader(out);
+    addCollectionDatasetsForTimeStep(out, filenames, timeStep, separateGroups);
+    finalizeCollectionFile(out);
+    return vtkFilename;
 }
+
 /*===============================================================================*/
 string WbWriterVtkXmlBinary::addFilesToCollection(const string &filename, const vector<string> &filenames,
-                                                  const double &timeStep, const bool &sepGroups)
+                                                  const double &timeStep, const bool &separateGroups) const
 {
     string vtkfilename = filename;
     fstream test(vtkfilename.c_str(), ios::in);
@@ -91,60 +119,51 @@ string WbWriterVtkXmlBinary::addFilesToCollection(const string &filename, const
         vtkfilename += ".pvd";
         test.open(vtkfilename.c_str(), ios::in);
         if (!test)
-            return this->writeCollection(filename, filenames, timeStep, sepGroups);
+            return this->writeCollection(filename, filenames, timeStep, separateGroups);
     }
 
     fstream out(vtkfilename.c_str(), ios::in | ios::out);
-    out.seekp(-(int)pvdEndTag.size() - 1, ios_base::end);
+    out.seekp(-(int)getCollectionEndString().size() - 1, ios_base::end);
 
     int group = 0;
     for (size_t i = 0; i < filenames.size(); i++) {
         out << "       <DataSet timestep=\"" << timeStep << "\" group=\"" << group << "\" part=\"" << i << "\" file=\""
             << filenames[i] << "\"/>" << endl;
-        if (sepGroups)
+        if (separateGroups)
             group++;
     }
-    out << pvdEndTag;
+    out <<  getCollectionEndString();
 
     return vtkfilename;
 }
 /*===============================================================================*/
 string WbWriterVtkXmlBinary::writeParallelFile(const string &filename, vector<string> &pieceSources,
-                                               vector<string> &pointDataNames, vector<string> &cellDataNames)
+                                               vector<string> &pointDataNames, vector<string> &cellDataNames) const
 {
     string vtkfilename = filename + ".pvtu";
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeParallelFile to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str());
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str());
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    std::ofstream out = createFileStream(vtkfilename);
 
     // VTK FILE
+    out << "<?xml version=\"1.0\"?>\n";
     out << "<VTKFile type=\"PUnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">"
         << "\n";
-    out << "  <PUnstructuredGrid GhostLevel=\"0\">"
+    out << "  <PUnstructuredGrid GhostLevel=\"1\">"
         << "\n";
-    out << "    <PPoints>\n";
-    out << "      <PDataArray type=\"Float32\" NumberOfComponents=\"3\"/>\n";
-    out << "    </PPoints>\n";
     out << "    <PPointData>\n";
     for (size_t s = 0; s < pointDataNames.size(); s++)
-        out << "      <PDataArray type=\"Float32\" Name=\"" << pointDataNames[s] << "\"/>\n";
+        out << "      <PDataArray type=\"Float64\" Name=\"" << pointDataNames[s] << "\"/>\n";
     out << "    </PPointData>\n";
     if (cellDataNames.size() > 0) {
         out << "    <PCellData>\n";
         for (size_t s = 0; s < cellDataNames.size(); s++)
-            out << "      <PDataArray type=\"Float32\" Name=\"" << cellDataNames[s] << "\"/>\n";
+            out << "      <PDataArray type=\"Float64\" Name=\"" << cellDataNames[s] << "\"/>\n";
         out << "    </PCellData>\n";
     }
+    out << "    <PPoints>\n";
+    out << "      <PDataArray type=\"Float32\" NumberOfComponents=\"3\"/>\n";
+    out << "    </PPoints>\n";
 
     for (size_t s = 0; s < pieceSources.size(); s++)
         out << "    <Piece Source=\"" << pieceSources[s] << "\"/>\n";
@@ -159,25 +178,6 @@ string WbWriterVtkXmlBinary::writeParallelFile(const string &filename, vector<st
 
 /*===============================================================================*/
 
-// helper functions
-
-ofstream createFileStream(std::string vtkfilename)
-{
-
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
-    return out;
-}
-
 void writeVtkHeader(ofstream &out, int numberOfNodes, int numberOfCells)
 {
     out << "<?xml version=\"1.0\"?>\n";
@@ -285,7 +285,7 @@ void writeCellData(ofstream &out, int bytesPerByteVal, int bytesScalarData, vect
     }
 }
 
-void writeEndOfFile(ofstream &out)
+void writeEndOfVtkFile(ofstream &out)
 {
     out << "\n</AppendedData>\n";
     out << "</VTKFile>";
@@ -322,12 +322,38 @@ string WbWriterVtkXmlBinary::writeLines(const string &filename, vector<UbTupleFl
     writeCellConnectivity(out, bytesPerByteVal, bytesCellConnectivity, lines);
     writeCellOffsets(out, bytesPerByteVal, bytesCellOffsets, nofCells);
     writeCellTypes(out, bytesPerByteVal, bytesCellTypes, nofCells);
-    writeEndOfFile(out);
+    writeEndOfVtkFile(out);
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeLines to " << vtkfilename << " - end");
 
     return vtkfilename;
 }
 
+/*===============================================================================*/
+std::string WbWriterVtkXmlBinary::writePolyLines(const std::string &filename,
+                                                 real *coordinatesX, real *coordinatesY, real *coordinatesZ,
+                                                 uint numberOfCoordinates)
+{
+    std::vector<UbTupleFloat3> nodes;
+    std::vector<UbTupleInt2> lines;
+
+    auto actualNodeNumber = 0;
+
+    for (uint i = 0; i < numberOfCoordinates - 1; i++) {
+        nodes.push_back(makeUbTuple(float(coordinatesX[i]), float(coordinatesY[i]), float(coordinatesZ[i])));
+        nodes.push_back(makeUbTuple(float(coordinatesX[i + 1]), float(coordinatesY[i + 1]), float(coordinatesZ[i + 1])));
+        lines.push_back(makeUbTuple(actualNodeNumber, actualNodeNumber + 1));
+        actualNodeNumber += 2;
+    }
+    return WbWriterVtkXmlBinary::writeLines(filename, nodes, lines);
+}
+
+std::string WbWriterVtkXmlBinary::writePolyLines(const std::string & filename, std::vector<real>& coordinatesX,
+                                                 std::vector<real>& coordinatesY,  std::vector<real>& coordinatesZ)
+{
+    return this->writePolyLines(filename, coordinatesX.data(), coordinatesY.data(), coordinatesZ.data(),
+                                                                       (uint)coordinatesX.size());
+}
+
 /*===============================================================================*/
 string WbWriterVtkXmlBinary::writeLinesWithLineData(const string &filename, vector<UbTupleFloat3> &nodes,
                                                     vector<UbTupleInt2> &lines, vector<string> &datanames,
@@ -361,7 +387,7 @@ string WbWriterVtkXmlBinary::writeLinesWithLineData(const string &filename, vect
     writeCellOffsets(out, bytesPerByteVal, bytesCellOffsets, nofCells);
     writeCellTypes(out, bytesPerByteVal, bytesCellTypes, nofCells);
     writeCellData(out, bytesPerByteVal, bytesScalarData, datanames, celldata);
-    writeEndOfFile(out);
+    writeEndOfVtkFile(out);
 
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeLinesWithLineData to " << vtkfilename << " - end");
 
@@ -493,17 +519,7 @@ string WbWriterVtkXmlBinary::writeTriangles(const string &filename, vector<UbTup
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeTriangles to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)triangles.size();
@@ -598,17 +614,7 @@ string WbWriterVtkXmlBinary::writeTrianglesWithNodeData(const string &filename,
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeTrianglesWithNodeData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -721,17 +727,7 @@ string WbWriterVtkXmlBinary::writeQuads(const string &filename, vector<UbTupleFl
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeQuads to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -826,17 +822,7 @@ string WbWriterVtkXmlBinary::writeQuadsWithNodeData(const string &filename, vect
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeQuadsWithNodeData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -951,17 +937,7 @@ string WbWriterVtkXmlBinary::writeQuadsWithCellData(const string &filename, vect
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeQuadsWithCellData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -1080,17 +1056,7 @@ string WbWriterVtkXmlBinary::writeQuadsWithNodeAndCellData(const string &filenam
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeQuadsWithNodeAndCellData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -1224,17 +1190,7 @@ string WbWriterVtkXmlBinary::writeOctsWithCellData(const string &filename, vecto
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeOctsWithCellData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -1353,17 +1309,7 @@ string WbWriterVtkXmlBinary::writeOctsWithNodeData(const string &filename, vecto
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeOctsWithNodeData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -1482,17 +1428,7 @@ string WbWriterVtkXmlBinary::writeOcts(const string &filename, vector<UbTupleFlo
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeOcts to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
     int nofCells = (int)cells.size();
@@ -1588,17 +1524,7 @@ std::string WbWriterVtkXmlBinary::writeNodes(const std::string &filename, std::v
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeNodes to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
 
@@ -1683,17 +1609,7 @@ std::string WbWriterVtkXmlBinary::writeNodesWithNodeData(const std::string &file
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlBinary::writeNodesWithNodeData to " << vtkfilename << " - start");
 
-    ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
-    if (!out) {
-        out.clear(); // flags ruecksetzen (ansonsten liefert utern if(!out) weiterhin true!!!
-        string path = UbSystem::getPathFromString(vtkfilename);
-        if (path.size() > 0) {
-            UbSystem::makeDirectory(path);
-            out.open(vtkfilename.c_str(), ios::out | ios::binary);
-        }
-        if (!out)
-            throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
-    }
+    ofstream out = createFileStream(vtkfilename);
 
     int nofNodes = (int)nodes.size();
 
diff --git a/src/basics/writer/WbWriterVtkXmlBinary.h b/src/basics/writer/WbWriterVtkXmlBinary.h
index 0f2c31eda81ad0c1975c9715ac1b7fb37a06339b..a1428aab86d7793b87966989b6b4b11787d70844 100644
--- a/src/basics/writer/WbWriterVtkXmlBinary.h
+++ b/src/basics/writer/WbWriterVtkXmlBinary.h
@@ -36,6 +36,7 @@
 #include <string>
 
 #include <basics/writer/WbWriter.h>
+#include <basics/DataTypes.h>
 
 #include "basics_export.h"
 
@@ -69,11 +70,13 @@ public:
 
     // write a metafile
     std::string writeCollection(const std::string &filename, const std::vector<std::string> &filenames,
-                                const double &timestep, const bool &sepGroups);
+                                const double &timeStep, const bool &separateGroups) const;
+    std::string writeCollectionForTimeSeries(const std::string &filename,
+                                             const std::map<uint, std::vector<std::string>> &filesNamesForTimeSteps, bool separateGroups) const;
     std::string addFilesToCollection(const std::string &filename, const std::vector<std::string> &filenames,
-                                     const double &timestep, const bool &sepGroups);
+                                     const double &timeStep, const bool &separateGroups) const;
     std::string writeParallelFile(const std::string &filename, std::vector<std::string> &pieceSources,
-                                  std::vector<std::string> &pointDataNames, std::vector<std::string> &cellDataNames);
+                                  std::vector<std::string> &pointDataNames, std::vector<std::string> &cellDataNames) const;
 
     //////////////////////////////////////////////////////////////////////////
     // nodes
@@ -88,6 +91,10 @@ public:
     // nodenumbering must start with 0!
     std::string writeLines(const std::string &filename, std::vector<UbTupleFloat3> &nodes,
                            std::vector<UbTupleInt2> &lines) override;
+    std::string writePolyLines(const std::string &filename, real* coordinatesX,
+                                                    real* coordinatesY, real*coordinatesZ, uint numberOfCoordinates) override;
+    std::string writePolyLines(const std::string & filename, std::vector<real>& coordinatesX,
+                                                    std::vector<real>& coordinatesY,  std::vector<real>& coordinatesZ) override;
     // std::string writeLinesWithNodeData(const std::string& filename,std::vector<UbTupleFloat3 >& nodes,
     // std::vector<UbTupleInt2 >& lines, std::vector< std::string >& datanames, std::vector< std::vector< double > >&
     // nodedata);
diff --git a/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.cpp b/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.cpp
index 56ef8bf9965b346772569ef99fc6e78d4f4cbe1b..20fb31cbf6e14c58ad092f6b8bd32e266c937787 100644
--- a/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.cpp
+++ b/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.cpp
@@ -14,7 +14,7 @@
 #include "fix_lb_coupling_onetoone.h"
 
 LiggghtsCouplingSimulationObserver::LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
-                                                         SPtr<vf::mpi::Communicator> comm,
+                                                         SPtr<vf::parallel::Communicator> comm,
                                                          LiggghtsCouplingWrapper &wrapper, int demSteps,
                                                          SPtr<LBMUnitConverter> units)
     : SimulationObserver(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units)
diff --git a/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.h b/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.h
index 0ae1786dd72346456621f3f4cf584679fca64f42..fb4938328b9d18e8cef614a09cbad8894c5aa497 100644
--- a/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.h
+++ b/src/cpu/LiggghtsCoupling/SimulationObserver/LiggghtsCouplingSimulationObserver.h
@@ -46,7 +46,7 @@
 
 
 class SimulationObserver;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class LiggghtsCouplingWrapper;
 class Grid3D;
 class Block3D;
@@ -61,7 +61,7 @@ struct ParticleData {
 class LiggghtsCouplingSimulationObserver : public SimulationObserver
 {
 public:
-    LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm,
+    LiggghtsCouplingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::parallel::Communicator> comm,
                                 LiggghtsCouplingWrapper &wrapper, int demSteps, SPtr<LBMUnitConverter> units);
     virtual ~LiggghtsCouplingSimulationObserver();
 
@@ -88,7 +88,7 @@ protected:
     void addTorque(int const partId, int const coord, double const value, double *torque);
 
 private:
-    SPtr<vf::mpi::Communicator> comm;
+    SPtr<vf::parallel::Communicator> comm;
     LiggghtsCouplingWrapper &wrapper;
     SPtr<LBMUnitConverter> units;
     int demSteps;
diff --git a/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
index adc6a4f81f77cc57a4030643517cc583b61b3c7d..820c84855c66c695423beec09d1ccfa3953dc4e9 100644
--- a/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
+++ b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.cpp
@@ -39,7 +39,7 @@
 
 #include "BCArray3D.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "LBMUnitConverter.h"
@@ -53,7 +53,7 @@ WriteMultiphaseQuantitiesSimulationObserver::WriteMultiphaseQuantitiesSimulation
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
-                                                                             std::shared_ptr<vf::mpi::Communicator> comm)
+                                                                             std::shared_ptr<vf::parallel::Communicator> comm)
         : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
diff --git a/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
index 452a06d3bbb23943995f42ce84d712aa3c01b6a4..e5ba399ad57155c332cc2cd8520c51c8e86c441c 100644
--- a/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
+++ b/src/cpu/MultiphaseFlow/SimulationObservers/WriteMultiphaseQuantitiesSimulationObserver.h
@@ -42,7 +42,7 @@
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class LBMUnitConverter;
@@ -63,7 +63,7 @@ public:
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
     WriteMultiphaseQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteMultiphaseQuantitiesSimulationObserver() override = default;
 
     void update(real step) override;
@@ -90,7 +90,7 @@ private:
     int minInitLevel;
     int maxInitLevel;
     int gridRank;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
     real gradX1_phi(const real *const &);
     real gradX2_phi(const real *const &);
diff --git a/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.cpp b/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.cpp
index 64ef23bcffb2d9b5478b1f57590d7d297ab08f52..7a0ae87b6cb3674557af510089548d7352913cc6 100644
--- a/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.cpp
+++ b/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.cpp
@@ -39,7 +39,7 @@
 
 #include "BCArray3D.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "LBMUnitConverter.h"
@@ -52,7 +52,7 @@ WriteSharpInterfaceQuantitiesSimulationObserver::WriteSharpInterfaceQuantitiesSi
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
-                                                                             std::shared_ptr<vf::mpi::Communicator> comm)
+                                                                             std::shared_ptr<vf::parallel::Communicator> comm)
         : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
diff --git a/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.h b/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.h
index 8c1e6347862a80cf25ab26a99b1304c731e2e2ee..bf42cbfa46b8c6b080da16b1732bd242674e48c5 100644
--- a/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.h
+++ b/src/cpu/MultiphaseFlow/SimulationObservers/WriteSharpInterfaceQuantitiesSimulationObserver.h
@@ -42,7 +42,7 @@
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class LBMUnitConverter;
@@ -63,7 +63,7 @@ public:
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
     WriteSharpInterfaceQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteSharpInterfaceQuantitiesSimulationObserver() override = default;
 
     void update(double step) override;
@@ -90,7 +90,7 @@ private:
     int minInitLevel;
     int maxInitLevel;
     int gridRank;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
     real gradX1_phi(const real *const &);
     real gradX2_phi(const real *const &);
diff --git a/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp
index 82adf2f0e2e59a36e4585d42d9baadb4e793f55f..7ed670deb9619565e9c11d18041cc522485ba2f6 100644
--- a/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.cpp
@@ -1,7 +1,7 @@
 #include "CalculateTorqueSimulationObserver.h"
 #include "BCSet.h"
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27Interactor.h"
 #include "UbScheduler.h"
 #include "Grid3D.h"
@@ -14,7 +14,7 @@
 #include "DistributionArray3D.h"
 #include "NonNewtonianFluids/LBM/Rheology.h"
 
-CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
+CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::parallel::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
 {
    if (comm->getProcessID() == comm->getRoot())
    {
diff --git a/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h
index d0cd9c41d5afc4e127f9be74e106960c86097f96..e1948d95f69daa795fe8ea5e1733b5b8be1f2754 100644
--- a/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h
@@ -17,7 +17,7 @@
 #include "D3Q27System.h"
 
 class ForceCalculator;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class D3Q27Interactor;
@@ -29,7 +29,7 @@ class CalculateTorqueSimulationObserver: public SimulationObserver
 {
 public:
    //! Constructor
-   CalculateTorqueSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+   CalculateTorqueSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
 	virtual ~CalculateTorqueSimulationObserver();             
 	void update(real step); 
    void addInteractor(SPtr<D3Q27Interactor> interactor);
@@ -42,7 +42,7 @@ protected:
 
 private:
    std::string path;
-   std::shared_ptr<vf::mpi::Communicator> comm;
+   std::shared_ptr<vf::parallel::Communicator> comm;
    std::vector<SPtr<D3Q27Interactor> > interactors;
    real torqueX1global;
    real torqueX2global;
diff --git a/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
index 61f13299d914bb3fd15a8d0a69712c722c91ca6f..bc3eab4fb93581a0184d96cddbd5542fa358e8ee 100644
--- a/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.cpp
@@ -49,7 +49,7 @@ using namespace std;
 
 WriteThixotropyQuantitiesSimulationObserver::WriteThixotropyQuantitiesSimulationObserver() = 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) : SimulationObserver(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::parallel::Communicator> comm) : SimulationObserver(grid, s), path(path), writer(writer),	conv(conv),	comm(comm)
 {
 	gridRank = comm->getProcessID();
 	minInitLevel = this->grid->getCoarsestInitializedLevel();
diff --git a/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
index 3ac9664e595adef9b45edaee662849a3ab63616f..5ef994a08fe36812361903fb02e83be510faa13e 100644
--- a/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
+++ b/src/cpu/NonNewtonianFluids/SimulationObservers/WriteThixotropyQuantitiesSimulationObserver.h
@@ -38,14 +38,14 @@
 #include "Grid3D.h"
 #include "Block3D.h"
 #include "LBMUnitConverter.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "WbWriter.h"
 
 class WriteThixotropyQuantitiesSimulationObserver : public  SimulationObserver
 {
 public:
 	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(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::parallel::Communicator> comm);
 	~WriteThixotropyQuantitiesSimulationObserver() = default;
 
    void update(real step) override;
@@ -69,7 +69,7 @@ private:
    int minInitLevel;
    int maxInitLevel;
    int gridRank;
-   std::shared_ptr<vf::mpi::Communicator> comm;
+   std::shared_ptr<vf::parallel::Communicator> comm;
 //	double ConcentrationSum;
 };
 #endif
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index aead82d5dfc4c8565ef4abe03351b085722db2ad..81beddf3e059cf76d507d2c20113732945bc5efa 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -40,9 +40,9 @@
 #include <omp.h>
 #endif
 
-#include <mpi/Communicator.h>
-#include <mpi/MPICommunicator.h>
-#include <mpi/NullCommunicator.h>
+#include <parallel/Communicator.h>
+#include <parallel/MPICommunicator.h>
+#include <parallel/NullCommunicator.h>
 
 #include <basics/PointerDefinitions.h>
 
diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt
index aae663e80011c117a83d5a52d0ac0cbe0c59a5a8..3e767e49c6cc0d35c2c8706a20b77f17a625b9a4 100644
--- a/src/cpu/VirtualFluidsCore/CMakeLists.txt
+++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt
@@ -20,7 +20,7 @@ if(BUILD_USE_OPENMP)
     list(APPEND VF_LIBRARIES OpenMP::OpenMP_CXX)
 endif()
 
-vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser ${VF_LIBRARIES} PRIVATE_LINK lbm mpi logger)
+vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser ${VF_LIBRARIES} parallel PRIVATE_LINK lbm logger)
 
 vf_add_tests()
 
diff --git a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
index 38e5be2e5d35a51f79cb1da8ff7ce9b8b5589656..159d04d9791dd5919e43752f6f8cf9ea97ca1dac 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
@@ -34,7 +34,7 @@
 #include "InteractorsHelper.h"
 
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "SetBcBlocksBlockVisitor.h"
 #include "SetSolidBlocksBlockVisitor.h"
 #include <Grid3D.h>
@@ -100,6 +100,6 @@ void InteractorsHelper::updateGrid()
         ids.push_back(block->getGlobalID());
 
     std::vector<int> rids;
-    vf::mpi::Communicator::getInstance()->allGather(ids, rids);
+    vf::parallel::Communicator::getInstance()->allGather(ids, rids);
     grid->deleteBlocks(rids);
 }
diff --git a/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.cpp b/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.cpp
index eef54a8625147046c2d8f38e2207e2fe2d20e325..718267be635c95e53d4cd1076e2cefee90fc492b 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.cpp
+++ b/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.cpp
@@ -1,3 +1,3 @@
 #include "BlocksDistributor.h"
 
-BlocksDistributor::BlocksDistributor(SPtr<Grid3D> grid, std::shared_ptr<vf::mpi::Communicator> comm) : grid(grid), comm(comm) {}
+BlocksDistributor::BlocksDistributor(SPtr<Grid3D> grid, std::shared_ptr<vf::parallel::Communicator> comm) : grid(grid), comm(comm) {}
diff --git a/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.h b/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.h
index 85aa52d05e0dd215ac93ca4bb08cc057f84914d0..7db87d0885f53b9651f401f9cbf9502b606efd68 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.h
+++ b/src/cpu/VirtualFluidsCore/Parallel/BlocksDistributor.h
@@ -1,7 +1,7 @@
 #ifndef BlocksDistributor_H
 #define BlocksDistributor_H
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 
 #include <PointerDefinitions.h>
@@ -9,13 +9,13 @@
 class BlocksDistributor
 {
 public:
-    BlocksDistributor(SPtr<Grid3D> grid, std::shared_ptr<vf::mpi::Communicator> comm);
+    BlocksDistributor(SPtr<Grid3D> grid, std::shared_ptr<vf::parallel::Communicator> comm);
     ~BlocksDistributor();
 
 protected:
 private:
     SPtr<Grid3D> grid;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Simulation/Grid3D.cpp b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.cpp
index ed467597f473119fe1569fe2d198507ac0744909..2cf8a4824c6d7f30bb2b1593ba96da3d952924ad 100644
--- a/src/cpu/VirtualFluidsCore/Simulation/Grid3D.cpp
+++ b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.cpp
@@ -51,7 +51,7 @@ using namespace std;
 
 Grid3D::Grid3D() { levelSet.resize(D3Q27System::MAXLEVEL + 1); }
 //////////////////////////////////////////////////////////////////////////
-Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm)
+Grid3D::Grid3D(std::shared_ptr<vf::parallel::Communicator> comm)
 
 {
     levelSet.resize(D3Q27System::MAXLEVEL + 1);
@@ -59,7 +59,7 @@ Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm)
     rank = comm->getProcessID();
 }
 //////////////////////////////////////////////////////////////////////////
-Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm, int blockNx1, int blockNx2, int blockNx3, int gridNx1, int gridNx2, int gridNx3)
+Grid3D::Grid3D(std::shared_ptr<vf::parallel::Communicator> comm, int blockNx1, int blockNx2, int blockNx3, int gridNx1, int gridNx2, int gridNx3)
     :
 
       blockNx1(blockNx1), blockNx2(blockNx2), blockNx3(blockNx2), nx1(gridNx1), nx2(gridNx2), nx3(gridNx3)
@@ -2317,7 +2317,7 @@ void Grid3D::renumberBlockIDs()
 
 
 //////////////////////////////////////////////////////////////////////////
-void Grid3D::updateDistributedBlocks(std::shared_ptr<vf::mpi::Communicator> comm)
+void Grid3D::updateDistributedBlocks(std::shared_ptr<vf::parallel::Communicator> comm)
 {
 
     std::vector<int> blocks;
diff --git a/src/cpu/VirtualFluidsCore/Simulation/Grid3D.h b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.h
index 821adff473961fafa00be08ca2cf8e2339353b51..50f3ac53a27ca634f6a27a06f5af2ad1a5208884 100644
--- a/src/cpu/VirtualFluidsCore/Simulation/Grid3D.h
+++ b/src/cpu/VirtualFluidsCore/Simulation/Grid3D.h
@@ -48,7 +48,7 @@ class CoordinateTransformation3D;
 #include <Block3DVisitor.h>
 #include <Grid3DVisitor.h>
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Block3D;
 class Interactor3D;
 
@@ -65,8 +65,8 @@ public:
 
 public:
     Grid3D();
-    Grid3D(std::shared_ptr<vf::mpi::Communicator> comm);
-    Grid3D(std::shared_ptr<vf::mpi::Communicator> comm, int blockNx1, int blockNx2, int blockNx3, int gridNx1, int gridNx2, int gridNx3);
+    Grid3D(std::shared_ptr<vf::parallel::Communicator> comm);
+    Grid3D(std::shared_ptr<vf::parallel::Communicator> comm, int blockNx1, int blockNx2, int blockNx3, int gridNx1, int gridNx2, int gridNx3);
     virtual ~Grid3D() = default;
     //////////////////////////////////////////////////////////////////////////
     // blocks control
@@ -95,7 +95,7 @@ public:
     BlockIDMap &getBlockIDs();
     void deleteBlockIDs();
     void renumberBlockIDs();
-    void updateDistributedBlocks(std::shared_ptr<vf::mpi::Communicator> comm);
+    void updateDistributedBlocks(std::shared_ptr<vf::parallel::Communicator> comm);
     SPtr<Block3D> getSuperBlock(SPtr<Block3D> block);
     SPtr<Block3D> getSuperBlock(int ix1, int ix2, int ix3, int level);
     void getSubBlocks(SPtr<Block3D> block, int levelDepth, std::vector<SPtr<Block3D>> &blocks);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
index 3d6feaf15c6555cec3141c7bcc48d9a94db9c91c..d062f8395ed5d3c26867ef2fc0c1bac1e5f7e7f3 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.cpp
@@ -6,7 +6,7 @@
 
 #include <fstream>
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "IntegrateValuesHelper.h"
 #include "UbScheduler.h"
@@ -14,7 +14,7 @@
 
 AdjustForcingSimulationObserver::AdjustForcingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
                                                    SPtr<IntegrateValuesHelper> integrateValues, real vTarged,
-                                                   std::shared_ptr<vf::mpi::Communicator> comm)
+                                                   std::shared_ptr<vf::parallel::Communicator> comm)
 
     : SimulationObserver(grid, s), path(path), integrateValues(integrateValues), comm(comm), vx1Targed(vTarged)
 {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
index 9e570e34dc43fa025c47c3d3c29c0dad4a262b99..13f88c71162efcca53b913891955b6216b3c943f 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AdjustForcingSimulationObserver.h
@@ -7,7 +7,7 @@
 #include "SimulationObserver.h"
 #include "lbm/constants/D3Q27.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class UbScheduler;
 class Grid3D;
 class IntegrateValuesHelper;
@@ -22,7 +22,7 @@ class AdjustForcingSimulationObserver : public SimulationObserver
 {
 public:
     AdjustForcingSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                             SPtr<IntegrateValuesHelper> integrateValues, real vTarged, std::shared_ptr<vf::mpi::Communicator> comm);
+                             SPtr<IntegrateValuesHelper> integrateValues, real vTarged, std::shared_ptr<vf::parallel::Communicator> comm);
     //!< calls collect PostprocessData
     void update(real step) override;
 
@@ -31,7 +31,7 @@ protected:
     SPtr<IntegrateValuesHelper> integrateValues;
     //!< compares velocity in integrateValues with target velocity and adjusts forcing accordingly.
     void collectData(real step);
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
 private:
     real vx1Targed; //!< target velocity.
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
index 6213f5713c281b18dd516d304cd47f0d3195f9f3..3724569eb1acd4a96076205a07a7ae393e4924dc 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/AverageValuesSimulationObserver.cpp
@@ -7,7 +7,7 @@
 
 #include "BCArray3D.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "UbScheduler.h"
@@ -189,7 +189,7 @@ void AverageValuesSimulationObserver::collectData(real step)
     piece           = subfolder + "/" + piece;
 
     vector<string> cellDataNames;
-    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
+    std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::Communicator::getInstance();
     vector<string> pieces   = comm->gather(piece);
     if (comm->getProcessID() == comm->getRoot()) {
         string pname =
@@ -453,7 +453,7 @@ void AverageValuesSimulationObserver::calculateAverageValues(real timeStep)
 ////////////////////////////////////////////////////////////////////////////
 // void AverageValuesSimulationObserver::initPlotData(double step)
 //{
-//   std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
+//   std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::Communicator::getInstance();
 //	if (comm->getProcessID() == comm->getRoot())
 //	{
 //		std::ofstream ostr;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
index 3b501424f1426b99a341906fbc3d3b638204ce20..cfda41094095255a1b263a0f00ce607e8715bbab 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.cpp
@@ -4,7 +4,7 @@
 #include "BCArray3D.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27Interactor.h"
 #include "DataSet3D.h"
 #include "DistributionArray3D.h"
@@ -14,7 +14,7 @@
 #include "UbScheduler.h"
 
 CalculateForcesSimulationObserver::CalculateForcesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                       std::shared_ptr<vf::mpi::Communicator> comm, real v, real a)
+                                                       std::shared_ptr<vf::parallel::Communicator> comm, real v, real a)
     : SimulationObserver(grid, s), path(path), comm(comm), v(v), a(a), forceX1global(0), forceX2global(0), forceX3global(0)
 {
     if (comm->getProcessID() == comm->getRoot()) {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
index 02b76e77bc6bfb3ee375e79465f2d548226189cb..e1d376f4c6938b3874cd2a0eebedae294bd502b1 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateForcesSimulationObserver.h
@@ -17,7 +17,7 @@
 #include "lbm/constants/D3Q27.h"
 
 class ForceCalculator;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class D3Q27Interactor;
@@ -30,7 +30,7 @@ public:
     //! Constructor
     //! \param v - velocity of fluid in LB units
     //! \param a - area of object in LB units
-    CalculateForcesSimulationObserver(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::parallel::Communicator> comm,
                                real v, real a);
     ~CalculateForcesSimulationObserver() override;
     void update(real step) override;
@@ -46,7 +46,7 @@ protected:
 
 private:
     std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     std::vector<SPtr<D3Q27Interactor>> interactors;
     real forceX1global;
     real forceX2global;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
index 09409ccf11dfb38c5b615f05a667701444d6f208..01521d043986c3223b87096bcb4898cba1809438 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/CalculateTorqueSimulationObserver.cpp
@@ -1,7 +1,7 @@
 #include "NonNewtonianFluids/SimulationObservers/CalculateTorqueSimulationObserver.h"
 #include "BCSet.h"
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27Interactor.h"
 #include "UbScheduler.h"
 #include "Grid3D.h"
@@ -14,7 +14,7 @@
 #include "DistributionArray3D.h"
 #include "NonNewtonianFluids/LBM/Rheology.h"
 
-CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
+CalculateTorqueSimulationObserver::CalculateTorqueSimulationObserver( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::parallel::Communicator> comm) : SimulationObserver(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
 {
    if (comm->getProcessID() == comm->getRoot())
    {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
index 0754491767b55e2a6059c8eef160a94a1f087540..ffbfde51ce2d8100cc845364e31038180892f800 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.cpp
@@ -10,13 +10,13 @@
 #include <vector>
 
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "LBMKernel.h"
 #include "UbScheduler.h"
 
 DecreaseViscositySimulationObserver::DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc,
-                                                           std::shared_ptr<vf::mpi::Communicator> comm)
+                                                           std::shared_ptr<vf::parallel::Communicator> comm)
 
     : SimulationObserver(grid, s), nueFunc(nueFunc), comm(comm)
 {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
index 2e2c655d223619169e0f3edd3bfa554e924639e0..741b65783c2634d45f6d012f67e1f42283b22d9c 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/DecreaseViscositySimulationObserver.h
@@ -11,7 +11,7 @@
 
 class UbScheduler;
 class Grid3D;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 
 //! \brief The class sets viscosity/collision factor according to a previously defined function in time.
 //! \details initialization in test case (example):
@@ -28,7 +28,7 @@ namespace vf::mpi {class Communicator;}
 class DecreaseViscositySimulationObserver : public SimulationObserver
 {
 public:
-    DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc, std::shared_ptr<vf::mpi::Communicator> comm);
+    DecreaseViscositySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, mu::Parser *nueFunc, std::shared_ptr<vf::parallel::Communicator> comm);
     ~DecreaseViscositySimulationObserver() override;
     //! calls collect PostprocessData.
     void update(real step) override;
@@ -36,7 +36,7 @@ public:
 protected:
     //! resets the collision factor depending on the current timestep.
     void setViscosity(real step);
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
 private:
     mutable mu::value_type timeStep;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
index a6826a713b45f74239c603d9a23b946169ac60d5..ea6287ff358bce160791c7ab16568a9cc4a989bb 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.cpp
@@ -1,5 +1,5 @@
 #include "EmergencyExitSimulationObserver.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "MPIIORestartSimulationObserver.h"
 #include "UbLogger.h"
@@ -8,7 +8,7 @@
 #include <basics/utilities/UbFileOutputASCII.h>
 
 EmergencyExitSimulationObserver::EmergencyExitSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                   SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::mpi::Communicator> comm)
+                                                   SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), rp(rp), comm(comm)
 {
     this->path = path + "/exit";
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
index f4a8e79f6f8b89f1b4e37714f0c42d2be4be1810..f2757d8ed842f14d77b16b7d1aa2821e5a8b8d72 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/EmergencyExitSimulationObserver.h
@@ -14,7 +14,7 @@
 #include "SimulationObserver.h"
 
 class MPIIORestartSimulationObserver;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
@@ -22,7 +22,7 @@ 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);
+                             SPtr<MPIIORestartSimulationObserver> rp, std::shared_ptr<vf::parallel::Communicator> comm);
     ~EmergencyExitSimulationObserver() override;
 
     void update(real step) override;
@@ -35,7 +35,7 @@ protected:
 
 private:
     std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     SPtr<MPIIORestartSimulationObserver> rp;
     std::string metafile;
 };
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
index 25e0e30a5e0c0d5789284df71b6f550da6856006..e3f0816589c4ef758f897b92c25d721ac8837abe 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.cpp
@@ -4,13 +4,13 @@
 #include "BCArray3D.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27Interactor.h"
 #include "DataSet3D.h"
 #include "DistributionArray3D.h"
 #include "LBMKernel.h"
 
-ForceCalculator::ForceCalculator(std::shared_ptr<vf::mpi::Communicator> comm)
+ForceCalculator::ForceCalculator(std::shared_ptr<vf::parallel::Communicator> comm)
     : comm(comm), forceX1global(0), forceX2global(0), forceX3global(0)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
index 03b00f3603c3e8aac25567b7f370e81b61d3ef76..6f7266d8e49a0f1e9cce4192712b37f1306ff5e0 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ForceCalculator.h
@@ -15,14 +15,14 @@
 #include "Vector3D.h"
 
 class D3Q27Interactor;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class DistributionArray3D;
 class BoundaryConditions;
 
 class ForceCalculator
 {
 public:
-    ForceCalculator(std::shared_ptr<vf::mpi::Communicator> comm);
+    ForceCalculator(std::shared_ptr<vf::parallel::Communicator> comm);
     virtual ~ForceCalculator();
 
     void calculateForces(std::vector<std::shared_ptr<D3Q27Interactor>> interactors);
@@ -35,7 +35,7 @@ public:
 private:
     void gatherGlobalForces();
 
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
     real forceX1global;
     real forceX2global;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
index 4e8fd6d5f39fbeb581ace18bf544fa5346719850..07a27f074c7ac9cc9850db90f94fec19687fa4cb 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituCatalystSimulationObserver.cpp
@@ -20,7 +20,7 @@ InSituCatalystSimulationObserver::InSituCatalystSimulationObserver() {}
 InSituCatalystSimulationObserver::InSituCatalystSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, std::string script)
     : SimulationObserver(grid, s)
 {
-    gridRank     = vf::mpi::Communicator::getInstance()->getProcessID();
+    gridRank     = vf::parallel::Communicator::getInstance()->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
     maxInitLevel = this->grid->getFinestInitializedLevel();
 
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
index 74c1b653bd4f8b5f2def3492f83fa38677170feb..2dbdcb6373e24a57ebeafe6243db4ccaa083e932 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/InSituVTKSimulationObserver.cpp
@@ -30,7 +30,7 @@ InSituVTKSimulationObserver::InSituVTKSimulationObserver(SPtr<Grid3D> grid, SPtr
                                            SPtr<LBMUnitConverter> conv)
     : SimulationObserver(grid, s), conv(conv)
 {
-    gridRank     = vf::mpi::Communicator::getInstance()->getProcessID();
+    gridRank     = vf::parallel::Communicator::getInstance()->getProcessID();
     minInitLevel = this->grid->getCoarsestInitializedLevel();
     maxInitLevel = this->grid->getFinestInitializedLevel();
 
@@ -269,7 +269,7 @@ void InSituVTKSimulationObserver::readConfigFile(const std::string &configFile)
     string dummy;
     int wRank = 0;
     getline(ifs, dummy);
-    int np = vf::mpi::Communicator::getInstance()->getNumberOfProcesses();
+    int np = vf::parallel::Communicator::getInstance()->getNumberOfProcesses();
 
     while (ifs.good()) {
         getline(ifs, dummy, ';');
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
index 720cb28091cd04ac4723a1997d73ec485c62b3cd..a2d35b6b2883f54b799cc2e5b6aacd1ece5c08bc 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.cpp
@@ -10,7 +10,7 @@
 #include "LBMKernel.h"
 
 //////////////////////////////////////////////////////////////////////////
-IntegrateValuesHelper::IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::mpi::Communicator> comm, real minX1, real minX2,
+IntegrateValuesHelper::IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::parallel::Communicator> comm, real minX1, real minX2,
                                              real minX3, real maxX1, real maxX2, real maxX3)
     :
 
@@ -21,7 +21,7 @@ IntegrateValuesHelper::IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<
     init(-1);
 }
 //////////////////////////////////////////////////////////////////////////
-IntegrateValuesHelper::IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::mpi::Communicator> comm, real minX1, real minX2,
+IntegrateValuesHelper::IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::parallel::Communicator> comm, real minX1, real minX2,
                                              real minX3, real maxX1, real maxX2, real maxX3, int level)
     :
 
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
index c804d74628570c4592c6715b7f76cd450c90ecfb..6404ca7bfab37599c6c833b53798f9048c5e265b 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/IntegrateValuesHelper.h
@@ -5,7 +5,7 @@
 
 #include "Block3D.h"
 #include "CbArray2D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27System.h"
 #include "GbCuboid3D.h"
 #include "Grid3D.h"
@@ -36,9 +36,9 @@ public:
     };
 
 public:
-    IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::mpi::Communicator> comm, real minX1, real minX2, real minX3,
+    IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::parallel::Communicator> comm, real minX1, real minX2, real minX3,
                           real maxX1, real maxX2, real maxX3);
-    IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::mpi::Communicator> comm, real minX1, real minX2, real minX3,
+    IntegrateValuesHelper(SPtr<Grid3D> grid, std::shared_ptr<vf::parallel::Communicator> comm, real minX1, real minX2, real minX3,
                           real maxX1, real maxX2, real maxX3, int level);
     virtual ~IntegrateValuesHelper();
 
@@ -77,7 +77,7 @@ private:
     real sAvVx1, sAvVx2, sAvVx3, sTSx1, sTSx2, sTSx3, sTSx1x3;
     std::vector<CalcNodes> cnodes;
     GbCuboid3DPtr boundingBox;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     CbArray2D<Node> cnodes2DMatrix;
     enum Values { AvVx = 0, AvVy = 1, AvVz = 2, AvVxx = 3, AvVyy = 4, AvVzz = 5, AvVxy = 6, AvVyz = 7, AvVxz = 8 };
 };
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
index 75350fb6e0904c434519a241228d7662c84ecf22..e312bf2b27aa15b51146aab9559c201ed88bbd7e 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.cpp
@@ -3,7 +3,7 @@
 #include "WbWriterVtkXmlASCII.h"
 
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "CompressibleCumulantLBMKernel.h"
 #include "CoordinateTransformation3D.h"
 #include "DataSet3D.h"
@@ -13,7 +13,7 @@
 #include "UbScheduler.h"
 
 LineTimeSeriesSimulationObserver::LineTimeSeriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                     SPtr<GbLine3D> line, int level, std::shared_ptr<vf::mpi::Communicator> comm)
+                                                     SPtr<GbLine3D> line, int level, std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), length(0), ix1(0), ix2(0), ix3(0), level(level), line(line)
 {
     root  = comm->isRoot();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
index 0f8a9ab44ac60e16708be7453e65809ec0505155..db4fea82f2aecfd87a4c90cdea36cc310b73aabe 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/LineTimeSeriesSimulationObserver.h
@@ -9,7 +9,7 @@
 #include "SimulationObserver.h"
 #include "LBMSystem.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class GbLine3D;
@@ -27,7 +27,7 @@ public:
 
 public:
     LineTimeSeriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<GbLine3D> line,
-                              int level, std::shared_ptr<vf::mpi::Communicator> comm);
+                              int level, std::shared_ptr<vf::parallel::Communicator> comm);
     ~LineTimeSeriesSimulationObserver() override = default;
 
     void update(real step) override;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
index c6bed523e5cf319b1cfced74cffed3b93265f0f4..456c92eb08414655764bcd41f90c6f1973aa4fc8 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.cpp
@@ -3,7 +3,7 @@
 #include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "CoordinateTransformation3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "D3Q27System.h"
@@ -25,7 +25,7 @@ using namespace MPIIODataStructures;
 #define MESSAGE_TAG 80
 #define SEND_BLOCK_SIZE 100000
 
-MPIIOMigrationBESimulationObserver::MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+MPIIOMigrationBESimulationObserver::MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm)
     : MPIIOSimulationObserver(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
index fa55ea17a350ec9a1de215892258526142f6d19b..cec360a7300e07909c0b5b6bc14a7969f8686264 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationBESimulationObserver.h
@@ -10,7 +10,7 @@
 
 class Grid3D;
 class UbScheduler;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class BCSet;
 class LBMKernel;
 class Grid3DVisitor;
@@ -33,7 +33,7 @@ class MPIIOMigrationBESimulationObserver : public MPIIOSimulationObserver
 
 public:
     MPIIOMigrationBESimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path,
-                                std::shared_ptr<vf::mpi::Communicator> comm);
+                                std::shared_ptr<vf::parallel::Communicator> comm);
     ~MPIIOMigrationBESimulationObserver() override;
     //! Each timestep writes the grid into the files
     void update(real step) override;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
index 9fcc3c9b8ba84fa6322a7e5d9ed5974912707e68..590a2812be5ad2a211200023dc14da17ecae1619 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.cpp
@@ -3,7 +3,7 @@
 #include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "CoordinateTransformation3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "D3Q27System.h"
@@ -22,7 +22,7 @@
 
 using namespace MPIIODataStructures;
 
-MPIIOMigrationSimulationObserver::MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+MPIIOMigrationSimulationObserver::MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm)
     : MPIIOSimulationObserver(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
index 7466e02a204e60060848f5b09d59a766387b9fff..4e7d1ba44644cef527a623ea8b94cb28ac9474ac 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOMigrationSimulationObserver.h
@@ -9,7 +9,7 @@
 
 class Grid3D;
 class UbScheduler;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class BCSet;
 class LBMKernel;
 class Grid3DVisitor;
@@ -31,7 +31,7 @@ public:
         PressureField       = 9
     };
 
-    MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    MPIIOMigrationSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
     ~MPIIOMigrationSimulationObserver() override;
     //! Each timestep writes the grid into the files
     void update(real step) override;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
index fd73d61608733b7782d2970fc90085b10864ed2f..07a63a48bee9d81d467af672c290a7528008a7eb 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.cpp
@@ -3,7 +3,7 @@
 #include "BCSet.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "CoordinateTransformation3D.h"
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "D3Q27System.h"
@@ -25,7 +25,7 @@
 
 using namespace MPIIODataStructures;
 
-MPIIORestartSimulationObserver::MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+MPIIORestartSimulationObserver::MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm)
     : MPIIOSimulationObserver(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
index 5681d9886e3a6f9a4b8d1cf1b8d32e9970fb8855..d07bf6b77b8a4f56da0d4a6c88139f4d01bca104 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIORestartSimulationObserver.h
@@ -11,7 +11,7 @@
 
 class Grid3D;
 class UbScheduler;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class BCSet;
 class LBMKernel;
 
@@ -32,7 +32,7 @@ public:
         PressureField = 9
     };
 
-    MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    MPIIORestartSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
     ~MPIIORestartSimulationObserver() override;
     //! Each timestep writes the grid into the files
     void update(real step) override;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
index adb47a75a2fbd7fc0e8242ef9b013f6324ae066b..19ea0482a1528a2c8a0e64d4d9f7c85e1a8ed612 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.cpp
@@ -1,6 +1,6 @@
 #include "MPIIOSimulationObserver.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "CoordinateTransformation3D.h"
 #include "Grid3D.h"
 #include "MPIIODataStructures.h"
@@ -13,7 +13,7 @@
 using namespace MPIIODataStructures;
 
 MPIIOSimulationObserver::MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                   std::shared_ptr<vf::mpi::Communicator> comm)
+                                   std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), comm(comm)
 {
     UbSystem::makeDirectory(path + "/mpi_io_cp");
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
index c04938a71e62db4753689ad35160a7f980c0c0cb..9ecaf89a74d2f42db7d35349b27389f0f1cfc796 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MPIIOSimulationObserver.h
@@ -8,14 +8,14 @@
 
 class Grid3D;
 class UbScheduler;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 
 //! \class MPIWriteBlocksBESimulationObserver
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
 class MPIIOSimulationObserver : public SimulationObserver
 {
 public:
-    MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    MPIIOSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
     ~MPIIOSimulationObserver() override;
 
     //! Each timestep writes the grid into the files
@@ -37,7 +37,7 @@ public:
 
 protected:
     std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     MPI_Datatype gridParamType, block3dType, dataSetParamType, boundCondType, arrayPresenceType;
 };
 #endif // ! _MPIIOSimulationObserver_H_
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
index 2979c841c9c07e44b5a22998897d5665c67b51dc..10749b5130e387205f01e57f4c71c90c90f46e02 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.cpp
@@ -2,7 +2,7 @@
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27System.h"
 #include "DataSet3D.h"
 #include "DistributionArray3D.h"
@@ -13,7 +13,7 @@
 #include <sstream>
 
 MicrophoneArraySimulationObserver::MicrophoneArraySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                       std::shared_ptr<vf::mpi::Communicator> comm)
+                                                       std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), comm(comm)
 {
     count = 0;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
index e87954fa2902df3c27833729869a70abac348508..f95b435ba8b784c9e7d25ac80399239460144c9b 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/MicrophoneArraySimulationObserver.h
@@ -8,7 +8,7 @@
 #include <string>
 #include <vector>
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class Vector3D;
@@ -23,7 +23,7 @@ class MicrophoneArraySimulationObserver : public SimulationObserver
 {
 public:
     MicrophoneArraySimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                               std::shared_ptr<vf::mpi::Communicator> comm);
+                               std::shared_ptr<vf::parallel::Communicator> comm);
     ~MicrophoneArraySimulationObserver() override;
 
     //! calls collectData.
@@ -38,7 +38,7 @@ protected:
 
 private:
     std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
     struct Mic {
         unsigned int id;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
index 3bd0bd6f888e64da0db8f492c872c4b15a518b4a..81d7217c4b848ae3a6510fc1920c7621ee71c0aa 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.cpp
@@ -33,12 +33,12 @@
 
 #include "NUPSCounterSimulationObserver.h"
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
 NUPSCounterSimulationObserver::NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads,
-                                               std::shared_ptr<vf::mpi::Communicator> comm)
+                                               std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), numOfThreads(numOfThreads), nup(0), nup_t(0), nupsStep(0.0), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
index fdce1c4d67519b6d0a109e3cbd13e23b69d0fb19..f0585bbdb911e3dd33262d1a790a10b97da789de 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/NUPSCounterSimulationObserver.h
@@ -39,7 +39,7 @@
 #include "SimulationObserver.h"
 #include "basics/utilities/UbTiming.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
@@ -54,7 +54,7 @@ public:
     //! \param s is UbScheduler object for scheduling of observer
     //! \param numOfThreads is number of threads
     //! \param comm is Communicator object
-    NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads, std::shared_ptr<vf::mpi::Communicator> comm);
+    NUPSCounterSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, int numOfThreads, std::shared_ptr<vf::parallel::Communicator> comm);
     ~NUPSCounterSimulationObserver() override;
 
     void update(real step) override;
@@ -70,7 +70,7 @@ protected:
     real nup;
     real nup_t;
     real nupsStep;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
index 7c9cd4b85e1404339b2c180bef93eafedff38c23..f36997c05dc92970b743a57d1fc9b79f92a2df51 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.cpp
@@ -4,7 +4,7 @@
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27Interactor.h"
 #include "DataSet3D.h"
 #include "GbCuboid3D.h"
@@ -14,7 +14,7 @@
 
 PressureCoefficientSimulationObserver::PressureCoefficientSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                GbCuboid3DPtr plane, const std::string &path,
-                                                               std::shared_ptr<vf::mpi::Communicator> comm)
+                                                               std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), plane(plane), path(path), comm(comm)
 {
     maxStep       = scheduler->getMaxEnd();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
index bfb56a65dd31fd6f434462471c6a236340b05db0..16e14af6420c5b1f634bb3f7988ba9c3f8595881 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureCoefficientSimulationObserver.h
@@ -11,7 +11,7 @@
 
 class GbCuboid3D;
 class D3Q27Interactor;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 
@@ -19,7 +19,7 @@ class PressureCoefficientSimulationObserver : public SimulationObserver
 {
 public:
     PressureCoefficientSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<GbCuboid3D> plane,
-                                   const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+                                   const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
     ~PressureCoefficientSimulationObserver() override;
 
     void update(real step) override;
@@ -35,7 +35,7 @@ protected:
 private:
     SPtr<GbCuboid3D> plane;
     std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     std::vector<SPtr<D3Q27Interactor>> interactors;
     int numberOfSteps;
     real maxStep;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
index ac786be093d161a4da1450d5f7ffca8e4c7e5358..3576349e3ac9b9f421c4dbf7476a5869a0fb9930 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.cpp
@@ -9,7 +9,7 @@
 
 #include <fstream>
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "IntegrateValuesHelper.h"
 #include "LBMUnitConverter.h"
@@ -18,7 +18,7 @@
 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)
+                                                             real uReal, real uLB, std::shared_ptr<vf::parallel::Communicator> comm)
 
     : SimulationObserver(grid, s), path(path), h1(h1), h2(h2), comm(comm)
 {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
index 35356d25f9fa941500188fc75850d1bb7c8f86fb..df9d5364bf68921ebf1c567f0cdfd4c4ed76a92a 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/PressureDifferenceSimulationObserver.h
@@ -14,7 +14,7 @@
 #include "SimulationObserver.h"
 #include "LBMSystem.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class LBMUnitConverter;
@@ -26,7 +26,7 @@ public:
     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);
+                                  /*const SPtr<LBMUnitConverter> conv,*/ std::shared_ptr<vf::parallel::Communicator> comm);
     ~PressureDifferenceSimulationObserver() override;
 
     void update(real step) override;
@@ -36,7 +36,7 @@ protected:
     std::string path;
     SPtr<LBMUnitConverter> conv;
     void collectData(real step);
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     real factor1; //= (1/3)*rhoReal*(uReal/uLB)^2 for calculation pReal = rhoLB * (1/3)*rhoReal*(uReal/uLB)^2,
                      //rhoReal and uReal in SI
     real factor2; //= rhoReal*(uReal/uLB)^2       for calculation pReal = press * rhoReal*(uReal/uLB)^2, rhoReal and
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
index d0e50585a473b58780ba5e4372fc87e0524ca7a4..ccd4025235dd636b0654ea14ad307f3a256c58a9 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.cpp
@@ -7,11 +7,11 @@
 #include "basics/writer/WbWriterVtkXmlASCII.h"
 
 #include "BCArray3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "UbScheduler.h"
 
 QCriterionSimulationObserver::QCriterionSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
-                                             SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm)
+                                             SPtr<UbScheduler> s, std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), comm(comm), writer(writer)
 {
     init();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
index 1d5aec23f9d4af9d9e232dd215fbde060a7c6f7c..45eddf04a2b838cfa52a64b10fd5fb4cfed88c29 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/QCriterionSimulationObserver.h
@@ -13,7 +13,7 @@
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
@@ -29,7 +29,7 @@ class QCriterionSimulationObserver : public SimulationObserver
 {
 public:
     QCriterionSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer, SPtr<UbScheduler> s,
-                          std::shared_ptr<vf::mpi::Communicator> comm);
+                          std::shared_ptr<vf::parallel::Communicator> comm);
     //! Make update if timestep is write-timestep specified in SPtr<UbScheduler> s
     void update(real step) override;
 
@@ -58,7 +58,7 @@ private:
     int gridRank; // comm-Rank des aktuellen prozesses
     std::string path;
     WbWriter *writer;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     enum Values { xdir = 0, ydir = 1, zdir = 2 }; // labels for the different components
 };
 
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
index fa566d21aaff03689be1d7b8dfb8848a76eaca07..4e2e0111b70bd2b257bfe11a3f7fee64655d5c12 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/ShearStressSimulationObserver.cpp
@@ -4,7 +4,7 @@
 
 #include "BCArray3D.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27Interactor.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
@@ -16,9 +16,7 @@ ShearStressSimulationObserver::ShearStressSimulationObserver(SPtr<Grid3D> grid,
                                                SPtr<UbScheduler> s, SPtr<UbScheduler> rs)
     : SimulationObserver(grid, s), Resetscheduler(rs), path(path), writer(writer)
 {
-    using namespace vf::basics::constant; 
-
-    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
+    std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::Communicator::getInstance();
     normals.push_back(0);
     normals.push_back(0);
     normals.push_back(1);
@@ -64,7 +62,7 @@ void ShearStressSimulationObserver::collectData(real step)
 
     // vector<string> cellDataNames;
 
-    // std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
+    // std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::Communicator::getInstance();
     // vector<string> pieces = comm->gatherStrings(piece);
     // if (comm->getProcessID() == comm->getRoot())
     //{
@@ -96,7 +94,7 @@ void ShearStressSimulationObserver::collectData(real step)
     piece           = subfolder + "/" + piece;
 
     vector<string> cellDataNames;
-    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::Communicator::getInstance();
+    std::shared_ptr<vf::parallel::Communicator> comm = vf::parallel::Communicator::getInstance();
     vector<string> pieces   = comm->gather(piece);
     if (comm->getProcessID() == comm->getRoot()) {
         string pname =
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
index e71e0a1f211ef7703010f24ec5bac99b78233110..7f915be1a931fb61a4c59ab9d20677f4d3be97ad 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.cpp
@@ -4,7 +4,7 @@
 #include "LBMKernel.h"
 
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "UbScheduler.h"
@@ -16,7 +16,7 @@ TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver() = d
 //////////////////////////////////////////////////////////////////////////
 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::shared_ptr<vf::parallel::Communicator> comm, int options)
     : SimulationObserver(grid, s), path(path), writer(writer), comm(comm), options(options)
 {
     init();
@@ -26,7 +26,7 @@ TimeAveragedValuesSimulationObserver::TimeAveragedValuesSimulationObserver(SPtr<
 //////////////////////////////////////////////////////////////////////////
 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::shared_ptr<vf::parallel::Communicator> comm, int options,
                                                              std::vector<int> levels, std::vector<real> &levelCoords,
                                                              std::vector<real> &bounds, bool timeAveraging)
     : SimulationObserver(grid, s), path(path), writer(writer), comm(comm), options(options), levels(levels),
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
index 14a1f6354aa57ca588361299caf7a1d336001f9e..a9f78137b8452f476dc37f8dfac711c9a414e889 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeAveragedValuesSimulationObserver.h
@@ -9,7 +9,7 @@
 #include "IntegrateValuesHelper.h"
 #include "LBMSystem.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
@@ -41,9 +41,9 @@ public:
 public:
     TimeAveragedValuesSimulationObserver();
     TimeAveragedValuesSimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
-                                  SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm, int options);
+                                  SPtr<UbScheduler> s, std::shared_ptr<vf::parallel::Communicator> comm, int options);
     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,
+                                  SPtr<UbScheduler> s, std::shared_ptr<vf::parallel::Communicator> comm, int options, std::vector<int> levels,
                                   std::vector<real> &levelCoords, std::vector<real> &bounds,
                                   bool timeAveraging = true);
     //! Make update
@@ -70,7 +70,7 @@ protected:
     void calculateAverageValuesForPlane(std::vector<IntegrateValuesHelper::CalcNodes> &cnodes);
 
 private:
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     std::vector<UbTupleFloat3> nodes;
     std::vector<UbTupleUInt8> cells;
     std::vector<std::string> datanames;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
index e0560e2767b70dcc51db08f807a29e467efa6a2d..5245c51d9cb8b01324388d5cbfc61db5dc5ce5a1 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.cpp
@@ -9,14 +9,14 @@
 
 #include <fstream>
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "IntegrateValuesHelper.h"
 #include "LBMUnitConverter.h"
 #include "UbScheduler.h"
 
 TimeseriesSimulationObserver::TimeseriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
-                                             const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+                                             const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), h1(h1), path(path), comm(comm)
 {
     if (comm->getProcessID() == comm->getRoot()) {
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
index db41bd2ecea38ac86e97740310ba9501f94caa4a..d467b2301688d716ffb0b879fd8d0fab7353b077 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TimeseriesSimulationObserver.h
@@ -13,7 +13,7 @@
 
 #include "SimulationObserver.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class IntegrateValuesHelper;
@@ -27,7 +27,7 @@ class TimeseriesSimulationObserver : public SimulationObserver
 {
 public:
     TimeseriesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<IntegrateValuesHelper> h1,
-                          const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+                          const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
     ~TimeseriesSimulationObserver() override;
 
     //! calls collectData.
@@ -38,7 +38,7 @@ protected:
 
     //! object that can compute spacial average values in 3D-subdomain.
     SPtr<IntegrateValuesHelper> h1;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
 private:
     std::string path; //! output filename, e.g.  pathname + "/steps/timeseries"
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
index 47b865ed7b80fd1c420d59fa54144d5afa1471f5..d5a0ccb593488f4e992fef0fc7591c0672fc24ed 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.cpp
@@ -3,7 +3,7 @@
 #include "BCArray3D.h"
 #include "BCSet.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "LBMKernel.h"
@@ -14,7 +14,7 @@
 
 TurbulenceIntensitySimulationObserver::TurbulenceIntensitySimulationObserver(SPtr<Grid3D> grid, const std::string &path,
                                                                WbWriter *const writer, SPtr<UbScheduler> s,
-                                                               std::shared_ptr<vf::mpi::Communicator> comm)
+                                                               std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), comm(comm), writer(writer)
 {
     init();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
index c615bbda5cb58a522e6853fcf3f8475bc3320b52..cffaf49ede459093bae2e0709da27a244f74ad5a 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/TurbulenceIntensitySimulationObserver.h
@@ -8,7 +8,7 @@
 #include "SimulationObserver.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
@@ -18,7 +18,7 @@ class TurbulenceIntensitySimulationObserver : public SimulationObserver
 {
 public:
     TurbulenceIntensitySimulationObserver(SPtr<Grid3D> grid, const std::string &path, WbWriter *const writer,
-                                   SPtr<UbScheduler> s, std::shared_ptr<vf::mpi::Communicator> comm);
+                                   SPtr<UbScheduler> s, std::shared_ptr<vf::parallel::Communicator> comm);
     void update(real step) override;
 
 protected:
@@ -39,7 +39,7 @@ private:
     int gridRank;
     std::string path;
     WbWriter *writer;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     enum Values { AvVx = 0, AvVy = 1, AvVz = 2, AvVxxyyzz = 3 };
 };
 #endif
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
index fd983bd02bd0bf3a7ae0cd0af96b2f169180f31b..15a1c39cf268659d8cc8dec4b7633636049a019d 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.cpp
@@ -36,13 +36,13 @@
 #include <logger/Logger.h>
 
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27System.h"
 #include "Grid3D.h"
 #include "UbScheduler.h"
 
 WriteBlocksSimulationObserver::WriteBlocksSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                               WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm)
+                                               WbWriter *const writer, std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
index 805605b64564272c6a327545a4b01bc89926da38..636dc9f18d9b232f0a777232b3d69f26a545a477 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBlocksSimulationObserver.h
@@ -39,7 +39,7 @@
 
 #include "SimulationObserver.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
@@ -57,7 +57,7 @@ public:
     //! \param writer is WbWriter object
     //! \param comm is Communicator object
     WriteBlocksSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
-                           std::shared_ptr<vf::mpi::Communicator> comm);
+                           std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteBlocksSimulationObserver() override;
 
     void update(real step) override;
@@ -69,7 +69,7 @@ protected:
 
     std::string path;
     WbWriter *writer;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
index 8bbe4cc9599df7fcb0c0af42d5ae3d2929e4ba20..3154cc815d24915769d63ac5c222c82b340162b9 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.cpp
@@ -42,7 +42,7 @@
 #include "BCArray3D.h"
 #include "Block3D.h"
 #include "CbArray3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3D.h"
 #include "LBMUnitConverter.h"
 #include "UbScheduler.h"
@@ -55,7 +55,7 @@ WriteBoundaryConditionsSimulationObserver::WriteBoundaryConditionsSimulationObse
 //////////////////////////////////////////////////////////////////////////
 WriteBoundaryConditionsSimulationObserver::WriteBoundaryConditionsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
                                                                        const std::string &path, WbWriter *const writer,
-                                                                       std::shared_ptr<vf::mpi::Communicator> comm)
+                                                                       std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
     gridRank     = comm->getProcessID();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
index ad5b20df942748e065cebe926ba346581b9bf30b..aff7893432dfbd99f9ceae5d407e26c39e16304d 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteBoundaryConditionsSimulationObserver.h
@@ -41,7 +41,7 @@
 #include "SimulationObserver.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
@@ -61,7 +61,7 @@ public:
     //! \param writer is WbWriter object
     //! \param comm is Communicator object
     WriteBoundaryConditionsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                       WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm);
+                                       WbWriter *const writer, std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteBoundaryConditionsSimulationObserver() override = default;
 
     void update(real step) override;
@@ -84,6 +84,6 @@ private:
     int minInitLevel;
     int maxInitLevel;
     int gridRank;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 #endif
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
index 62178444f92abffebe8ce5d2ad1bd8a1f54960f0..7ad8c2dc113e2b5b8f9aba6e173efc3dd6817f05 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.cpp
@@ -1,5 +1,5 @@
 #include "WriteGbObjectsSimulationObserver.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "GbObject3D.h"
 #include "UbScheduler.h"
 #include "WbWriterVtkXmlASCII.h"
@@ -7,7 +7,7 @@
 #include <vector>
 
 WriteGbObjectsSimulationObserver::WriteGbObjectsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                                     WbWriter *const writer, std::shared_ptr<vf::mpi::Communicator> comm)
+                                                     WbWriter *const writer, std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), path(path), writer(writer), comm(comm)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
index 50f88c65ddbf87bb9960f2be61e380e9ad2d570b..44e466ee95713675dd507643c8fa0b7194b0f612 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteGbObjectsSimulationObserver.h
@@ -7,7 +7,7 @@
 #include <vector>
 
 class GbObject3D;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class WbWriter;
@@ -21,7 +21,7 @@ class WriteGbObjectsSimulationObserver : public SimulationObserver
 {
 public:
     WriteGbObjectsSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, WbWriter *const writer,
-                              std::shared_ptr<vf::mpi::Communicator> comm);
+                              std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteGbObjectsSimulationObserver() override;
     //! calls collectData.
     void update(real step) override;
@@ -35,7 +35,7 @@ private:
     std::vector<SPtr<GbObject3D>> objects;
     std::string path;
     WbWriter *writer;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 
 #endif // WriteGbObjectsSimulationObserver_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
index caf1e8c1ed2d4c43a219e1fd7a09b3a96e0e2370..945058c8e94b2d7780c4a03444c0848267b4b8f7 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.cpp
@@ -6,7 +6,7 @@
 
 #include "BCArray3D.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "GbObject3D.h"
 #include "Grid3D.h"
@@ -19,7 +19,7 @@ WriteMQFromSelectionSimulationObserver::WriteMQFromSelectionSimulationObserver()
 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)
+                                                                 std::shared_ptr<vf::parallel::Communicator> comm)
     : SimulationObserver(grid, s), gbObject(gbObject), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank     = comm->getProcessID();
@@ -80,7 +80,7 @@ void WriteMQFromSelectionSimulationObserver::collectData(real step)
     piece                = subfolder + "/" + piece;
 
     std::vector<std::string> cellDataNames;
-    std::shared_ptr<vf::mpi::Communicator> comm         = vf::mpi::Communicator::getInstance();
+    std::shared_ptr<vf::parallel::Communicator> comm         = vf::parallel::Communicator::getInstance();
     std::vector<std::string> pieces = comm->gather(piece);
     if (comm->getProcessID() == comm->getRoot()) {
         std::string pname =
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
index e91fc369e1ddb33af68629d6aab75cf5b3756290..107d49720faed3f4fb1e5478b2bb75047f48ddb5 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMQFromSelectionSimulationObserver.h
@@ -10,7 +10,7 @@
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class LBMUnitConverter;
@@ -24,7 +24,7 @@ public:
     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);
+                                    std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteMQFromSelectionSimulationObserver() override = default;
 
     void update(real step) override;
@@ -47,7 +47,7 @@ private:
     int minInitLevel;
     int maxInitLevel;
     int gridRank;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     SPtr<GbObject3D> gbObject;
 
     using CalcMacrosFct = void (*)(const real *const &, real &, real &, real &, real &);
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
index 142bcc52b053f0be71c8a1ca41eaf0dfeaf24f1b..f098a21f536ba9ee1c8786007fe5ef272fb674af 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.cpp
@@ -52,7 +52,7 @@ WriteMacroscopicQuantitiesPlusMassSimulationObserver::WriteMacroscopicQuantities
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
-                                                                             std::shared_ptr<vf::mpi::Communicator> comm)
+                                                                             std::shared_ptr<vf::parallel::Communicator> comm)
         : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
index ce6946528269adec3374dff655991b4a8cb0aaf7..ee892f41a597325fc1d6cfb5515d5f333e94cf21 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesPlusMassSimulationObserver.h
@@ -42,7 +42,7 @@
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class LBMUnitConverter;
@@ -63,7 +63,7 @@ public:
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
     WriteMacroscopicQuantitiesPlusMassSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteMacroscopicQuantitiesPlusMassSimulationObserver() override = default;
 
     void update(real step) override;
@@ -90,7 +90,7 @@ private:
     int minInitLevel;
     int maxInitLevel;
     int gridRank;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
     using CalcMacrosFct = void (*)(const real *const &, real &, real &, real &, real &);
     CalcMacrosFct calcMacros;
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
index b87b5cfcfc5b10b3fc97d54b135a745c811f9e0e..d5c80b4df56bc303361572e9114ab57efe995ecc 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.cpp
@@ -39,7 +39,7 @@
 
 #include "BCArray3D.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "LBMUnitConverter.h"
@@ -52,7 +52,7 @@ WriteMacroscopicQuantitiesSimulationObserver::WriteMacroscopicQuantitiesSimulati
                                                                              const std::string &path,
                                                                              WbWriter *const writer,
                                                                              SPtr<LBMUnitConverter> conv,
-                                                                             std::shared_ptr<vf::mpi::Communicator> comm)
+                                                                             std::shared_ptr<vf::parallel::Communicator> comm)
         : SimulationObserver(grid, s), path(path), writer(writer), conv(conv), comm(comm)
 {
     gridRank = comm->getProcessID();
diff --git a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
index 85de0336487a71774d63c86f4c6ba1b65b15fe2a..279f9dfba3cc41c0a06ef4cc66b06e6b841f4259 100644
--- a/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
+++ b/src/cpu/VirtualFluidsCore/SimulationObservers/WriteMacroscopicQuantitiesSimulationObserver.h
@@ -42,7 +42,7 @@
 #include "LBMSystem.h"
 #include "UbTuple.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class UbScheduler;
 class LBMUnitConverter;
@@ -63,7 +63,7 @@ public:
     //! \param conv is LBMUnitConverter object
     //! \param comm is Communicator object
     WriteMacroscopicQuantitiesSimulationObserver(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
-                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::parallel::Communicator> comm);
     ~WriteMacroscopicQuantitiesSimulationObserver() override = default;
 
     void update(real step) override;
@@ -90,7 +90,7 @@ private:
     int minInitLevel;
     int maxInitLevel;
     int gridRank;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 
     using CalcMacrosFct = void (*)(const real *const &, real &, real &, real &, real &);
     CalcMacrosFct calcMacros;
diff --git a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
index 358dabf437fb69325a905d968e8dc6547127fd8f..0f41364ad614cf8ffb511461d713336e58fd0d1c 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
+++ b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.cpp
@@ -1,7 +1,7 @@
 #include "CheckpointConverter.h"
 #include "Block3D.h"
 #include "BoundaryConditions.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "CoordinateTransformation3D.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
@@ -12,7 +12,7 @@
 
 using namespace MPIIODataStructures;
 
-CheckpointConverter::CheckpointConverter(SPtr<Grid3D> grid, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+CheckpointConverter::CheckpointConverter(SPtr<Grid3D> grid, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm)
     : grid(grid), path(path), comm(comm)
 {
     UbSystem::makeDirectory(path + "/mpi_io_cp");
diff --git a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
index bab67ae662c10e31158b47e1725788dc38794560..a2902b366cc1c4c06ccdc0513ed329757f22a558 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
+++ b/src/cpu/VirtualFluidsCore/Utilities/CheckpointConverter.h
@@ -8,14 +8,14 @@
 #include <vector>
 
 class Grid3D;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 
 //! \class UtilConvertor
 //! \brief Converts timestep data from MPIIORestartSimulationObserver format into MPIIOMigrationSimulationObserver format
 class CheckpointConverter
 {
 public:
-    CheckpointConverter(SPtr<Grid3D> grid, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    CheckpointConverter(SPtr<Grid3D> grid, const std::string &path, std::shared_ptr<vf::parallel::Communicator> comm);
     virtual ~CheckpointConverter();
 
     void convert(int step, int procCount);
@@ -26,7 +26,7 @@ public:
 
 protected:
     std::string path;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     SPtr<Grid3D> grid;
 
 private:
diff --git a/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.cpp
index b931cbbbda004f7b2057943222d4523c5fb0916b..35816e3d5770ebfba348ad29e9a45ba0e0d72910 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.cpp
@@ -50,7 +50,7 @@ CreateTransmittersHelper::CreateTransmittersHelper() = default;
 //////////////////////////////////////////////////////////////////////////
 void CreateTransmittersHelper::createTransmitters(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir, IBlock ib,
                                                   TransmitterPtr &sender, TransmitterPtr &receiver,
-                                                  std::shared_ptr<vf::mpi::Communicator> comm, TransmitterType tType)
+                                                  std::shared_ptr<vf::parallel::Communicator> comm, TransmitterType tType)
 {
     // SourceBlock
     int srcLevel = sblock->getLevel();
diff --git a/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.h b/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.h
index af60de0a2e2b9e06488df3011584b8448594bf85..1a52078fa081b17ffc7e30c8f3cb154e9d698657 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/CreateTransmittersHelper.h
@@ -35,7 +35,7 @@
 #define CREATETRANSMITTERSHELPER_H
 
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 
 #include "LBMSystem.h"
 
@@ -61,7 +61,7 @@ public:
 public:
     CreateTransmittersHelper();
     void createTransmitters(const SPtr<Block3D> sblock, const SPtr<Block3D> tblock, int dir, IBlock ib,
-                            TransmitterPtr &sender, TransmitterPtr &receiver, std::shared_ptr<vf::mpi::Communicator> comm,
+                            TransmitterPtr &sender, TransmitterPtr &receiver, std::shared_ptr<vf::parallel::Communicator> comm,
                             TransmitterType tType);
 
 protected:
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp
index 1e62e0a2c35367fb6189822bcdbf96b611d75bb9..30708d664deb405954f95a4aac58cd6c01d17153 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp
@@ -2,14 +2,14 @@
 
 #include "MetisPartitioningGridVisitor.h"
 #include "Block3D.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "D3Q27System.h"
 #include "Grid3D.h"
 #include <cmath>
 
 using namespace std;
 
-MetisPartitioningGridVisitor::MetisPartitioningGridVisitor(std::shared_ptr<vf::mpi::Communicator> comm, GraphType graphType, int numOfDirs,
+MetisPartitioningGridVisitor::MetisPartitioningGridVisitor(std::shared_ptr<vf::parallel::Communicator> comm, GraphType graphType, int numOfDirs,
                                                            MetisPartitioner::PartType partType, bool threads,
                                                            int numberOfThreads)
     : Grid3DVisitor(), numberOfThreads(numberOfThreads), numOfDirs(numOfDirs), comm(comm), threads(threads),
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.h
index c270d3ce389cc2697c1ac54178984ffa2f4d07a9..d4e29060932b61abeaa68d03e3e0fd566d45a927 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.h
@@ -9,7 +9,7 @@
 #include "Grid3DVisitor.h"
 #include "MetisPartitioner.h"
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 
 ////////////////////////////////////////////////////////////////////////
 //! \brief The class implements domain decomposition with METIS library
@@ -32,7 +32,7 @@ public:
     //! \param numOfDirs - maximum number of neighbors for each process
     //! \param threads - on/off decomposition for threads
     //! \param numberOfThreads - number of threads
-    MetisPartitioningGridVisitor(std::shared_ptr<vf::mpi::Communicator> comm, GraphType graphType, int numOfDirs,
+    MetisPartitioningGridVisitor(std::shared_ptr<vf::parallel::Communicator> comm, GraphType graphType, int numOfDirs,
                                  MetisPartitioner::PartType partType = MetisPartitioner::KWAY, bool threads = false,
                                  int numberOfThreads = 0);
     ~MetisPartitioningGridVisitor() override;
@@ -52,7 +52,7 @@ protected:
     int numOfDirs;
     std::vector<int> blockID;
     std::vector<idx_t> parts;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     int bundleRoot;
     int processRoot;
     int bundleID;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp
index a73965641237c804cd094f399e582336e6be8e04..b2eefc859d26ef92d43bb7701a1eb96e6a7a6f4a 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp
@@ -1,5 +1,5 @@
 #include "RefineAroundGbObjectHelper.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "OverlapBlockVisitor.h"
 #include "RatioBlockVisitor.h"
 #include "RatioSmoothBlockVisitor.h"
@@ -11,7 +11,7 @@
 RefineAroundGbObjectHelper::RefineAroundGbObjectHelper(SPtr<Grid3D> grid, int refineLevel,
                                                        SPtr<D3Q27TriFaceMeshInteractor> objectIter,
                                                        real startDistance, real stopDistance,
-                                                       std::shared_ptr<vf::mpi::Communicator> comm)
+                                                       std::shared_ptr<vf::parallel::Communicator> comm)
     : grid(grid), refineLevel(refineLevel), objectIter(objectIter), startDistance(startDistance),
       stopDistance(stopDistance), comm(comm)
 {
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.h b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.h
index 76874ce767294efa318bb7e8b9f8b4d2e2a348eb..c5cc4d6fc426566770bdfbfd4637f32e1ecd411d 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.h
@@ -5,7 +5,7 @@
 #include "lbm/constants/D3Q27.h"
 
 class Grid3D;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class D3Q27TriFaceMeshInteractor;
 
 //! \brief Refine blocks on base of bounding boxes.
@@ -21,7 +21,7 @@ public:
     //! \param startDistance start distance from geometry for refinement
     //! \param stopDistance stop distance from geometry for refinement
     RefineAroundGbObjectHelper(SPtr<Grid3D> grid, int maxRefineLevel, SPtr<D3Q27TriFaceMeshInteractor> objectIter,
-                               real startDistance, real stopDistance, std::shared_ptr<vf::mpi::Communicator> comm);
+                               real startDistance, real stopDistance, std::shared_ptr<vf::parallel::Communicator> comm);
     virtual ~RefineAroundGbObjectHelper();
     //! start refinement
     void refine();
@@ -31,7 +31,7 @@ private:
     SPtr<D3Q27TriFaceMeshInteractor> objectIter;
     int refineLevel;
     real startDistance, stopDistance;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp
index 52c7c3ac1204a96fe7db3089ef2eb3ecc93ac143..f11e8e5ce1bc04af79775be7bfdd14201febbc3f 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp
@@ -1,6 +1,6 @@
 #include "RefineCrossAndInsideGbObjectHelper.h"
 #include "CheckRatioBlockVisitor.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "OverlapBlockVisitor.h"
 #include "RatioBlockVisitor.h"
 #include "RatioSmoothBlockVisitor.h"
@@ -11,7 +11,7 @@
 #include <Grid3D.h>
 
 RefineCrossAndInsideGbObjectHelper::RefineCrossAndInsideGbObjectHelper(SPtr<Grid3D> grid, int maxRefineLevel,
-                                                                       std::shared_ptr<vf::mpi::Communicator> comm)
+                                                                       std::shared_ptr<vf::parallel::Communicator> comm)
     : grid(grid), maxRefineLevel(maxRefineLevel), comm(comm)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.h b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.h
index d0a9ac44891519b3fd583f98a56e33dfd1e42122..28caf212afa50d8d07979e137c863f9554543adf 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.h
@@ -4,7 +4,7 @@
 #include <PointerDefinitions.h>
 #include <vector>
 
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Grid3D;
 class GbObject3D;
 
@@ -17,7 +17,7 @@ public:
     //! Constructor
     //! \param grid a smart pointer to the grid object
     //! \param maxRefineLevel an integer for maximal refinement level
-    RefineCrossAndInsideGbObjectHelper(SPtr<Grid3D> grid, int maxRefineLevel, std::shared_ptr<vf::mpi::Communicator> comm);
+    RefineCrossAndInsideGbObjectHelper(SPtr<Grid3D> grid, int maxRefineLevel, std::shared_ptr<vf::parallel::Communicator> comm);
     virtual ~RefineCrossAndInsideGbObjectHelper();
     //! add geometric object
     //! \param object a smart pointer to bounding box
@@ -31,7 +31,7 @@ private:
     std::vector<SPtr<GbObject3D>> objects;
     std::vector<int> levels;
     int maxRefineLevel;
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp
index ed9a3ee59c87ab755416eecd5468a4cc763837e4..a21b8b8a61575eedbacdc76fdd55ef89c4318173 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp
@@ -4,7 +4,7 @@
 #include "D3Q27System.h"
 //#include <mpi.h>
 
-RenumberGridVisitor::RenumberGridVisitor(std::shared_ptr<vf::mpi::Communicator> com) : comm(com) {}
+RenumberGridVisitor::RenumberGridVisitor(std::shared_ptr<vf::parallel::Communicator> com) : comm(com) {}
 
 //////////////////////////////////////////////////////////////////////////
 void RenumberGridVisitor::visit(SPtr<Grid3D> grid)
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.h
index 993bccd1034d0fb648c2e05d77da380916816967..aa56b469107dc2be3332622b747e0c0f3e3b9fe7 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.h
@@ -8,7 +8,7 @@
 #ifndef RenumberGridVisitor_h
 #define RenumberGridVisitor_h
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3DVisitor.h"
 
 class Grid3D;
@@ -19,14 +19,14 @@ class Grid3D;
 class RenumberGridVisitor : public Grid3DVisitor
 {
 public:
-    RenumberGridVisitor(std::shared_ptr<vf::mpi::Communicator> com);
+    RenumberGridVisitor(std::shared_ptr<vf::parallel::Communicator> com);
 
     ~RenumberGridVisitor() override = default;
 
     void visit(SPtr<Grid3D> grid) override;
 
 private:
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     //   static int counter;
 };
 
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
index ae214c77ca425dde4ecde31f7dc88d19a1616555..fcf2c93d233a5168f0ff4586244ee2088a7bf627 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
@@ -41,7 +41,7 @@
 #include "D3Q27System.h"
 #include "Grid3D.h"
 #include "CreateTransmittersHelper.h"
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "OneDistributionFullDirectConnector.h"
 #include "OneDistributionFullVectorConnector.h"
 #include "TwoDistributionsFullDirectConnector.h"
@@ -62,19 +62,19 @@ public:
     using LocalConnector  = T1;
     using RemoteConnector = T2;
 public:
-    SetConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm);
+    SetConnectorsBlockVisitor(std::shared_ptr<vf::parallel::Communicator> comm);
     ~SetConnectorsBlockVisitor() override;
     void visit(SPtr<Grid3D> grid, SPtr<Block3D> block) override;
     //////////////////////////////////////////////////////////////////////////
 protected:
     void setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block);
     void setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir);
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     int gridRank{0};
 };
 
 template <class T1, class T2>
-SetConnectorsBlockVisitor<T1, T2>::SetConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm)
+SetConnectorsBlockVisitor<T1, T2>::SetConnectorsBlockVisitor(std::shared_ptr<vf::parallel::Communicator> comm)
     : Block3DVisitor(0, D3Q27System::MAXLEVEL), comm(comm)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp
index 362e8c92751e1275bfdaa7d7daf1567f117ecdf4..bdf851025d380daa93db2477217a513002591ebb 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp
@@ -39,10 +39,10 @@
 #include "D3Q27System.h"
 #include <basics/transmitter/TbTransmitterLocal.h>
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Interpolator.h"
 
-SetInterpolationConnectorsBlockVisitor::SetInterpolationConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm, real nue, SPtr<Interpolator> iProcessor) :
+SetInterpolationConnectorsBlockVisitor::SetInterpolationConnectorsBlockVisitor(std::shared_ptr<vf::parallel::Communicator> comm, real nue, SPtr<Interpolator> iProcessor) :
 Block3DVisitor(0, D3Q27System::MAXLEVEL), 
 	comm(comm),
 	nue(nue),
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.h
index b1f6f99e1c4eff543f87dfcd70e7b45bf27701d5..4e4b205397842bc1218b5a0ec5555b527f989377 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.h
@@ -43,14 +43,14 @@
 
 class Grid3D;
 class Block3D;
-namespace vf::mpi {class Communicator;}
+namespace vf::parallel {class Communicator;}
 class Interpolator;
 
 //! \brief  A class sets connectors between blocks.
 class SetInterpolationConnectorsBlockVisitor : public Block3DVisitor
 {
 public:
-    SetInterpolationConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm, real nue, SPtr<Interpolator> iProcessor);
+    SetInterpolationConnectorsBlockVisitor(std::shared_ptr<vf::parallel::Communicator> comm, real nue, SPtr<Interpolator> iProcessor);
     ~SetInterpolationConnectorsBlockVisitor() override;
     void visit(SPtr<Grid3D> grid, SPtr<Block3D> block) override;
     //////////////////////////////////////////////////////////////////////////
@@ -63,7 +63,7 @@ protected:
                             CreateTransmittersHelper::TransmitterPtr &receiverCF,
                             CreateTransmittersHelper::TransmitterPtr &senderFC,
                             CreateTransmittersHelper::TransmitterPtr &receiverFC);
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     int gridRank;
     real nue;
     SPtr<Interpolator> iProcessor;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.cpp
index 7d9f5e8d4e233c6f18aa5e95818b71143c3d3442..c168cd664d5de94fab8039a79c79b5e38c53adb8 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.cpp
@@ -9,7 +9,7 @@
 
 using namespace std;
 
-ZoltanPartitioningGridVisitor::ZoltanPartitioningGridVisitor(std::shared_ptr<vf::mpi::Communicator> comm, int numOfDirs,
+ZoltanPartitioningGridVisitor::ZoltanPartitioningGridVisitor(std::shared_ptr<vf::parallel::Communicator> comm, int numOfDirs,
                                                              int numOfLocalParts)
     : comm(comm), numOfDirs(numOfDirs), numOfLocalParts(numOfLocalParts)
 {
diff --git a/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.h
index aeaf4d705c0b91cad482f87dff36ad6347363504..1f02c5efa3e7566d1407952024d358597bdb9e30 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/ZoltanPartitioningGridVisitor.h
@@ -10,14 +10,14 @@
 
 #if defined VF_ZOLTAN && defined VF_MPI
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 #include "Grid3DVisitor.h"
 #include "ZoltanPartitioner.h"
 
 class ZoltanPartitioningGridVisitor : public Grid3DVisitor
 {
 public:
-    ZoltanPartitioningGridVisitor(std::shared_ptr<vf::mpi::Communicator> comm, int numOfDirs, int numOfLocalParts = 1);
+    ZoltanPartitioningGridVisitor(std::shared_ptr<vf::parallel::Communicator> comm, int numOfDirs, int numOfLocalParts = 1);
     ~ZoltanPartitioningGridVisitor();
     void visit(SPtr<Grid3D> grid);
 
@@ -26,7 +26,7 @@ protected:
     void repartGrid(SPtr<Grid3D> grid, ZoltanPartitioner &zp);
 
 private:
-    std::shared_ptr<vf::mpi::Communicator> comm;
+    std::shared_ptr<vf::parallel::Communicator> comm;
     int numOfDirs;
     int numOfLocalParts;
     ZoltanGraph *graph;
diff --git a/src/cpu/simulationconfig/Simulation.cpp b/src/cpu/simulationconfig/Simulation.cpp
index 67c4e469d41ea24f1029f09e1beb78a597974e4c..4b7d52286995ed9b5eadd5827d586b49e9f222a4 100644
--- a/src/cpu/simulationconfig/Simulation.cpp
+++ b/src/cpu/simulationconfig/Simulation.cpp
@@ -29,7 +29,7 @@
 #include <LBM/Interpolation/CompressibleOffsetMomentsInterpolator.h>
 #include <LBM/LBMKernel.h>
 #include <LBM/LBMUnitConverter.h>
-#include <mpi/MPICommunicator.h>
+#include <parallel/MPICommunicator.h>
 #include <Visitors/GenBlocksGridVisitor.h>
 #include <Visitors/InitDistributionsBlockVisitor.h>
 #include <Visitors/MetisPartitioningGridVisitor.h>
@@ -45,7 +45,7 @@
 
 CPUSimulation::CPUSimulation()
 {
-    this->communicator = vf::mpi::MPICommunicator::getInstance();
+    this->communicator = vf::parallel::MPICommunicator::getInstance();
     this->grid = std::make_shared<Grid3D>(communicator);
 }
 
diff --git a/src/cpu/simulationconfig/Simulation.h b/src/cpu/simulationconfig/Simulation.h
index ee8fc911c684b55d0f624ab8db960d225e24790b..be29539187338cdadb5df2d102c90d03ee342434 100644
--- a/src/cpu/simulationconfig/Simulation.h
+++ b/src/cpu/simulationconfig/Simulation.h
@@ -5,7 +5,7 @@
 #include <memory>
 #include <set>
 
-#include <mpi/Communicator.h>
+#include <parallel/Communicator.h>
 
 #include <geometry3d/GbPoint3D.h>
 #include <Interactors/Interactor3D.h>
@@ -78,7 +78,7 @@ private:
 
     std::shared_ptr<LBMKernel> lbmKernel;
     std::shared_ptr<AbstractLBMSystem> lbmSystem;
-    std::shared_ptr<vf::mpi::Communicator> communicator;
+    std::shared_ptr<vf::parallel::Communicator> communicator;
 
     std::shared_ptr<Grid3D> grid;
     std::vector<std::shared_ptr<Interactor3D>> interactors;
diff --git a/src/cuda/CMakeLists.txt b/src/cuda/CMakeLists.txt
deleted file mode 100644
index 4d49cfedc903f3578b64916966405ea48bf28901..0000000000000000000000000000000000000000
--- a/src/cuda/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-project(cuda LANGUAGES CUDA CXX)
-
-vf_add_library(NAME vf_cuda PUBLIC_LINK logger)
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 4924432dbf05ca2213e5fa08cf16a28ea75f8c9e..fddcc7f790142e6ae5fae2eb07b78e0c18aa5d60 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -50,7 +50,7 @@
 using namespace vf::basics::constant;
 
 struct Vertex;
-class  Grid;
+class Grid;
 class Transformator;
 class ArrowTransformator;
 class PolyDataWriterWrapper;
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index e45ad99d8a63c332aa3723eb682b61dbc267f4db..7febc828f6d479b315d160e6c3db6e2bffaeb473 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -49,14 +49,11 @@
 #include "io/GridVTKWriter/GridVTKWriter.h"
 #include "io/STLReaderWriter/STLWriter.h"
 
-MultipleGridBuilder::MultipleGridBuilder(SPtr<GridFactory> gridFactory) : LevelGridBuilder(), gridFactory(gridFactory), numberOfLayersFine(12), numberOfLayersBetweenLevels(8), subDomainBox(nullptr)
-{
-
-}
 
-SPtr<MultipleGridBuilder> MultipleGridBuilder::makeShared(SPtr<GridFactory> gridFactory)
+MultipleGridBuilder::MultipleGridBuilder() : LevelGridBuilder(), numberOfLayersFine(12), numberOfLayersBetweenLevels(8), subDomainBox(nullptr)
 {
-    return SPtr<MultipleGridBuilder>(new MultipleGridBuilder(gridFactory));
+    gridFactory = GridFactory::make();
+    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
 }
 
 void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta)
@@ -112,7 +109,6 @@ void MultipleGridBuilder::addGrid(SPtr<Object> gridShape, uint levelFine)
     for( uint level = this->getNumberOfLevels(); level <= levelFine; level++ ){
         const auto grid = makeGrid(gridShape, level, levelFine);
 
-
         if(level != levelFine){
             grid->setInnerRegionFromFinerGrid(true);
             grid->setNumberOfLayers( this->numberOfLayersBetweenLevels );
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
index 8d94edd0f42b237ef4e45e5a4f4246d739a51b46..0c90c90a6479187ac3b18c880a94da51b1ba7cbf 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
@@ -47,11 +47,8 @@ class BoundingBox;
 
 class MultipleGridBuilder : public LevelGridBuilder
 {
-private:
-    GRIDGENERATOR_EXPORT MultipleGridBuilder(SPtr<GridFactory> gridFactory);
-
 public:
-    GRIDGENERATOR_EXPORT static SPtr<MultipleGridBuilder> makeShared(SPtr<GridFactory> gridFactory);
+    MultipleGridBuilder();
 
     GRIDGENERATOR_EXPORT void addCoarseGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta);
     GRIDGENERATOR_EXPORT void addGrid(SPtr<Object> gridShape);
diff --git a/src/gpu/GridGenerator/grid/GridImpTest.cpp b/src/gpu/GridGenerator/grid/GridImpTest.cpp
index 07b2a03f429ad8baf0badd0c966dd88235644c0a..fcbf7cc92a97bcea7ca72525dc1981cd7b95dfee 100644
--- a/src/gpu/GridGenerator/grid/GridImpTest.cpp
+++ b/src/gpu/GridGenerator/grid/GridImpTest.cpp
@@ -172,9 +172,7 @@ protected:
 
     void SetUp() override
     {
-        auto gridFactory = GridFactory::make();
-        gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
-        gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+        gridBuilder = std::make_shared<MultipleGridBuilder>();
     }
 };
 
diff --git a/src/gpu/VirtualFluids_GPU/CMakeLists.txt b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
index d7e4a776271c5bc243a4ed663ffecd23dec5cebb..4cd0d1df5db24385c2b528294bb665d405e73937 100644
--- a/src/gpu/VirtualFluids_GPU/CMakeLists.txt
+++ b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
@@ -1,11 +1,7 @@
 project(VirtualFluids_GPU LANGUAGES CUDA CXX)
 
-set(additional_libraries "")
-if(MSVC)
-    set(additional_libraries ws2_32 Traffic) # ws_32 throws an error on Phoenix
-endif()
 
-vf_add_library(PUBLIC_LINK basics lbm PRIVATE_LINK ${additional_libraries} GridGenerator MPI::MPI_CXX vf_cuda)
+vf_add_library(PUBLIC_LINK basics lbm parallel PRIVATE_LINK GridGenerator cuda_helper)
 
 #SET(TPN_WIN32 "/EHsc")
 #https://stackoverflow.com/questions/6832666/lnk2019-when-including-asio-headers-solution-generated-with-cmake
@@ -13,10 +9,15 @@ vf_add_library(PUBLIC_LINK basics lbm PRIVATE_LINK ${additional_libraries} GridG
 
 set_target_properties(VirtualFluids_GPU PROPERTIES CUDA_SEPARABLE_COMPILATION ON POSITION_INDEPENDENT_CODE ON)
 
+
+if(MSVC)
+    set_target_properties(VirtualFluids_GPU PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)
+endif()
+
 vf_add_tests()
 
 if(BUILD_VF_UNIT_TESTS)
-    set_target_properties(VirtualFluids_GPUTests PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+    # set_target_properties(VirtualFluids_GPUTests PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
     target_include_directories(VirtualFluids_GPUTests PRIVATE "${VF_THIRD_DIR}/cuda_samples/")
     target_include_directories(VirtualFluids_GPUTests PRIVATE "${VF_ROOT_DIR}/src/gpu/GridGenerator/")
     set_source_files_properties(Communication/ExchangeData27Test.cpp PROPERTIES LANGUAGE CUDA)
@@ -26,4 +27,5 @@ if(BUILD_VF_UNIT_TESTS)
     set_source_files_properties(Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17Test.cpp PROPERTIES LANGUAGE CUDA)
     set_source_files_properties(Kernel/Utilities/DistributionHelperTests.cpp PROPERTIES LANGUAGE CUDA)
     set_source_files_properties(Parameter/ParameterTest.cpp PROPERTIES LANGUAGE CUDA)
+    set_source_files_properties(PreCollisionInteractor/ActuatorFarmInlinesTest.cpp PROPERTIES LANGUAGE CUDA)
 endif()
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
index a2b1039afca4eaa3fcd75e28cae16cb5f68f6c9b..cf1aaa3988e0809dd0995a18139ab7dcef75989f 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp
@@ -13,6 +13,8 @@
 #include "CollisionStrategy.h"
 #include "RefinementStrategy.h"
 
+#include <parallel/Communicator.h>
+
 void UpdateGrid27::updateGrid(int level, unsigned int t)
 {
     //////////////////////////////////////////////////////////////////////////
@@ -381,7 +383,7 @@ void UpdateGrid27::exchangeData(int level)
     exchangeMultiGPU_noStreams_withPrepare(level, false);
 }
 
-UpdateGrid27::UpdateGrid27(SPtr<Parameter> para, vf::gpu::Communicator &comm, SPtr<CudaMemoryManager> cudaMemoryManager,
+UpdateGrid27::UpdateGrid27(SPtr<Parameter> para, vf::parallel::Communicator &comm, SPtr<CudaMemoryManager> cudaMemoryManager,
                            std::vector<std::shared_ptr<PorousMedia>> &pm, std::vector<SPtr<Kernel>> &kernels , BoundaryConditionFactory* bcFactory, SPtr<TurbulenceModelFactory>  tmFactory, GridScalingFactory* scalingFactory)
     : para(para), comm(comm), cudaMemoryManager(cudaMemoryManager), pm(pm), kernels(kernels), tmFactory(tmFactory)
 {
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
index 9c6ff48725f4e17121de0a1a8681d0bafcfb58ee..9de7e73ec03a0f00542dd5b718ed6f210399a18a 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h
@@ -1,13 +1,17 @@
 #ifndef UPDATEGRID27_H
 #define UPDATEGRID27_H
 
-#include "LBM/LB.h"
+#include "Calculation/PorousMedia.h"
+#include "GPU/CudaMemoryManager.h"
 #include "GPU/GPU_Interface.h"
-#include "Parameter/Parameter.h"
+#include "LBM/LB.h"
 #include "Parameter/CudaStreamManager.h"
-#include "GPU/CudaMemoryManager.h"
-#include "Communication/Communicator.h"
-#include "Calculation/PorousMedia.h"
+#include "Parameter/Parameter.h"
+
+namespace vf::parallel
+{
+class Communicator;
+}
 
 class BCKernelManager;
 class ADKernelManager;
@@ -24,7 +28,7 @@ using RefinementStrategy = std::function<void (UpdateGrid27* updateGrid, Paramet
 class UpdateGrid27
 {
 public:
-    UpdateGrid27(SPtr<Parameter> para, vf::gpu::Communicator &comm, SPtr<CudaMemoryManager> cudaMemoryManager,
+    UpdateGrid27(SPtr<Parameter> para, vf::parallel::Communicator& comm, SPtr<CudaMemoryManager> cudaMemoryManager,
                  std::vector<std::shared_ptr<PorousMedia>> &pm, std::vector<SPtr<Kernel>> &kernels, BoundaryConditionFactory* bcFactory, SPtr<TurbulenceModelFactory> tmFactory, GridScalingFactory* scalingFactory);
     void updateGrid(int level, unsigned int t);
     void exchangeData(int level);
@@ -72,7 +76,7 @@ private:
 
 private:
     SPtr<Parameter> para;
-    vf::gpu::Communicator& comm;
+    vf::parallel::Communicator& comm;
     SPtr<CudaMemoryManager> cudaMemoryManager;
     std::vector<std::shared_ptr<PorousMedia>> pm;
     std::vector<SPtr<Kernel>> kernels;
diff --git a/src/gpu/VirtualFluids_GPU/Communication/CommunicationRoutine.h b/src/gpu/VirtualFluids_GPU/Communication/CommunicationRoutine.h
deleted file mode 100644
index 26c017f939b0795457d74008a21cb9e7a4b75bd0..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Communication/CommunicationRoutine.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef INDEX_EXCHANGE
-#define INDEX_EXCHANGE
-
-#include <basics/DataTypes.h>
-
-namespace vf::gpu
-{
-class CommunicationRoutine
-{
-public:
-    virtual ~CommunicationRoutine() = default;
-
-    virtual void receive_send(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
-                              int size_buffer_send, int neighbor_rank_send) const = 0;
-    virtual int getPID() const = 0;
-};
-} // namespace vf::gpu
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Communication/CommunicationRoutineMocks.h b/src/gpu/VirtualFluids_GPU/Communication/CommunicationRoutineMocks.h
deleted file mode 100644
index d05e5b6a3fdb75f9073d9f376980612f040c4038..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Communication/CommunicationRoutineMocks.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef VF_GPU_COMMUNICATIONROUTINEMOCKS_H
-#define VF_GPU_COMMUNICATIONROUTINEMOCKS_H
-
-#include "CommunicationRoutine.h"
-
-namespace vf::gpu::test 
-{
-
-class CommunicationRoutineTestDouble : public vf::gpu::CommunicationRoutine
-{
-public:
-    void receive_send(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
-                              int size_buffer_send, int neighbor_rank_send) const override { } 
-    int getPID() const override { return 0; }
-};
-
-}
-
-
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Communication/Communicator.h b/src/gpu/VirtualFluids_GPU/Communication/Communicator.h
deleted file mode 100644
index c52d5af9cacb4d5ae4e46090a263f67d4e63f12d..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Communication/Communicator.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef COMMUNICATOR_GPU_H
-#define COMMUNICATOR_GPU_H
-
-#include <vector>
-#include <basics/DataTypes.h>
-
-#include "VirtualFluids_GPU_export.h"
-#include "CommunicationRoutine.h"
-
-namespace vf::gpu
-{
-
-class VIRTUALFLUIDS_GPU_EXPORT Communicator : public CommunicationRoutine
-{
-public:
-    virtual void waitAll() = 0;
-    virtual int getPID() const override = 0;
-    virtual int getNumberOfProcess() const = 0;
-    virtual void exchngData(float *sbuf_t, float *rbuf_t, float *sbuf_b, float *rbuf_b, int count) = 0;
-    //////////////////////////////////////////////////////////////////////////
-    virtual void exchngDataGPU(real *sbuf, int count_s, real *rbuf, int count_r, int nb_rank) = 0;
-    virtual void nbRecvDataGPU(real *rbuf, int count_r, int nb_rank) = 0;
-    virtual void nbSendDataGPU(real *sbuf, int count_s, int nb_rank) = 0;
-    virtual void waitallGPU() = 0;
-    virtual void sendDataGPU(real *sbuf, int count_s, int nb_rank) = 0;
-    virtual void waitGPU(int id) = 0;
-    virtual void resetRequest() = 0;
-    //////////////////////////////////////////////////////////////////////////
-    virtual int mapCudaDevice(const int &rank, const int &size, const std::vector<unsigned int> &devices, const int &maxdev) = 0;
-    virtual double reduceSum(double quantityPerProcess) = 0;
-    //////////////////////////////////////////////////////////////////////////
-    virtual void receive_send(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
-                              int size_buffer_send, int neighbor_rank_send) const override = 0;
-
-};
-
-} // namespace vf::gpu
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp
index 48a27efa674e5fa85d47cb9439c52d0c558dac44..ff5e39c707d0e836440e40d33e3b261262d83b6d 100644
--- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp
+++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp
@@ -1,9 +1,11 @@
-#include <helper_cuda.h>
 #include <cuda_runtime.h>
+#include <helper_cuda.h>
 
 #include "Communication/ExchangeData27.h"
 #include "Parameter/CudaStreamManager.h"
 
+#include <parallel/Communicator.h>
+
 using namespace vf::lbm::dir;
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -52,22 +54,20 @@ void scatterNodesFromRecvBufferGPU(Parameter *para, int level, CudaStreamIndex s
     }
 }
 
-void startBlockingMpiSend(unsigned int numberOfSendProcessNeighbors, vf::gpu::Communicator &comm,
+void startBlockingMpiSend(unsigned int numberOfSendProcessNeighbors, vf::parallel::Communicator &comm,
                           std::vector<ProcessNeighbor27> *sendProcessNeighborHost)
 {
     for (unsigned int i = 0; i < numberOfSendProcessNeighbors; i++) {
-            comm.sendDataGPU((*sendProcessNeighborHost)[i].f[0], 
-                            (*sendProcessNeighborHost)[i].numberOfFs,
-                            (*sendProcessNeighborHost)[i].rankNeighbor);
+        comm.send((*sendProcessNeighborHost)[i].f[0], (*sendProcessNeighborHost)[i].numberOfFs,
+                  (*sendProcessNeighborHost)[i].rankNeighbor);
     }
 }
 
-void startNonBlockingMpiReceive(unsigned int numberOfSendProcessNeighbors, vf::gpu::Communicator &comm,
+void startNonBlockingMpiReceive(unsigned int numberOfSendProcessNeighbors, vf::parallel::Communicator &comm,
                                 std::vector<ProcessNeighbor27> *recvProcessNeighborHost)
 {
     for (unsigned int i = 0; i < numberOfSendProcessNeighbors; i++) {
-            comm.nbRecvDataGPU((*recvProcessNeighborHost)[i].f[0], 
-                                (*recvProcessNeighborHost)[i].numberOfFs,
+        comm.receiveNonBlocking((*recvProcessNeighborHost)[i].f[0], (*recvProcessNeighborHost)[i].numberOfFs,
                                 (*recvProcessNeighborHost)[i].rankNeighbor);
     }
 }
@@ -117,7 +117,7 @@ void prepareExchangeCollDataXGPU27AfterFtoC(Parameter *para, int level, CudaStre
                                 (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")));
 }
 
-void exchangeCollDataXGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataXGPU27AllNodes(Parameter *para, vf::parallel::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
                                     int level, CudaStreamIndex streamIndex)
 {
     exchangeCollDataXGPU27(para, comm, cudaMemoryManager, level, streamIndex,
@@ -127,7 +127,7 @@ void exchangeCollDataXGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm
                            &para->getParH(level)->recvProcessNeighborX);
 }
 
-void exchangeCollDataXGPU27AfterFtoC(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataXGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
                                      int level, CudaStreamIndex streamIndex)
 {
     exchangeCollDataXGPU27(para, comm, cudaMemoryManager, level, streamIndex,
@@ -149,7 +149,7 @@ void scatterNodesFromRecvBufferXGPU27AfterFtoC(Parameter *para, int level, CudaS
                                   (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")));
 }
 
-void exchangeCollDataXGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager, 
+void exchangeCollDataXGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager, 
                             int level, CudaStreamIndex streamIndex,
                             std::vector<ProcessNeighbor27> *sendProcessNeighborDev,
                             std::vector<ProcessNeighbor27> *recvProcessNeighborDev,
@@ -158,7 +158,7 @@ void exchangeCollDataXGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe
 {
     cudaStream_t stream = para->getStreamManager()->getStream(streamIndex);
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    //! \details steps: 
+    //! \details steps:
     //! 1. copy data from device to host
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
         cudaMemoryManager->cudaCopyProcessNeighborXFsDH(level, i, (*sendProcessNeighborDev)[i].memsizeFs);
@@ -174,10 +174,10 @@ void exchangeCollDataXGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe
     startBlockingMpiSend((unsigned int)(*sendProcessNeighborHost).size(), comm, sendProcessNeighborHost);
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //! 5. wait for until data is received
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++) comm.waitGPU(i);
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //! 6. reset the request array, which was used for the mpi communication
-    if (0 < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send"))) comm.resetRequest();
+    if (0 < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send"))) comm.resetRequests();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //! 7. copy received data from host to device
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
@@ -201,7 +201,7 @@ void prepareExchangeCollDataYGPU27AfterFtoC(Parameter *para, int level, CudaStre
                                 (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")));
 }
 
-void exchangeCollDataYGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataYGPU27AllNodes(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                     int level, CudaStreamIndex streamIndex)
 {
     exchangeCollDataYGPU27(para, comm, cudaMemoryManager, level, streamIndex,
@@ -211,7 +211,7 @@ void exchangeCollDataYGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm
                            &para->getParH(level)->recvProcessNeighborY);
 }
 
-void exchangeCollDataYGPU27AfterFtoC(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataYGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                      int level, CudaStreamIndex streamIndex)
 {
     exchangeCollDataYGPU27(para, comm, cudaMemoryManager, level, streamIndex,
@@ -233,7 +233,7 @@ void scatterNodesFromRecvBufferYGPU27AfterFtoC(Parameter *para, int level, CudaS
                                   (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")));
 }
 
-void exchangeCollDataYGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager, int level,
+void exchangeCollDataYGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager, int level,
                             CudaStreamIndex streamIndex,
                             std::vector<ProcessNeighbor27> *sendProcessNeighborDev,
                             std::vector<ProcessNeighbor27> *recvProcessNeighborDev,
@@ -270,10 +270,10 @@ void exchangeCollDataYGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe
     startBlockingMpiSend((unsigned int)(*sendProcessNeighborHost).size(), comm, sendProcessNeighborHost);
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++) comm.waitGPU(i);
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // reset the request array
-    if (0 < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send"))) comm.resetRequest();
+    if (0 < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send"))) comm.resetRequests();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // copy Host to Device
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++) {
@@ -298,7 +298,7 @@ void prepareExchangeCollDataZGPU27AfterFtoC(Parameter *para, int level, CudaStre
                                 (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")));
 }
 
-void exchangeCollDataZGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataZGPU27AllNodes(Parameter *para, vf::parallel::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
                                     int level, CudaStreamIndex streamIndex)
 {
     exchangeCollDataZGPU27(para, comm, cudaMemoryManager, level, streamIndex,
@@ -307,7 +307,7 @@ void exchangeCollDataZGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm
                            &para->getParH(level)->sendProcessNeighborZ,
                            &para->getParH(level)->recvProcessNeighborZ);
 }
-void exchangeCollDataZGPU27AfterFtoC(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataZGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
                                      int level, CudaStreamIndex streamIndex)
 {
     exchangeCollDataZGPU27(para, comm, cudaMemoryManager, level, streamIndex,
@@ -330,7 +330,7 @@ void scatterNodesFromRecvBufferZGPU27AfterFtoC(Parameter *para, int level, CudaS
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangeCollDataZGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager, int level, 
+void exchangeCollDataZGPU27(Parameter *para, vf::parallel::Communicator &comm, CudaMemoryManager *cudaMemoryManager, int level, 
                             CudaStreamIndex streamIndex,
                             std::vector<ProcessNeighbor27> *sendProcessNeighborDev,
                             std::vector<ProcessNeighbor27> *recvProcessNeighborDev,
@@ -380,10 +380,10 @@ void exchangeCollDataZGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe
     startBlockingMpiSend((unsigned int)(*sendProcessNeighborHost).size(), comm, sendProcessNeighborHost);
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++) comm.waitGPU(i);
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // reset the request array
-    if (0 < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send"))) comm.resetRequest();
+    if (0 < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send"))) comm.resetRequests();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // copy Host to Device
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
@@ -416,7 +416,7 @@ void exchangeCollDataZGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //1D domain decomposition
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePreCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePreCollDataGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighbors(level, "send")); i++)
     {
@@ -434,7 +434,7 @@ void exchangePreCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cuda
         //////////////////////////////////////////////////////////////////////////
         cudaMemoryManager->cudaCopyProcessNeighborFsDH(level, i);
         //////////////////////////////////////////////////////////////////////////
-        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighbor[i].f[0], 
+        comm.receiveSend(para->getParH(level)->sendProcessNeighbor[i].f[0], 
                             para->getParH(level)->sendProcessNeighbor[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighbor[i].f[0],
                             para->getParH(level)->recvProcessNeighbor[i].numberOfFs,
@@ -461,7 +461,7 @@ void exchangePreCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cuda
 
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePostCollDataGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighbors(level, "send")); i++)
     {
@@ -479,7 +479,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
         //////////////////////////////////////////////////////////////////////////
         cudaMemoryManager->cudaCopyProcessNeighborFsDH(level, i);
         //////////////////////////////////////////////////////////////////////////
-        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighbor[i].f[0], 
+        comm.receiveSend(para->getParH(level)->sendProcessNeighbor[i].f[0], 
                             para->getParH(level)->sendProcessNeighbor[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighbor[i].f[0],
                             para->getParH(level)->recvProcessNeighbor[i].numberOfFs,
@@ -502,7 +502,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//void exchangePostCollDataXGPU27(Parameter* para, vf::gpu::Communicator& comm, int level)
+//void exchangePostCollDataXGPU27(Parameter* para, vf::parallel::Communicator& comm, int level)
 //{
 //    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
 //    {
@@ -520,7 +520,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //        //////////////////////////////////////////////////////////////////////////
 //        para->cudaCopyProcessNeighborXFsDH(level, i);
 //        //////////////////////////////////////////////////////////////////////////
-//        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighborX[i].f[0], 
+//        comm.receiveSend(para->getParH(level)->sendProcessNeighborX[i].f[0], 
 //                            para->getParH(level)->sendProcessNeighborX[i].numberOfFs,
 //                            para->getParH(level)->recvProcessNeighborX[i].f[0],
 //                            para->getParH(level)->recvProcessNeighborX[i].numberOfFs,
@@ -549,7 +549,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //// Y
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//void exchangePreCollDataYGPU27(Parameter* para, vf::gpu::Communicator& comm, int level)
+//void exchangePreCollDataYGPU27(Parameter* para, vf::parallel::Communicator& comm, int level)
 //{
 //    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
 //    {
@@ -567,7 +567,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //        //////////////////////////////////////////////////////////////////////////
 //        para->cudaCopyProcessNeighborYFsDH(level, i);
 //        //////////////////////////////////////////////////////////////////////////
-//        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighborY[i].f[0], 
+//        comm.receiveSend(para->getParH(level)->sendProcessNeighborY[i].f[0], 
 //                            para->getParH(level)->sendProcessNeighborY[i].numberOfFs,
 //                            para->getParH(level)->recvProcessNeighborY[i].f[0],
 //                            para->getParH(level)->recvProcessNeighborY[i].numberOfFs,
@@ -589,7 +589,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //    }
 //}
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//void exchangePostCollDataYGPU27(Parameter* para, vf::gpu::Communicator& comm, int level)
+//void exchangePostCollDataYGPU27(Parameter* para, vf::parallel::Communicator& comm, int level)
 //{
 //    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
 //    {
@@ -607,7 +607,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //        //////////////////////////////////////////////////////////////////////////
 //        para->cudaCopyProcessNeighborYFsDH(level, i);
 //        //////////////////////////////////////////////////////////////////////////
-//        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighborY[i].f[0], 
+//        comm.receiveSend(para->getParH(level)->sendProcessNeighborY[i].f[0], 
 //                            para->getParH(level)->sendProcessNeighborY[i].numberOfFs,
 //                            para->getParH(level)->recvProcessNeighborY[i].f[0],
 //                            para->getParH(level)->recvProcessNeighborY[i].numberOfFs,
@@ -636,7 +636,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //// Z
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//void exchangePreCollDataZGPU27(Parameter* para, vf::gpu::Communicator& comm, int level)
+//void exchangePreCollDataZGPU27(Parameter* para, vf::parallel::Communicator& comm, int level)
 //{
 //    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
 //    {
@@ -654,7 +654,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //        //////////////////////////////////////////////////////////////////////////
 //        para->cudaCopyProcessNeighborZFsDH(level, i);
 //        //////////////////////////////////////////////////////////////////////////
-//        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighborZ[i].f[0], 
+//        comm.receiveSend(para->getParH(level)->sendProcessNeighborZ[i].f[0], 
 //                            para->getParH(level)->sendProcessNeighborZ[i].numberOfFs,
 //                            para->getParH(level)->recvProcessNeighborZ[i].f[0],
 //                            para->getParH(level)->recvProcessNeighborZ[i].numberOfFs,
@@ -676,7 +676,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //    }
 //}
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//void exchangePostCollDataZGPU27(Parameter* para, vf::gpu::Communicator& comm, int level)
+//void exchangePostCollDataZGPU27(Parameter* para, vf::parallel::Communicator& comm, int level)
 //{
 //    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
 //    {
@@ -694,7 +694,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 //        //////////////////////////////////////////////////////////////////////////
 //        para->cudaCopyProcessNeighborZFsDH(level, i);
 //        //////////////////////////////////////////////////////////////////////////
-//        comm.exchngDataGPU(para->getParH(level)->sendProcessNeighborZ[i].f[0], 
+//        comm.receiveSend(para->getParH(level)->sendProcessNeighborZ[i].f[0], 
 //                            para->getParH(level)->sendProcessNeighborZ[i].numberOfFs,
 //                            para->getParH(level)->recvProcessNeighborZ[i].f[0],
 //                            para->getParH(level)->recvProcessNeighborZ[i].numberOfFs,
@@ -771,7 +771,7 @@ void exchangePostCollDataGPU27(Parameter* para, vf::gpu::Communicator& comm, Cud
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // X
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePreCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePreCollDataADXGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -794,7 +794,7 @@ void exchangePreCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(para->getParH(level)->recvProcessNeighborADX[i].f[0],
+        comm.receiveNonBlocking(para->getParH(level)->recvProcessNeighborADX[i].f[0],
                             para->getParH(level)->recvProcessNeighborADX[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighborADX[i].rankNeighbor);
     }
@@ -816,21 +816,18 @@ void exchangePreCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
     {
-        comm.sendDataGPU(para->getParH(level)->sendProcessNeighborADX[i].f[0],
+        comm.send(para->getParH(level)->sendProcessNeighborADX[i].f[0],
                           para->getParH(level)->sendProcessNeighborADX[i].numberOfFs,
                           para->getParH(level)->sendProcessNeighborADX[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -852,7 +849,7 @@ void exchangePreCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePostCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePostCollDataADXGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -875,7 +872,7 @@ void exchangePostCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm,
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(para->getParH(level)->recvProcessNeighborADX[i].f[0],
+        comm.receiveNonBlocking(para->getParH(level)->recvProcessNeighborADX[i].f[0],
                             para->getParH(level)->recvProcessNeighborADX[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighborADX[i].rankNeighbor);
     }
@@ -897,21 +894,18 @@ void exchangePostCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm,
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
     {
-        comm.sendDataGPU(para->getParH(level)->sendProcessNeighborADX[i].f[0],
+        comm.send(para->getParH(level)->sendProcessNeighborADX[i].f[0],
                           para->getParH(level)->sendProcessNeighborADX[i].numberOfFs,
                           para->getParH(level)->sendProcessNeighborADX[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -940,7 +934,7 @@ void exchangePostCollDataADXGPU27(Parameter* para, vf::gpu::Communicator& comm,
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Y
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePreCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePreCollDataADYGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -963,7 +957,7 @@ void exchangePreCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(para->getParH(level)->recvProcessNeighborADY[i].f[0],
+        comm.receiveNonBlocking(para->getParH(level)->recvProcessNeighborADY[i].f[0],
                             para->getParH(level)->recvProcessNeighborADY[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighborADY[i].rankNeighbor);
     }
@@ -985,21 +979,18 @@ void exchangePreCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
     {
-        comm.sendDataGPU(para->getParH(level)->sendProcessNeighborADY[i].f[0],
+        comm.send(para->getParH(level)->sendProcessNeighborADY[i].f[0],
                           para->getParH(level)->sendProcessNeighborADY[i].numberOfFs,
                           para->getParH(level)->sendProcessNeighborADY[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -1021,7 +1012,7 @@ void exchangePreCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePostCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePostCollDataADYGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -1044,7 +1035,7 @@ void exchangePostCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm,
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(para->getParH(level)->recvProcessNeighborADY[i].f[0],
+        comm.receiveNonBlocking(para->getParH(level)->recvProcessNeighborADY[i].f[0],
                             para->getParH(level)->recvProcessNeighborADY[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighborADY[i].rankNeighbor);
     }
@@ -1066,21 +1057,18 @@ void exchangePostCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm,
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
     {
-        comm.sendDataGPU(para->getParH(level)->sendProcessNeighborADY[i].f[0],
+        comm.send(para->getParH(level)->sendProcessNeighborADY[i].f[0],
                           para->getParH(level)->sendProcessNeighborADY[i].numberOfFs,
                           para->getParH(level)->sendProcessNeighborADY[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -1109,7 +1097,7 @@ void exchangePostCollDataADYGPU27(Parameter* para, vf::gpu::Communicator& comm,
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Z
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePreCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePreCollDataADZGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -1132,7 +1120,7 @@ void exchangePreCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(para->getParH(level)->recvProcessNeighborADZ[i].f[0],
+        comm.receiveNonBlocking(para->getParH(level)->recvProcessNeighborADZ[i].f[0],
                             para->getParH(level)->recvProcessNeighborADZ[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighborADZ[i].rankNeighbor);
     }
@@ -1154,21 +1142,18 @@ void exchangePreCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
     {
-        comm.sendDataGPU(para->getParH(level)->sendProcessNeighborADZ[i].f[0],
+        comm.send(para->getParH(level)->sendProcessNeighborADZ[i].f[0],
                           para->getParH(level)->sendProcessNeighborADZ[i].numberOfFs,
                           para->getParH(level)->sendProcessNeighborADZ[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -1190,7 +1175,7 @@ void exchangePreCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm, C
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangePostCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangePostCollDataADZGPU27(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -1213,7 +1198,7 @@ void exchangePostCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm,
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(para->getParH(level)->recvProcessNeighborADZ[i].f[0],
+        comm.receiveNonBlocking(para->getParH(level)->recvProcessNeighborADZ[i].f[0],
                             para->getParH(level)->recvProcessNeighborADZ[i].numberOfFs,
                             para->getParH(level)->recvProcessNeighborADZ[i].rankNeighbor);
     }
@@ -1235,21 +1220,18 @@ void exchangePostCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm,
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
     {
-        comm.sendDataGPU(para->getParH(level)->sendProcessNeighborADZ[i].f[0],
+        comm.send(para->getParH(level)->sendProcessNeighborADZ[i].f[0],
                           para->getParH(level)->sendProcessNeighborADZ[i].numberOfFs,
                           para->getParH(level)->sendProcessNeighborADZ[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -1325,7 +1307,7 @@ void exchangePostCollDataADZGPU27(Parameter* para, vf::gpu::Communicator& comm,
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // X
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangeCollDataF3XGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangeCollDataF3XGPU(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -1349,7 +1331,7 @@ void exchangeCollDataF3XGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(
+        comm.receiveNonBlocking(
             para->getParH(level)->recvProcessNeighborF3X[i].g[0],
             para->getParH(level)->recvProcessNeighborF3X[i].numberOfGs,
             para->getParH(level)->recvProcessNeighborF3X[i].rankNeighbor);
@@ -1358,22 +1340,19 @@ void exchangeCollDataF3XGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
     {
-        comm.sendDataGPU(
+        comm.send(
             para->getParH(level)->sendProcessNeighborF3X[i].g[0],
             para->getParH(level)->sendProcessNeighborF3X[i].numberOfGs,
             para->getParH(level)->sendProcessNeighborF3X[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsX(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -1403,7 +1382,7 @@ void exchangeCollDataF3XGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Y
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangeCollDataF3YGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangeCollDataF3YGPU(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -1427,7 +1406,7 @@ void exchangeCollDataF3YGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(
+        comm.receiveNonBlocking(
             para->getParH(level)->recvProcessNeighborF3Y[i].g[0],
             para->getParH(level)->recvProcessNeighborF3Y[i].numberOfGs,
             para->getParH(level)->recvProcessNeighborF3Y[i].rankNeighbor);
@@ -1436,22 +1415,19 @@ void exchangeCollDataF3YGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
     {
-        comm.sendDataGPU(
+        comm.send(
             para->getParH(level)->sendProcessNeighborF3Y[i].g[0],
             para->getParH(level)->sendProcessNeighborF3Y[i].numberOfGs,
             para->getParH(level)->sendProcessNeighborF3Y[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
@@ -1481,7 +1457,7 @@ void exchangeCollDataF3YGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Z
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-void exchangeCollDataF3ZGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
+void exchangeCollDataF3ZGPU(Parameter* para, vf::parallel::Communicator& comm, CudaMemoryManager* cudaMemoryManager, int level)
 {
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Device to Host
@@ -1505,7 +1481,7 @@ void exchangeCollDataF3ZGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
     //start non blocking MPI receive
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
     {
-        comm.nbRecvDataGPU(
+        comm.receiveNonBlocking(
             para->getParH(level)->recvProcessNeighborF3Z[i].g[0],
             para->getParH(level)->recvProcessNeighborF3Z[i].numberOfGs,
             para->getParH(level)->recvProcessNeighborF3Z[i].rankNeighbor);
@@ -1514,22 +1490,19 @@ void exchangeCollDataF3ZGPU(Parameter* para, vf::gpu::Communicator& comm, CudaMe
     //start blocking MPI send
     for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
     {
-        comm.sendDataGPU(
+        comm.send(
             para->getParH(level)->sendProcessNeighborF3Z[i].g[0],
             para->getParH(level)->sendProcessNeighborF3Z[i].numberOfGs,
             para->getParH(level)->sendProcessNeighborF3Z[i].rankNeighbor);
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //Wait
-    for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")); i++)
-    {
-        comm.waitGPU(i);
-    }
+    comm.waitAll();
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //reset the request array
     if (0 < (unsigned int)(para->getNumberOfProcessNeighborsZ(level, "send")))
     {
-        comm.resetRequest();
+        comm.resetRequests();
     }
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //copy Host to Device
diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.h b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.h
index 8302ffdc47bfa012c47df00f90c2491039f4eaee..8b03b2b100fe8a039f9199c9141a434f481da3d0 100644
--- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.h
+++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.h
@@ -1,13 +1,17 @@
 #ifndef EXCHANGEDATA27_H
 #define EXCHANGEDATA27_H
 
-#include "Communication/Communicator.h"
 #include "GPU/CudaMemoryManager.h"
 #include "GPU/GPU_Interface.h"
 #include "LBM/LB.h"
 #include "Parameter/Parameter.h"
 #include "Parameter/CudaStreamManager.h"
 
+namespace vf::parallel
+{
+class Communicator;
+}
+
 //! \file ExchangeData27.h
 //! \ingroup GPU
 //! \author Martin Schoenherr, Anna Wellmann
@@ -15,9 +19,9 @@
 
 //////////////////////////////////////////////////////////////////////////
 // 1D domain decomposition
-void exchangePreCollDataGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager, 
+void exchangePreCollDataGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager, 
                                          int level);
-void exchangePostCollDataGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager, 
+void exchangePostCollDataGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager, 
                                           int level);
 //////////////////////////////////////////////////////////////////////////
 // 3D domain decomposition
@@ -62,7 +66,7 @@ void prepareExchangeCollDataXGPU27AfterFtoC(Parameter *para, int level, CudaStre
 //! \param CudaMemoryManager is needed for moving the data between host and device
 //! \param sendProcessNeighborDev, recvProcessNeighborDev, sendProcessNeighborHost, recvProcessNeighborHost are pointers
 //! to the send and receive arrays, both on the device and the host
-void exchangeCollDataXGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataXGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                        int level, CudaStreamIndex streamIndex,
                                        std::vector<ProcessNeighbor27> *sendProcessNeighborDev,
                                        std::vector<ProcessNeighbor27> *recvProcessNeighborDev,
@@ -70,14 +74,14 @@ void exchangeCollDataXGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe
                                        std::vector<ProcessNeighbor27> *recvProcessNeighborHost);
 //! \brief Calls exchangeCollDataXGPU27() for exchanging all nodes
 //! \details Used in the communication after collision step
-void exchangeCollDataXGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm,
+void exchangeCollDataXGPU27AllNodes(Parameter *para, vf::parallel::Communicator& comm,
                                                CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex);
 //! \brief Calls exchangeCollDataXGPU27() for exchanging the nodes, which are part of the communication between the two
 //! interpolation processes on refined grids 
 //! \details Only exchange nodes which are part of the interpolation process on
 //! refined grids. This function is used in the exchange which takes place after the interpolation fine to coarse and
 //! before the interpolation coarse to fine. See [master thesis of Anna Wellmann]
-void exchangeCollDataXGPU27AfterFtoC(Parameter *para, vf::gpu::Communicator &comm,
+void exchangeCollDataXGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator& comm,
                                                 CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex);
 //! \brief Distribute the receive nodes (x direction) from the buffer on the gpu
 //! \details Needed to exchange all nodes, used in the communication after collision step
@@ -94,15 +98,15 @@ void scatterNodesFromRecvBufferXGPU27AfterFtoC(Parameter *para, int level, CudaS
 void prepareExchangeCollDataYGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex);
 void prepareExchangeCollDataYGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex);
 
-void exchangeCollDataYGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataYGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                        int level,CudaStreamIndex streamIndex,
                                        std::vector<ProcessNeighbor27> *sendProcessNeighborDev,
                                        std::vector<ProcessNeighbor27> *recvProcessNeighborDev,
                                        std::vector<ProcessNeighbor27> *sendProcessNeighborHost,
                                        std::vector<ProcessNeighbor27> *recvProcessNeighborHos);
-void exchangeCollDataYGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm,
+void exchangeCollDataYGPU27AllNodes(Parameter *para, vf::parallel::Communicator& comm,
                                                CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex);
-void exchangeCollDataYGPU27AfterFtoC(Parameter *para, vf::gpu::Communicator &comm,
+void exchangeCollDataYGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator& comm,
                                                 CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex);
 void scatterNodesFromRecvBufferYGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex);
 void scatterNodesFromRecvBufferYGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex);
@@ -111,15 +115,15 @@ void scatterNodesFromRecvBufferYGPU27AfterFtoC(Parameter *para, int level, CudaS
 void prepareExchangeCollDataZGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex);
 void prepareExchangeCollDataZGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex);
 
-void exchangeCollDataZGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataZGPU27(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                        int level, CudaStreamIndex streamIndex,
                                        std::vector<ProcessNeighbor27> *sendProcessNeighborDev,
                                        std::vector<ProcessNeighbor27> *recvProcessNeighborDev,
                                        std::vector<ProcessNeighbor27> *sendProcessNeighborHost,
                                        std::vector<ProcessNeighbor27> *recvProcessNeighborHost);
-void exchangeCollDataZGPU27AllNodes(Parameter *para, vf::gpu::Communicator &comm,
+void exchangeCollDataZGPU27AllNodes(Parameter *para, vf::parallel::Communicator& comm,
                                                CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex);
-void exchangeCollDataZGPU27AfterFtoC(Parameter *para, vf::gpu::Communicator &comm,
+void exchangeCollDataZGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator& comm,
                                                 CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex);
 
 void scatterNodesFromRecvBufferZGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex);
@@ -127,28 +131,25 @@ void scatterNodesFromRecvBufferZGPU27AfterFtoC(Parameter *para, int level, CudaS
 
 //////////////////////////////////////////////////////////////////////////
 // 3D domain decomposition convection diffusion
-void exchangePreCollDataADXGPU27(Parameter *para, vf::gpu::Communicator &comm,
+void exchangePreCollDataADXGPU27(Parameter *para, vf::parallel::Communicator& comm,
                                             CudaMemoryManager *cudaMemoryManager, int level);
-void exchangePreCollDataADYGPU27(Parameter *para, vf::gpu::Communicator &comm,
+void exchangePreCollDataADYGPU27(Parameter *para, vf::parallel::Communicator& comm,
                                             CudaMemoryManager *cudaMemoryManager, int level);
-void exchangePreCollDataADZGPU27(Parameter *para, vf::gpu::Communicator &comm,
+void exchangePreCollDataADZGPU27(Parameter *para, vf::parallel::Communicator& comm,
                                             CudaMemoryManager *cudaMemoryManager, int level);
-void exchangePostCollDataADXGPU27(Parameter *para, vf::gpu::Communicator &comm,
+void exchangePostCollDataADXGPU27(Parameter *para, vf::parallel::Communicator& comm,
                                              CudaMemoryManager *cudaMemoryManager, int level);
-void exchangePostCollDataADYGPU27(Parameter *para, vf::gpu::Communicator &comm,
+void exchangePostCollDataADYGPU27(Parameter *para, vf::parallel::Communicator& comm,
                                              CudaMemoryManager *cudaMemoryManager, int level);
-void exchangePostCollDataADZGPU27(Parameter *para, vf::gpu::Communicator &comm,
+void exchangePostCollDataADZGPU27(Parameter *para, vf::parallel::Communicator& comm,
                                              CudaMemoryManager *cudaMemoryManager, int level);
 //////////////////////////////////////////////////////////////////////////
 // 3D domain decomposition F3 - K18/K20
-void exchangeCollDataF3XGPU(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataF3XGPU(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                        int level);
-void exchangeCollDataF3YGPU(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataF3YGPU(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                        int level);
-void exchangeCollDataF3ZGPU(Parameter *para, vf::gpu::Communicator &comm, CudaMemoryManager *cudaMemoryManager,
+void exchangeCollDataF3ZGPU(Parameter *para, vf::parallel::Communicator& comm, CudaMemoryManager *cudaMemoryManager,
                                        int level);
-//////////////////////////////////////////////////////////////////////////
-void barrierGPU(vf::gpu::Communicator &comm);
-//////////////////////////////////////////////////////////////////////////
 
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/Communication/MpiCommunicator.cpp b/src/gpu/VirtualFluids_GPU/Communication/MpiCommunicator.cpp
deleted file mode 100644
index 8af5931ce92b6fa4904ab3aea7c901773f61a6b3..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Communication/MpiCommunicator.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#include "MpiCommunicator.h"
-
-#include <mpi.h>
-#include <vector>
-
-#include <logger/Logger.h>
-
-#if defined (_WIN32) || defined (_WIN64)
-   #include <Winsock2.h>
-#elif defined (__unix__)
-   #include <unistd.h>
-#endif
-//lib for windows Ws2_32.lib
-
-namespace vf::gpu
-{
-
-
-MpiCommunicator::MpiCommunicator()
-{
-    int mpiInitialized = 0; // false
-    MPI_Initialized(&mpiInitialized);
-    if (!mpiInitialized) {
-        MPI_Init(NULL, NULL);
-        VF_LOG_TRACE("vf::gpu::MpiCommunicator(): MPI_Init");
-    }
-
-    MPI_Comm_rank(MPI_COMM_WORLD, &PID);
-    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
-
-    commGPU = MPI_COMM_WORLD;
-    requestGPU.resize(0);
-    rcount = 0;
-
-    // Get a new communicator for a decomposition of the domain
-    int isperiodic[1] = { 0 };
-    MPI_Cart_create(MPI_COMM_WORLD, 1, &numprocs, isperiodic, 1, &comm1d);
-
-    // Get my position in this communicator, and my neighbors
-    MPI_Cart_shift(comm1d, 0, 1, &nbrbottom, &nbrtop);
-}
-
-MpiCommunicator::~MpiCommunicator()
-{
-    // proof if MPI is finalized
-    int _mpiFinalized = 0; // false
-    MPI_Finalized(&_mpiFinalized);
-    if (!_mpiFinalized) {
-        MPI_Finalize();
-        VF_LOG_TRACE("vf::gpu::~MpiCommunicator(): MPI_Finalize");
-    }
-}
-
-
-// C++11 thread safe singelton implementation:
-// https://stackoverflow.com/questions/1661529/is-meyers-implementation-of-the-singleton-pattern-thread-safe
-MpiCommunicator& MpiCommunicator::getInstance()
-{
-    static MpiCommunicator comm;
-    return comm;
-}
-
-void MpiCommunicator::exchngBottomToTop(float *sbuf, float *rbuf, int count)
-{
-    MPI_Sendrecv(sbuf, count, MPI_FLOAT, nbrtop, 0, rbuf, count, MPI_FLOAT, nbrbottom, 0, comm1d, status);
-}
-void MpiCommunicator::exchngTopToBottom(float *sbuf, float *rbuf, int count)
-{
-    MPI_Sendrecv(sbuf, count, MPI_FLOAT, nbrbottom, 0, rbuf, count, MPI_FLOAT, nbrtop, 0, comm1d, status);
-}
-void MpiCommunicator::waitAll() { MPI_Waitall(4, request, status); }
-void MpiCommunicator::exchngData(float *sbuf_t, float *rbuf_t, float *sbuf_b, float *rbuf_b, int count)
-{
-    MPI_Sendrecv(sbuf_t, count, MPI_FLOAT, nbrtop, 0, rbuf_t, count, MPI_FLOAT, nbrbottom, 0, comm1d, status);
-    MPI_Sendrecv(sbuf_b, count, MPI_FLOAT, nbrbottom, 0, rbuf_b, count, MPI_FLOAT, nbrtop, 0, comm1d, status);
-}
-void MpiCommunicator::exchngDataNB(float *sbuf_t, int count_st, float *rbuf_t, int count_rt, float *sbuf_b, int count_sb,
-                                float *rbuf_b, int count_rb)
-{
-    MPI_Irecv(rbuf_t, count_rt, MPI_FLOAT, nbrbottom, 0, comm1d, &request[0]);
-    MPI_Irecv(rbuf_b, count_rb, MPI_FLOAT, nbrtop, 0, comm1d, &request[1]);
-    MPI_Isend(sbuf_t, count_st, MPI_FLOAT, nbrtop, 0, comm1d, &request[2]);
-    MPI_Isend(sbuf_b, count_sb, MPI_FLOAT, nbrbottom, 0, comm1d, &request[3]);
-    MPI_Waitall(4, request, status);
-}
-//////////////////////////////////////////////////////////////////////////
-// Crap by Martin Sch.
-void MpiCommunicator::exchngDataGPU(real *sbuf, int count_s, real *rbuf, int count_r, int nb_rank)
-{
-    MPI_Status MSstatus;
-    MPI_Send(sbuf, count_s, MPI_Type_GPU, nb_rank, 0, commGPU);
-    MPI_Recv(rbuf, count_r, MPI_Type_GPU, nb_rank, 0, commGPU, &MSstatus);
-    ////test only - please don't use
-    // MPI_Sendrecv(sbuf, count_s, MPI_Type_GPU, nb_rank, 0, rbuf, count_r, MPI_Type_GPU, nb_rank, 0, comm1d,
-    // MPI_STATUSES_IGNORE);
-}
-void MpiCommunicator::sendRecvGPU(real *sbuf, int count_s, real *rbuf, int count_r, int nb_rank)
-{
-    // test only - please don't use
-    MPI_Sendrecv(sbuf, count_s, MPI_Type_GPU, nb_rank, 0, rbuf, count_r, MPI_Type_GPU, nb_rank, 0, commGPU,
-                 MPI_STATUSES_IGNORE);
-}
-void MpiCommunicator::nbRecvDataGPU(real *rbuf, int count_r, int nb_rank)
-{
-    // printf("\n Start Recv Rank: %d, neighbor Rank: %d, request = %d \n", PID, nb_rank, (int)requestGPU.size());
-    // fflush(stdout);
-
-    requestGPU.push_back(0);
-    MPI_Irecv(rbuf, count_r, MPI_Type_GPU, nb_rank, 0, commGPU, &requestGPU[rcount]);
-    rcount++;
-
-    // printf("\n End Recv - Rank: %d , neighbor Rank: %d \n", PID, nb_rank);
-    // fflush(stdout);
-}
-void MpiCommunicator::nbSendDataGPU(real *sbuf, int count_s, int nb_rank)
-{
-    // printf("\n Start Send Rank: %d, neighbor Rank: %d, request = %d \n", PID, nb_rank, (int)requestGPU.size());
-    // fflush(stdout);
-
-    requestGPU.push_back(0);
-    MPI_Isend(sbuf, count_s, MPI_Type_GPU, nb_rank, 0, commGPU, &requestGPU[rcount]);
-    rcount++;
-
-    // printf("\n End Send - Rank: %d , neighbor Rank: %d \n", PID, nb_rank);
-    // fflush(stdout);
-}
-void MpiCommunicator::waitallGPU()
-{
-    // printf("\n Start Waitall Rank: %d, request = %d \n", PID, (int)requestGPU.size());
-    // fflush(stdout);
-    if (requestGPU.size() > 0) {
-        MPI_Waitall(static_cast<int>(requestGPU.size()), &requestGPU[0], MPI_STATUSES_IGNORE);
-        requestGPU.resize(0);
-        rcount = 0;
-    }
-    // printf("\n End Waitall \n");
-    // fflush(stdout);
-}
-void MpiCommunicator::sendDataGPU(real *sbuf, int count_s, int nb_rank)
-{
-    MPI_Send(sbuf, count_s, MPI_Type_GPU, nb_rank, 0, commGPU);
-}
-void MpiCommunicator::waitGPU(int id) { MPI_Wait(&requestGPU[id], MPI_STATUSES_IGNORE); }
-void MpiCommunicator::resetRequest()
-{
-    if (requestGPU.size() > 0) {
-        requestGPU.resize(0);
-        rcount = 0;
-    }
-}
-void MpiCommunicator::barrierGPU()
-{
-    // printf("\n Start Waitall Rank: %d, request = %d \n", PID, (int)requestGPU.size());
-    // fflush(stdout);
-    if (requestGPU.size() > 0) {
-        MPI_Barrier(commGPU);
-    }
-    // printf("\n End Waitall \n");
-    // fflush(stdout);
-}
-void MpiCommunicator::barrier() { MPI_Barrier(commGPU); }
-
-//////////////////////////////////////////////////////////////////////////
-void MpiCommunicator::exchngDataGeo(int *sbuf_t, int *rbuf_t, int *sbuf_b, int *rbuf_b, int count)
-{
-    MPI_Irecv(rbuf_t, count, MPI_INT, nbrbottom, 0, comm1d, &request[0]);
-    MPI_Irecv(rbuf_b, count, MPI_INT, nbrtop, 0, comm1d, &request[1]);
-    MPI_Isend(sbuf_t, count, MPI_INT, nbrtop, 0, comm1d, &request[2]);
-    MPI_Isend(sbuf_b, count, MPI_INT, nbrbottom, 0, comm1d, &request[3]);
-    MPI_Waitall(4, request, status);
-}
-int MpiCommunicator::getPID() const { return PID; }
-int MpiCommunicator::getNumberOfProcess() const { return numprocs; }
-int MpiCommunicator::getNeighbourTop() { return nbrtop; }
-int MpiCommunicator::getNeighbourBottom() { return nbrbottom; }
-MPI_Comm MpiCommunicator::getMpiCommunicator() { return comm1d; }
-void MpiCommunicator::distributeGeometry(unsigned int *dataRoot, unsigned int *dataNode, int dataSizePerNode)
-{
-    MPI_Scatter(dataRoot, dataSizePerNode, MPI_UNSIGNED, dataNode, dataSizePerNode, MPI_UNSIGNED, 0, MPI_COMM_WORLD);
-}
-int MpiCommunicator::mapCudaDevice(const int &rank, const int &size, const std::vector<unsigned int> &devices,
-                                const int &maxdev)
-{
-    int device        = -1;
-    char *host        = (char *)malloc(sizeof(char) * size * 255);
-    unsigned int *map = (unsigned int *)malloc(sizeof(unsigned int) * size);
-
-    char hostname[255];
-    gethostname(hostname, 254);
-    hostname[254] = 0;
-
-    MPI_Gather(hostname, 255, MPI_BYTE, host, 255, MPI_BYTE, 0, MPI_COMM_WORLD);
-
-    int i, j;
-    if (rank == 0) {
-        for (i = 0; i < size; i++) {
-            int counter = 0;
-            for (j = 0; j < i; j++) {
-                if (strcmp(&host[i * 255], &host[j * 255]) == 0)
-                    counter++;
-            }
-            if (counter >= maxdev) {
-                VF_LOG_CRITICAL("More processes than GPUs!");
-                exit(1);
-            }
-            map[i] = devices[counter];
-        }
-    }
-
-    MPI_Scatter(map, 1, MPI_UNSIGNED, &device, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD);
-
-    VF_LOG_INFO("Rank: {} runs on host: {} with GPU: {}", rank, hostname, device);
-
-    free(map);
-    free(host);
-    return device;
-}
-
-double MpiCommunicator::reduceSum(double quantityPerProcess)
-{ 
-    double *buffer_send = &quantityPerProcess;
-    double *buffer_recv = (double *)malloc(sizeof(double));
-
-    MPI_Reduce(buffer_send, buffer_recv, 1, MPI_DOUBLE, MPI_SUM, 0, commGPU);
-
-    return *buffer_recv;
-}
-
-void MpiCommunicator::receive_send(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
-                         int size_buffer_send, int neighbor_rank_send) const
-{
-    MPI_Request recv_request;
-    MPI_Irecv(buffer_receive, size_buffer_recv, MPI_UNSIGNED, neighbor_rank_recv, 0, commGPU, &recv_request);
-    //printf("receive_send PID: %i,   nbRev: nb_rank_recv: %i", this->getPID(), nb_rank_r);
-    //fflush(stdout);
-    MPI_Send(buffer_send, size_buffer_send, MPI_UNSIGNED, neighbor_rank_send, 0, commGPU);
-    //printf("receive_send PID: %i,   sendUintGPU: nb_rank_send: %i", this->getPID(), nb_rank_s);
-    //fflush(stdout);
-    MPI_Wait(&recv_request, MPI_STATUSES_IGNORE);
-}
-
-} // namespace vf::gpu
diff --git a/src/gpu/VirtualFluids_GPU/Communication/MpiCommunicator.h b/src/gpu/VirtualFluids_GPU/Communication/MpiCommunicator.h
deleted file mode 100644
index c6a71c0bf2e292133db90f5a1e2110cb1c484c31..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Communication/MpiCommunicator.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef MPIMpiCommunicator_GPU_H
-#define MPIMpiCommunicator_GPU_H
-
-#include <vector>
-
-#include <mpi.h>
-
-#include "VirtualFluids_GPU_export.h"
-
-#include "Communicator.h"
-#include <basics/DataTypes.h>
-
-//////////////////////////////////
-#ifdef VF_DOUBLE_ACCURACY
-#define MPI_Type_GPU MPI_DOUBLE
-#else
-#define MPI_Type_GPU MPI_FLOAT
-#endif
-//////////////////////////////////
-
-namespace vf::gpu
-{
-
-class VIRTUALFLUIDS_GPU_EXPORT MpiCommunicator : public Communicator
-{
-public:
-    static MpiCommunicator &getInstance();
-    MpiCommunicator(const MpiCommunicator &) = delete;
-    MpiCommunicator &operator=(const MpiCommunicator &) = delete;
-    ~MpiCommunicator() override;
-
-    void exchngBottomToTop(float *sbuf, float *rbuf, int count);
-    void exchngTopToBottom(float *sbuf, float *rbuf, int count);
-    void waitAll() override;
-    void distributeGeometry(unsigned int *dataRoot, unsigned int *dataNode, int dataSizePerNode);
-    int getPID() const override;
-    int getNumberOfProcess() const override;
-    int getNeighbourTop();
-    int getNeighbourBottom();
-    void exchngData(float *sbuf_t, float *rbuf_t, float *sbuf_b, float *rbuf_b, int count) override;
-    void exchngDataNB(float *sbuf_t, int count_st, float *rbuf_t, int count_rt, float *sbuf_b, int count_sb,
-                      float *rbuf_b, int count_rb);
-    //////////////////////////////////////////////////////////////////////////
-    void exchngDataGPU(real *sbuf, int count_s, real *rbuf, int count_r, int nb_rank) override;
-    void sendRecvGPU(real *sbuf, int count_s, real *rbuf, int count_r, int nb_rank);
-    void nbRecvDataGPU(real *rbuf, int count_r, int nb_rank) override;
-    void nbSendDataGPU(real *sbuf, int count_s, int nb_rank) override;
-    void waitallGPU() override;
-    void sendDataGPU(real *sbuf, int count_s, int nb_rank) override;
-    void waitGPU(int id) override;
-    void resetRequest() override;
-    void barrierGPU();
-    void barrier();
-    //////////////////////////////////////////////////////////////////////////
-    void exchngDataGeo(int *sbuf_t, int *rbuf_t, int *sbuf_b, int *rbuf_b, int count);
-    MPI_Comm getMpiCommunicator();
-    int mapCudaDevice(const int &rank, const int &size, const std::vector<unsigned int> &devices, const int &maxdev) override;
-    double reduceSum(double quantityPerProcess) override;
-    //////////////////////////////////////////////////////////////////////////
-    void receive_send(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
-                      int size_buffer_send, int neighbor_rank_send) const override;
-
-private:
-    int numprocs, PID;
-    int nbrbottom, nbrtop;
-    MPI_Comm comm1d, commGPU;
-    MPI_Status status[4];
-    MPI_Request request[4];
-    //////////////////////////////////////////////////////////////////////////
-    std::vector<MPI_Request> requestGPU;
-    int rcount;
-    //////////////////////////////////////////////////////////////////////////
-    MpiCommunicator();
-};
-
-} // namespace vf::gpu
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
index 9b2d1c4f5fa742b46ecd9ad3a9f8e86b499909fb..e96c96ec2f38c4d27f7c51177e4a3c21f37579e8 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
@@ -9,7 +9,7 @@
 #include <GPU/CudaMemoryManager.h>
 
 
-std::shared_ptr<GridProvider> GridProvider::makeGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::CommunicationRoutine& communicator)
+std::shared_ptr<GridProvider> GridProvider::makeGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::parallel::Communicator& communicator)
 {
     return std::shared_ptr<GridProvider>(new GridGenerator(builder, para, cudaMemoryManager, communicator));
 }
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
index ee6c93a5f718a2e6907e178bf7b751fbaed824dd..28d2f39e8b469f83672c6cbce162e867686d14ed 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
@@ -9,9 +9,9 @@
 #include "PointerDefinitions.h"
 #include "VirtualFluids_GPU_export.h"
 #include "gpu/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h"
-namespace vf::gpu
+namespace vf::parallel
 {
-class CommunicationRoutine;
+class Communicator;
 }
 
 class Parameter;
@@ -21,7 +21,7 @@ class CudaMemoryManager;
 class VIRTUALFLUIDS_GPU_EXPORT GridProvider
 {
 public:
-    static std::shared_ptr<GridProvider> makeGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::CommunicationRoutine& communicator);
+    static std::shared_ptr<GridProvider> makeGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::parallel::Communicator& communicator);
     static std::shared_ptr<GridProvider> makeGridReader(FILEFORMAT format, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager);
 
     virtual void allocArrays_CoordNeighborGeo() = 0;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index e3c86317c3bf7e4ece5720ac8117e5f418b22fa4..db07322dd4158cb9f66aa15248f38ed4c43d383c 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -15,15 +15,16 @@
 #include "GridGenerator/TransientBCSetter/TransientBCSetter.h"
 
 #include "utilities/communication.h"
-#include "Communication/CommunicationRoutine.h"
+
+#include <parallel/Communicator.h>
 
 #include <logger/Logger.h>
 
 using namespace vf::lbm::dir;
 
 GridGenerator::GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para,
-                             std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::CommunicationRoutine &communicator)
-    : mpiProcessID(communicator.getPID()), builder(builder)
+                             std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::parallel::Communicator &communicator)
+    : mpiProcessID(communicator.getProcessID()), builder(builder)
 {
     this->para = para;
     this->cudaMemoryManager = cudaMemoryManager;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
index b03de24ec452e37c45280c90497e95fd782ef26c..9c0d50a06e587c2776c63d164f1d46c4ac910eab 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
@@ -45,9 +45,9 @@ class Parameter;
 class GridBuilder;
 class IndexRearrangementForStreams;
 class InterpolationCellGrouper;
-namespace vf::gpu
+namespace vf::parallel
 {
-class CommunicationRoutine;
+class Communicator;
 }
 
 //! \class GridGenerator derived class of GridProvider
@@ -67,7 +67,7 @@ private:
     const uint mpiProcessID;
 
 public:
-    VIRTUALFLUIDS_GPU_EXPORT GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::CommunicationRoutine& communicator);
+    VIRTUALFLUIDS_GPU_EXPORT GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::parallel::Communicator& communicator);
     ~GridGenerator() override;
     //! \brief overwrites the default IndexRearrangementForStreams
     void setIndexRearrangementForStreams(std::unique_ptr<IndexRearrangementForStreams>&& indexRearrangement);
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGeneratorTest.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGeneratorTest.cpp
index 8685ea9db2d570b1aa6773659d954ac57333e366..8fc0f78d1f964339258dbeae1658445bc4547e4f 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGeneratorTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGeneratorTest.cpp
@@ -1,17 +1,16 @@
 #include "GridGenerator.h"
 #include <gmock/gmock.h>
 
-#include "Communication/CommunicationRoutine.h"
-#include "Communication/MpiCommunicator.h"
 #include "DataTypes.h"
 #include "GPU/CudaMemoryManager.h"
 #include "IndexRearrangementForStreams.h"
+#include "NullCommunicator.h"
 #include "Parameter/Parameter.h"
 #include "gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
 #include "gpu/GridGenerator/grid/GridImp.h"
 #include "gpu/GridGenerator/utilities/communication.h"
 
-#include "Communication/CommunicationRoutineMocks.h"
+#include <parallel/NullCommunicator.h>
 
 namespace GridGeneratorTest
 {
@@ -72,7 +71,7 @@ class IndexRearrangementForStreamsDouble : public IndexRearrangementForStreams
 {
 public:
     IndexRearrangementForStreamsDouble(std::shared_ptr<Parameter> para, std::shared_ptr<GridBuilder> builder,
-                                       vf::gpu::CommunicationRoutine &communicator)
+                                       vf::parallel::Communicator &communicator)
         : IndexRearrangementForStreams(para, builder, communicator){};
 
     void initCommunicationArraysForCommAfterFinetoCoarseX(uint level, int indexOfProcessNeighbor,
@@ -116,7 +115,7 @@ private:
         para->setNumprocs(2);
 
         builder = std::make_shared<LevelGridBuilderStub>(nullptr);
-        vf::gpu::test::CommunicationRoutineTestDouble communicator;
+        vf::parallel::NullCommunicator communicator;
 
         gridGenerator = std::make_shared<GridGenerator>(builder, para, std::make_shared<CudaMemoryManagerDouble>(para),
                                                         communicator);
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
index d59fa8d017069b665bd6b91f6cf1e685782fab24..bfd112b7c03afba459b8bef7919bc839ac200f2e 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
@@ -1,17 +1,18 @@
 #include "IndexRearrangementForStreams.h"
 
-#include "Communication/Communicator.h"
 #include "Logger.h"
 #include "Parameter/Parameter.h"
 #include <GridGenerator/grid/Grid.h>
 #include <GridGenerator/grid/GridBuilder/GridBuilder.h>
 
+#include <parallel/Communicator.h>
+
 #include <algorithm>
 #include <iostream>
 
 IndexRearrangementForStreams::IndexRearrangementForStreams(std::shared_ptr<Parameter> para,
                                                            std::shared_ptr<GridBuilder> builder,
-                                                           vf::gpu::CommunicationRoutine &communicator)
+                                                           vf::parallel::Communicator &communicator)
     : para(para), builder(builder), communicator(communicator)
 {
 }
@@ -108,7 +109,7 @@ std::vector<uint> IndexRearrangementForStreams::exchangeIndicesForCommAfterFtoCX
     std::vector<uint> recvIndicesForCommAfterFtoCPositions(
         (size_t)para->getParH(level)->sendProcessNeighborsAfterFtoCX[indexOfProcessNeighbor].numberOfNodes * 2, 0);
 
-    communicator.receive_send(
+    communicator.receiveSend(
         recvIndicesForCommAfterFtoCPositions.data(), (int)recvIndicesForCommAfterFtoCPositions.size(),
         para->getParH(level)->recvProcessNeighborX[indexOfProcessNeighbor].rankNeighbor,
         sendIndicesForCommAfterFtoCPositions.data(), (int)sendIndicesForCommAfterFtoCPositions.size(),
@@ -135,7 +136,7 @@ std::vector<uint> IndexRearrangementForStreams::exchangeIndicesForCommAfterFtoCY
     std::vector<uint> recvIndicesForCommAfterFtoCPositions(
         (size_t)para->getParH(level)->sendProcessNeighborsAfterFtoCY[indexOfProcessNeighbor].numberOfNodes * 2, 0);
 
-    communicator.receive_send(
+    communicator.receiveSend(
         recvIndicesForCommAfterFtoCPositions.data(), (int)recvIndicesForCommAfterFtoCPositions.size(),
         para->getParH(level)->recvProcessNeighborY[indexOfProcessNeighbor].rankNeighbor,
         sendIndicesForCommAfterFtoCPositions.data(), (int)sendIndicesForCommAfterFtoCPositions.size(),
@@ -162,7 +163,7 @@ std::vector<uint> IndexRearrangementForStreams::exchangeIndicesForCommAfterFtoCZ
     std::vector<uint> recvIndicesForCommAfterFtoCPositions(
         (size_t)para->getParH(level)->sendProcessNeighborsAfterFtoCZ[indexOfProcessNeighbor].numberOfNodes * 2, 0);
 
-    communicator.receive_send(
+    communicator.receiveSend(
         recvIndicesForCommAfterFtoCPositions.data(), (int)recvIndicesForCommAfterFtoCPositions.size(),
         para->getParH(level)->recvProcessNeighborZ[indexOfProcessNeighbor].rankNeighbor,
         sendIndicesForCommAfterFtoCPositions.data(), (int)sendIndicesForCommAfterFtoCPositions.size(),
@@ -368,7 +369,7 @@ void IndexRearrangementForStreams::reorderSendIndicesForCommAfterFtoC(
     for (uint i = 0; i < (uint)sendIndicesOther.size(); i++)
         sendIndices[i + numberOfSendNodesAfterFtoC] = sendIndicesOther[i];
 
-    VF_LOG_INFO("Reorder send indices: process {}, numberOfSendNodesAfterFtoC {}", communicator.getPID(),
+    VF_LOG_INFO("Reorder send indices: process {}, numberOfSendNodesAfterFtoC {}", communicator.getProcessID(),
                 numberOfSendNodesAfterFtoC);
 
     if (numberOfSendNodesAfterFtoC + sendIndicesOther.size() != numberOfSendIndices) {
@@ -514,7 +515,7 @@ void IndexRearrangementForStreams::reorderRecvIndicesForCommAfterFtoC(
     for (uint i = 0; i < (uint)recvIndicesOther.size(); i++)
         recvIndices[i + numberOfRecvNodesAfterFtoC] = recvIndicesOther[i];
 
-    VF_LOG_INFO("Reorder send indices: process {}, numberOfRecvNodesAfterFtoC {}", communicator.getPID(),
+    VF_LOG_INFO("Reorder send indices: process {}, numberOfRecvNodesAfterFtoC {}", communicator.getProcessID(),
                 numberOfRecvNodesAfterFtoC);
 
     if (numberOfRecvNodesAfterFtoC + recvIndicesOther.size() != numberOfRecvIndices) {
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
index 0b0401d3424f7a953bf2fa92d0382fd9256a635a..421e5aa4cb69cf56df79d9d4c2f0beb4504ce2c3 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
@@ -13,16 +13,16 @@
 
 class Parameter;
 class GridBuilder;
-namespace vf::gpu
+namespace vf::parallel
 {
-class CommunicationRoutine;
+class Communicator;
 }
 
 class IndexRearrangementForStreams
 {
 public:
     //! \brief Construct IndexRearrangementForStreams object
-    IndexRearrangementForStreams(std::shared_ptr<Parameter> para, std::shared_ptr<GridBuilder> builder, vf::gpu::CommunicationRoutine& communicator);
+    IndexRearrangementForStreams(std::shared_ptr<Parameter> para, std::shared_ptr<GridBuilder> builder, vf::parallel::Communicator& communicator);
 
     virtual ~IndexRearrangementForStreams() = default;
 
@@ -133,7 +133,7 @@ protected:
 private:
     std::shared_ptr<GridBuilder> builder;
     std::shared_ptr<Parameter> para;
-    vf::gpu::CommunicationRoutine& communicator;
+    vf::parallel::Communicator &communicator;
 
     // used for tests
     friend class IndexRearrangementForStreamsTest_reorderSendIndices;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp
index a8bc58488e6ebad6b38ae894e1c9c194e64c43c8..bcdb22b9ce04cc2164feb6d0ed45ac23f569712e 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreamsTest.cpp
@@ -6,7 +6,6 @@
 
 #include "Utilities/testUtilitiesGPU.h"
 
-#include "Communication/Communicator.h"
 #include "DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h"
 #include "Parameter/Parameter.h"
 #include "basics/config/ConfigurationFile.h"
@@ -14,7 +13,7 @@
 #include "gpu/GridGenerator/grid/GridImp.h"
 #include "gpu/GridGenerator/utilities/communication.h"
 
-#include "Communication/CommunicationRoutineMocks.h"
+#include <parallel/NullCommunicator.h>
 
 namespace indexRearrangementTests
 {
@@ -152,7 +151,7 @@ private:
             IndexRearrangementForStreams(para, builder, communicator));
     };
 
-    vf::gpu::test::CommunicationRoutineTestDouble communicator;
+    vf::parallel::NullCommunicator communicator;
 };
 
 TEST_F(IndexRearrangementForStreamsTest_reorderSendIndices, reorderSendIndicesForCommAfterFtoCX)
@@ -174,19 +173,19 @@ TEST_F(IndexRearrangementForStreamsTest_reorderSendIndices, reorderSendIndicesFo
 // Test exchangeIndicesForCommAfterFtoC
 //////////////////////////////////////////////////////////////////////////
 
-class CommunicationRoutineDouble : public vf::gpu::CommunicationRoutine
+class CommunicatorDouble : public vf::parallel::NullCommunicator
 {
 public:
-    void receive_send(uint *buffer_receive, int, int, uint *, int, int) const override
+    void receiveSend(uint *buffer_receive, int, int, uint *, int, int) const override
     {
         for (int i = 0; i < (int)receivedIndices.size(); ++i) {
             *(buffer_receive + i) = receivedIndices[i];
         }
     }
 
-    int getPID() const override
+    void receiveSend(real *buffer_send, int size_buffer_send, real *buffer_receive, int size_buffer_recv,
+                     int neighbor_rank) const override
     {
-        return 0;
     }
 
     void setReceivedIndices(const std::vector<uint>& receivedIndices)
@@ -202,9 +201,9 @@ class IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX : public
 {
 
 public:
-    void createTestSubject(vf::gpu::CommunicationRoutine &CommunicationRoutine)
+    void createTestSubject(vf::parallel::Communicator &Communicator)
     {
-        sut = std::make_unique<IndexRearrangementForStreams>(para, builder, CommunicationRoutine);
+        sut = std::make_unique<IndexRearrangementForStreams>(para, builder, Communicator);
     }
 
 protected:
@@ -243,7 +242,7 @@ private:
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, emptyRecvInX)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     communicator.setReceivedIndices(std::vector<uint>());
     createTestSubject(communicator);
 
@@ -253,7 +252,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, emptyR
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, zeroRecvIndexX)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     communicator.setReceivedIndices({ 0 });
     createTestSubject(communicator);
 
@@ -263,7 +262,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, zeroRe
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, oneRecvIndexX)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10 };
     std::vector<uint> receivedIndicesByComm(4, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -277,7 +276,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, oneRec
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, threeRecvIndicesX)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10, 20, 30 };
     std::vector<uint> receivedIndicesByComm(5, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -292,7 +291,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, threeR
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, sixRecvIndicesX)
 {
     // this test shows the limits of the current approach. The last index is always deleted
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10, 20, 30, 40, 50 };
     std::vector<uint> receivedIndicesByComm = { 10, 20, 30, 40, 50, 60 };
     communicator.setReceivedIndices(receivedIndicesByComm);
@@ -305,7 +304,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, sixRec
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCX, recvIndicesXContainZero)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 0, 20, 30, 40 };
     std::vector<uint> receivedIndicesByComm(6, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -321,9 +320,9 @@ class IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY : public
 {
 
 public:
-    void createTestSubject(vf::gpu::CommunicationRoutine &CommunicationRoutine)
+    void createTestSubject(vf::parallel::Communicator &Communicator)
     {
-        sut = std::make_unique<IndexRearrangementForStreams>(para, builder, CommunicationRoutine);
+        sut = std::make_unique<IndexRearrangementForStreams>(para, builder, Communicator);
     }
 
 protected:
@@ -362,7 +361,7 @@ private:
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, emptyRecvInY)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     communicator.setReceivedIndices(std::vector<uint>());
     createTestSubject(communicator);
 
@@ -372,7 +371,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, emptyR
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, zeroRecvIndexY)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     communicator.setReceivedIndices({ 0 });
     createTestSubject(communicator);
 
@@ -382,7 +381,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, zeroRe
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, oneRecvIndexY)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10 };
     std::vector<uint> receivedIndicesByComm(4, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -396,7 +395,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, oneRec
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, threeRecvIndicesY)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10, 20, 30 };
     std::vector<uint> receivedIndicesByComm(5, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -411,7 +410,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, threeR
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, sixRecvIndicesY)
 {
     // this test shows the limits of the current approach. The last index is always deleted
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10, 20, 30, 40, 50 };
     std::vector<uint> receivedIndicesByComm = { 10, 20, 30, 40, 50, 60 };
     communicator.setReceivedIndices(receivedIndicesByComm);
@@ -424,7 +423,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, sixRec
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCY, recvIndicesYContainZero)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 0, 20, 30, 40 };
     std::vector<uint> receivedIndicesByComm(6, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -440,9 +439,9 @@ class IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ : public
 {
 
 public:
-    void createTestSubject(vf::gpu::CommunicationRoutine &CommunicationRoutine)
+    void createTestSubject(vf::parallel::Communicator &Communicator)
     {
-        sut = std::make_unique<IndexRearrangementForStreams>(para, builder, CommunicationRoutine);
+        sut = std::make_unique<IndexRearrangementForStreams>(para, builder, Communicator);
     }
 
 protected:
@@ -481,7 +480,7 @@ private:
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, emptyRecvInZ)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     communicator.setReceivedIndices(std::vector<uint>());
     createTestSubject(communicator);
 
@@ -491,7 +490,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, emptyR
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, zeroRecvIndexZ)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     communicator.setReceivedIndices({ 0 });
     createTestSubject(communicator);
 
@@ -501,7 +500,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, zeroRe
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, oneRecvIndexZ)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10 };
     std::vector<uint> receivedIndicesBZComm(4, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesBZComm.begin());
@@ -515,7 +514,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, oneRec
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, threeRecvIndicesZ)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10, 20, 30 };
     std::vector<uint> receivedIndicesBZComm(5, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesBZComm.begin());
@@ -530,7 +529,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, threeR
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, sixRecvIndicesYZ)
 {
     // this test shows the limits of the current approach. The last index is always deleted
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 10, 20, 30, 40, 50 };
     std::vector<uint> receivedIndicesByComm = { 10, 20, 30, 40, 50, 60 };
     communicator.setReceivedIndices(receivedIndicesByComm);
@@ -543,7 +542,7 @@ TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, sixRec
 
 TEST_F(IndexRearrangementForStreamsTest_exchangeIndicesForCommAfterFtoCZ, recvIndicesZContainZero)
 {
-    CommunicationRoutineDouble communicator;
+    CommunicatorDouble communicator;
     std::vector<uint> expected = { 0, 20, 30, 40 };
     std::vector<uint> receivedIndicesByComm(6, 0);
     std::copy(expected.begin(), expected.end(), receivedIndicesByComm.begin());
@@ -614,7 +613,7 @@ private:
             IndexRearrangementForStreams(para, builder, communicator));
     };
 
-    vf::gpu::test::CommunicationRoutineTestDouble communicator;
+    vf::parallel::NullCommunicator communicator;
 };
 
 TEST_F(IndexRearrangementForStreamsTest_reorderRecvIndicesX, noSendIndicesForCommunicationAfterScalingFineToCoarse_receiveIndicesAreUnchanged)
diff --git a/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu b/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu
index e447062d292908c02800c4559cc4444476290629..242038afcea351c0d9187a606d82d5bcd16c214c 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu
@@ -13,7 +13,7 @@
 
 #include <iomanip>
 
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 #include "Parameter/Parameter.h"
 // includes, kernels
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
index 877390c822b4828b0007249be524d2534a2482f0..74ebf3bea73c221207d3dda7a6a2f29de083ffde 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
@@ -64,16 +64,17 @@ __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
     real* forces,
     bool EvenOrOdd);
 
-__global__ void LB_Kernel_Cumulant_D3Q27All4(real omega,
-                                                        unsigned int* bcMatD,
-                                                        unsigned int* neighborX,
-                                                        unsigned int* neighborY,
-                                                        unsigned int* neighborZ,
-                                                        real* DDStart,
-                                                        unsigned long long numberOfLBnodes,
-                                                        int level,
-                                                        real* forces,
-                                                        bool EvenOrOdd);
+__global__ void K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device(
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 
 __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega,
diff --git a/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu b/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu
index df88632f8fd48b3ae8d50b444a65076ab0a0c12f..59b1b6494479e256e910d750e239d707573e2f71 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu
@@ -14,7 +14,7 @@
 
 #include <iomanip>
 
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 #include "Parameter/Parameter.h"
 // includes, kernels
diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
index 0a54db35bc4598702f3c3a3b194eb054a9ca478a..e9bd3ea551e93cb82baa85bf759d93b7a7d4dde0 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
@@ -11,7 +11,7 @@
 #include <helper_cuda.h>
 
 #include "LBM/LB.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 // includes, kernels
 #include "GPU/GPU_Kernels.cuh"
diff --git a/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu b/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu
index d00941aba35d2885e893eea1ffe23c89002046c4..be1159d15440c63187a8e29e7db89343ca785be4 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu
@@ -34,7 +34,7 @@
 #include "TurbulentViscosityKernels.h"
 #include "basics/constants/NumericConstants.h"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 #include <cuda_runtime.h>
 #include <helper_cuda.h>
 #include "LBM/LB.h"
diff --git a/src/gpu/VirtualFluids_GPU/Init/VfReader.cpp b/src/gpu/VirtualFluids_GPU/Init/VfReader.cpp
index 46f6254f7cf2e8ce53ee6f47d69db76405b52dd6..1406abff0ed77399333fda33353f9f231953d3df 100644
--- a/src/gpu/VirtualFluids_GPU/Init/VfReader.cpp
+++ b/src/gpu/VirtualFluids_GPU/Init/VfReader.cpp
@@ -1,7 +1,6 @@
 #include "Init/VfReader.h"
 
 #include "Parameter/Parameter.h"
-#include "Communication/Communicator.h"
 #include "Init/PositionReader.h"
 #include "GPU/CudaMemoryManager.h"
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.cu
new file mode 100644
index 0000000000000000000000000000000000000000..955dc0736de37ed3ad680a99ced5bb0e55d77b11
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.cu
@@ -0,0 +1,40 @@
+#include "B15CompressibleNavierStokesBGKplus.h"
+
+#include "B15CompressibleNavierStokesBGKplus_Device.cuh"
+#include "Parameter/Parameter.h"
+#include "cuda_helper/CudaGrid.h"
+
+std::shared_ptr<B15CompressibleNavierStokesBGKplus> B15CompressibleNavierStokesBGKplus::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<B15CompressibleNavierStokesBGKplus>(new B15CompressibleNavierStokesBGKplus(para, level));
+}
+
+void B15CompressibleNavierStokesBGKplus::run()
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    B15CompressibleNavierStokesBGKplus_Device<<<grid.grid, grid.threads>>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("B15CompressibleNavierStokesBGKplus_Device execution failed");
+}
+
+B15CompressibleNavierStokesBGKplus::B15CompressibleNavierStokesBGKplus(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+
+	myPreProcessorTypes.push_back(InitCompSP27);
+
+	
+}
+
+B15CompressibleNavierStokesBGKplus::B15CompressibleNavierStokesBGKplus()
+{
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.h
new file mode 100644
index 0000000000000000000000000000000000000000..0347e30dc1aec97bcdd6e21eb58cf929084987cc
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.h
@@ -0,0 +1,17 @@
+#ifndef B15CompressibleNavierStokesBGKplus_H
+#define B15CompressibleNavierStokesBGKplus_H
+
+#include "Kernel/KernelImp.h"
+
+class B15CompressibleNavierStokesBGKplus : public KernelImp
+{
+public:
+	static std::shared_ptr<B15CompressibleNavierStokesBGKplus> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	B15CompressibleNavierStokesBGKplus();
+	B15CompressibleNavierStokesBGKplus(std::shared_ptr< Parameter> para, int level);
+};
+
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.cu
similarity index 83%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.cu
index 0a5ac6cf7a1b6564a61d0150b187b10b584222b8..bafd4477dc611b77f17c896dc85832b71acdccc0 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.cu
@@ -1,4 +1,4 @@
-#include "BGKUnified.h"
+#include "B15CompressibleNavierStokesBGKplusUnified.h"
 
 #include <stdexcept>
 
@@ -15,7 +15,7 @@ namespace gpu
 {
 
 
-BGKUnified::BGKUnified(std::shared_ptr<Parameter> para, int level) 
+B15CompressibleNavierStokesBGKplusUnified::B15CompressibleNavierStokesBGKplusUnified(std::shared_ptr<Parameter> para, int level) 
     : KernelImp(para, level)
 {
 #ifndef BUILD_CUDA_LTO
@@ -30,7 +30,7 @@ BGKUnified::BGKUnified(std::shared_ptr<Parameter> para, int level)
 }
 
 
-void BGKUnified::run()
+void B15CompressibleNavierStokesBGKplusUnified::run()
 {
     GPUKernelParameter kernelParameter{
         para->getParD(level)->omega,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.h
new file mode 100644
index 0000000000000000000000000000000000000000..ffc8ce41d13369b78d19ff0d55bab988696cdb5d
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.h
@@ -0,0 +1,22 @@
+#ifndef B15CompressibleNavierStokesBGKplusUnified_H
+#define B15CompressibleNavierStokesBGKplusUnified_H
+
+#include "Kernel/KernelImp.h"
+
+namespace vf
+{
+namespace gpu
+{
+
+class B15CompressibleNavierStokesBGKplusUnified : public KernelImp
+{
+public:
+    B15CompressibleNavierStokesBGKplusUnified(std::shared_ptr<Parameter> para, int level);
+
+    void run();
+};
+
+}
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus_Device.cu
index 638210bd2da8ebf30bda603a3f6d70c19468193e..b21213bf58fd786a4006faf485f18e5c18694e2e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_BGK_Plus_Comp_SP_27(
+__global__ void B15CompressibleNavierStokesBGKplus_Device(
 	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..2a4775b95d0b4d371fadb332a08868fda0fafd37
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus_Device.cuh
@@ -0,0 +1,16 @@
+#ifndef B15CompressibleNavierStokesBGKplus_Device_H
+#define B15CompressibleNavierStokesBGKplus_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void B15CompressibleNavierStokesBGKplus_Device(
+	real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	bool EvenOrOdd);
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.cu
similarity index 55%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.cu
index 4aef26b7dd31435b2dadceb78ac1e0b7ebedf029..cf5971023e5f1110dd8bfb11bff38626ecc5dc7a 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "BGKCompSP27.h"
+#include "B92CompressibleNavierStokes.h"
 
-#include "BGKCompSP27_Device.cuh"
+#include "B92CompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<BGKCompSP27> BGKCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<B92CompressibleNavierStokes> B92CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<BGKCompSP27>(new BGKCompSP27(para, level));
+	return std::shared_ptr<B92CompressibleNavierStokes>(new B92CompressibleNavierStokes(para, level));
 }
 
-void BGKCompSP27::run()
+void B92CompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_BGK_Comp_SP_27<<< grid.grid, grid.threads >>>(
+    B92CompressibleNavierStokes_Device<<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,7 +25,7 @@ void BGKCompSP27::run()
     getLastCudaError("LB_Kernel_BGK_Comp_SP_27 execution failed");
 }
 
-BGKCompSP27::BGKCompSP27(std::shared_ptr<Parameter> para, int level)
+B92CompressibleNavierStokes::B92CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -34,6 +34,6 @@ BGKCompSP27::BGKCompSP27(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-BGKCompSP27::BGKCompSP27()
+B92CompressibleNavierStokes::B92CompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..8b7ba23b33c6c78c1a87113a4e61748da42d400d
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.h
@@ -0,0 +1,16 @@
+#ifndef B92CompressibleNavierStokes_H
+#define B92CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class B92CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<B92CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+	
+private:
+	B92CompressibleNavierStokes();
+	B92CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes_Device.cu
index 44add98d9607642531a6068021d0a4e831cb3d4e..d032936a96f77304071d014590e35512c1ca7771 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes_Device.cu
@@ -7,7 +7,7 @@ using namespace vf::lbm::dir;
 #include "math.h"
 
 
-__global__ void LB_Kernel_BGK_Comp_SP_27(	real omega,
+__global__ void B92CompressibleNavierStokes_Device(	real omega,
 														unsigned int* bcMatD,
 														unsigned int* neighborX,
 														unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..4e0450452ddeca71cfd7c76074988159e51fa78d
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes_Device.cuh
@@ -0,0 +1,17 @@
+#ifndef B92CompressibleNavierStokes_Device_H
+#define B92CompressibleNavierStokes_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void B92CompressibleNavierStokes_Device(
+	real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	bool EvenOrOdd);
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.cu
similarity index 52%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.cu
index 664b46fcebd277b0c93300d86b2171edf4f91b2a..2f906587857bfa6cf90d0441a5488efefc140f3d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "CascadeCompSP27.h"
+#include "C06CompressibleNavierStokes.h"
 
-#include "CascadeCompSP27_Device.cuh"
+#include "C06CompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CascadeCompSP27> CascadeCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<C06CompressibleNavierStokes> C06CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CascadeCompSP27>(new CascadeCompSP27(para, level));
+	return std::shared_ptr<C06CompressibleNavierStokes>(new C06CompressibleNavierStokes(para, level));
 }
 
-void CascadeCompSP27::run()
+void C06CompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_Cascade_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+    C06CompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,7 +25,7 @@ void CascadeCompSP27::run()
     getLastCudaError("LB_Kernel_Cascade_Comp_SP_27 execution failed");
 }
 
-CascadeCompSP27::CascadeCompSP27(std::shared_ptr<Parameter> para, int level)
+C06CompressibleNavierStokes::C06CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -35,6 +35,6 @@ CascadeCompSP27::CascadeCompSP27(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-CascadeCompSP27::CascadeCompSP27()
+C06CompressibleNavierStokes::C06CompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..8004ad52ea2471ed6319fc373175e509dedef5ff
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.h
@@ -0,0 +1,16 @@
+#ifndef C06CompressibleNavierStokes_H
+#define C06CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class C06CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<C06CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	C06CompressibleNavierStokes();
+	C06CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes_Device.cu
index 6bd4415c7edcb5c9954874c074801b865cce3efe..6cf0fd639523d4cef8290f860f03b4bc75e3252c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_Cascade_Comp_SP_27(real omega,
+__global__ void C06CompressibleNavierStokes_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes_Device.cuh
similarity index 57%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes_Device.cuh
index 947ce68259432efe87af84fd9986916e62521397..fb8fc657a03c89efbad879ca1c9b4e493acabd86 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes_Device.cuh
@@ -1,10 +1,11 @@
-#ifndef LB_KERNEL_MRT_COMP_SP_27_H
-#define LB_KERNEL_MRT_COMP_SP_27_H
+#ifndef C06CompressibleNavierStokes_Device_H
+#define C06CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_MRT_Comp_SP_27(real omega,
+__global__ void C06CompressibleNavierStokes_Device(
+	real s9,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/FluidFlowCompStrategy.cpp
similarity index 100%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.cpp
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/FluidFlowCompStrategy.cpp
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/FluidFlowCompStrategy.h
similarity index 100%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/FluidFlowCompStrategy.h
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.cu
similarity index 52%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.cu
index 218623b7c51099717f6aaa6f375a82516e0c0dae..7e8a0f5af702da465116320c0a02638b4a5274f9 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "CumulantCompSP27.h"
+#include "K08CompressibleNavierStokes.h"
 
-#include "CumulantCompSP27_Device.cuh"
+#include "K08CompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CumulantCompSP27> CumulantCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K08CompressibleNavierStokes> K08CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantCompSP27>(new CumulantCompSP27(para, level));
+	return std::shared_ptr<K08CompressibleNavierStokes>(new K08CompressibleNavierStokes(para, level));
 }
 
-void CumulantCompSP27::run()
+void K08CompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_Cum_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+    K08CompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -26,7 +26,7 @@ void CumulantCompSP27::run()
 }
 
 
-CumulantCompSP27::CumulantCompSP27(std::shared_ptr<Parameter> para, int level)
+K08CompressibleNavierStokes::K08CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -36,6 +36,6 @@ CumulantCompSP27::CumulantCompSP27(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-CumulantCompSP27::CumulantCompSP27()
+K08CompressibleNavierStokes::K08CompressibleNavierStokes()
 {
 }
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..2f91a459818173775aeb0b966ec6677fe7803b48
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.h
@@ -0,0 +1,17 @@
+#ifndef K08CompressibleNavierStokes_H
+#define K08CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class K08CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<K08CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K08CompressibleNavierStokes();
+	K08CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes_Device.cu
index 6ab3385b86611614eceeb0018f6beef73031711c..021ec25f3d70802402bb2d96ca6a462e60774982 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_Cum_Comp_SP_27(real omega,
+__global__ void K08CompressibleNavierStokes_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes_Device.cuh
similarity index 57%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes_Device.cuh
index 8a49bd02af3ab420b42bc257e8668dd3ff9eca2c..b2a6d02b6ab40e8dc89238b207c7f274ab7fe828 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes_Device.cuh
@@ -1,10 +1,11 @@
-#ifndef LB_KERNEL_CASCADE_COMP_SP_27_H
-#define LB_KERNEL_CASCADE_COMP_SP_27_H
+#ifndef K08CompressibleNavierStokes_Device_H
+#define K08CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_Cascade_Comp_SP_27(real s9,
+__global__ void K08CompressibleNavierStokes_Device(
+	real s9,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.cu
similarity index 63%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.cu
index 09a3aa1cdb1a3cf9c01002a9d335c5a907f94917..086914172185a45a7a84873ded4726ea77bc0985 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.cu
@@ -1,15 +1,15 @@
-#include "CumulantK15Comp.h"
+#include "K15CompressibleNavierStokes.h"
 
-#include "CumulantK15Comp_Device.cuh"
+#include "K15CompressibleNavierStokes_Device.cuh"
 
 #include "Parameter/Parameter.h"
 
-std::shared_ptr<CumulantK15Comp> CumulantK15Comp::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K15CompressibleNavierStokes> K15CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantK15Comp>(new CumulantK15Comp(para, level));
+	return std::shared_ptr<K15CompressibleNavierStokes>(new K15CompressibleNavierStokes(para, level));
 }
 
-void CumulantK15Comp::run()
+void K15CompressibleNavierStokes::run()
 {
 	int numberOfThreads = para->getParD(level)->numberofthreads;
 	int size_Mat = (int)para->getParD(level)->numberOfNodes;
@@ -29,7 +29,7 @@ void CumulantK15Comp::run()
 	dim3 grid(Grid1, Grid2, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_CumulantK15Comp <<< grid, threads >>>(
+	K15CompressibleNavierStokes_Device <<< grid, threads >>>(
 		para->getParD(level)->omega,
 		para->getParD(level)->typeOfGridNode,
 		para->getParD(level)->neighborX,
@@ -43,7 +43,7 @@ void CumulantK15Comp::run()
 	getLastCudaError("LB_Kernel_CumulantK15Comp execution failed");
 }
 
-CumulantK15Comp::CumulantK15Comp(std::shared_ptr<Parameter> para, int level)
+K15CompressibleNavierStokes::K15CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..2410a8eb2d744bba87f5642218f22c9d9ab39fd1
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.h
@@ -0,0 +1,16 @@
+#ifndef K15CompressibleNavierStokes_H
+#define K15CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class K15CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr< K15CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K15CompressibleNavierStokes();
+	K15CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.cu
new file mode 100644
index 0000000000000000000000000000000000000000..b52f6cc855a5d4dba45b3106841e7951a1d7f3b3
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.cu
@@ -0,0 +1,42 @@
+#include "K15CompressibleNavierStokesBulkViscosity.h"
+
+#include "K15CompressibleNavierStokesBulkViscosity_Device.cuh"
+#include "Parameter/Parameter.h"
+#include <cuda_helper/CudaGrid.h>
+
+std::shared_ptr<K15CompressibleNavierStokesBulkViscosity> K15CompressibleNavierStokesBulkViscosity::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<K15CompressibleNavierStokesBulkViscosity>(new K15CompressibleNavierStokesBulkViscosity(para, level));
+}
+
+void K15CompressibleNavierStokesBulkViscosity::run()
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    K15CompressibleNavierStokesBulkViscosity_Device <<<grid.grid, grid.threads>>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        level,
+        para->getForcesDev(),
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_CumulantK15BulkComp execution failed");
+}
+
+K15CompressibleNavierStokesBulkViscosity::K15CompressibleNavierStokesBulkViscosity(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+
+	myPreProcessorTypes.push_back(InitCompSP27);
+
+	
+}
+
+K15CompressibleNavierStokesBulkViscosity::K15CompressibleNavierStokesBulkViscosity()
+{
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.h
new file mode 100644
index 0000000000000000000000000000000000000000..a29eb1b4e8712eb0ad0a1d1519840597620d91c6
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.h
@@ -0,0 +1,17 @@
+#ifndef K15CompressibleNavierStokesBulkViscosity_H
+#define K15CompressibleNavierStokesBulkViscosity_H
+
+#include "Kernel/KernelImp.h"
+
+class K15CompressibleNavierStokesBulkViscosity : public KernelImp
+{
+public:
+	static std::shared_ptr<K15CompressibleNavierStokesBulkViscosity> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K15CompressibleNavierStokesBulkViscosity();
+	K15CompressibleNavierStokesBulkViscosity(std::shared_ptr< Parameter> para, int level);
+};
+
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity_Device.cu
index c0e48a9d5754f79d62b11129cef754adf91dbe03..91716f420dbff6aeb6d6505e1ff6fbc76dfbf92c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK15BulkComp(real omega,
+__global__ void K15CompressibleNavierStokesBulkViscosity_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..18c2a7a3400ce2511a17b589ca25236876af84d8
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity_Device.cuh
@@ -0,0 +1,19 @@
+#ifndef K15CompressibleNavierStokesBulkViscosity_Device_H
+#define K15CompressibleNavierStokesBulkViscosity_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+
+__global__ void K15CompressibleNavierStokesBulkViscosity_Device(real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	int level,
+	real* forces,
+	bool EvenOrOdd);
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.cu
similarity index 53%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.cu
index 69f84b0671c11fad8ae15676230c491ee815153d..eadf2a147ed526943d1ada85474dfd0ba522cd38 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.cu
@@ -1,19 +1,19 @@
-#include "CumulantK15SpongeComp.h"
+#include "K15CompressibleNavierStokesSponge.h"
 
-#include "CumulantK15SpongeComp_Device.cuh"
+#include "K15CompressibleNavierStokesSponge_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CumulantK15SpongeComp> CumulantK15SpongeComp::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K15CompressibleNavierStokesSponge> K15CompressibleNavierStokesSponge::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantK15SpongeComp>(new CumulantK15SpongeComp(para, level));
+	return std::shared_ptr<K15CompressibleNavierStokesSponge>(new K15CompressibleNavierStokesSponge(para, level));
 }
 
-void CumulantK15SpongeComp::run()
+void K15CompressibleNavierStokesSponge::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_CumulantK15SpongeComp <<< grid.grid, grid.threads >>>(
+    K15CompressibleNavierStokesSponge_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -28,7 +28,7 @@ void CumulantK15SpongeComp::run()
     getLastCudaError("LB_Kernel_CumulantK15SpongeComp execution failed");
 }
 
-CumulantK15SpongeComp::CumulantK15SpongeComp(std::shared_ptr<Parameter> para, int level)
+K15CompressibleNavierStokesSponge::K15CompressibleNavierStokesSponge(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -38,6 +38,6 @@ CumulantK15SpongeComp::CumulantK15SpongeComp(std::shared_ptr<Parameter> para, in
 	
 }
 
-CumulantK15SpongeComp::CumulantK15SpongeComp()
+K15CompressibleNavierStokesSponge::K15CompressibleNavierStokesSponge()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.h
new file mode 100644
index 0000000000000000000000000000000000000000..cff5a369bc68d868a041f436b2dd3975b66775ed
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.h
@@ -0,0 +1,17 @@
+#ifndef K15CompressibleNavierStokesSponge_H
+#define K15CompressibleNavierStokesSponge_H
+
+#include "Kernel/KernelImp.h"
+
+class K15CompressibleNavierStokesSponge : public KernelImp
+{
+public:
+	static std::shared_ptr<K15CompressibleNavierStokesSponge> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K15CompressibleNavierStokesSponge();
+	K15CompressibleNavierStokesSponge(std::shared_ptr< Parameter> para, int level);
+
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge_Device.cu
index 20f3f913589f26978dcf713cd0175fc2ad425545..6b3a06614a1bec560e8d361c3610f9a00a0cdaf3 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK15SpongeComp(real omegaIn,
+__global__ void K15CompressibleNavierStokesSponge_Device(real omegaIn,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge_Device.cuh
similarity index 59%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge_Device.cuh
index 3a526112e56947a77d5ac337052d62e95dd4e578..b79c2a9941c44c12f1e5eadf0b66a1402f394856 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge_Device.cuh
@@ -1,10 +1,10 @@
-#ifndef LB_KERNEL_CUMULANT_K15_SPONGE_COMP_H
-#define LB_KERNEL_CUMULANT_K15_SPONGE_COMP_H
+#ifndef K15CompressibleNavierStokesSponge_Device_H
+#define K15CompressibleNavierStokesSponge_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_CumulantK15SpongeComp(real omega,
+__global__ void K15CompressibleNavierStokesSponge_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.cu
similarity index 85%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.cu
index c95289f15fe13decbbe173e17f5d4255b8ef80b5..6e1fbfbe60808fda3980fff462f237096b6a4568 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.cu
@@ -1,4 +1,4 @@
-#include "CumulantK15Unified.h"
+#include "K15CompressibleNavierStokesUnified.h"
 
 #include <stdexcept>
 
@@ -13,7 +13,7 @@ namespace vf
 namespace gpu
 {
 
-CumulantK15Unified::CumulantK15Unified(std::shared_ptr<Parameter> para, int level)
+K15CompressibleNavierStokesUnified::K15CompressibleNavierStokesUnified(std::shared_ptr<Parameter> para, int level)
     : KernelImp(para, level)
 {
 #ifndef BUILD_CUDA_LTO
@@ -28,7 +28,7 @@ CumulantK15Unified::CumulantK15Unified(std::shared_ptr<Parameter> para, int leve
     this->cudaGrid = cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 }
 
-void CumulantK15Unified::run()
+void K15CompressibleNavierStokesUnified::run()
 {
     GPUKernelParameter kernelParameter{
         para->getParD(level)->omega,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.h
new file mode 100644
index 0000000000000000000000000000000000000000..e16211520a4e310d4ee1a73c00437a4d18441354
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.h
@@ -0,0 +1,21 @@
+#ifndef K15CompressibleNavierStokesUnified_H
+#define K15CompressibleNavierStokesUnified_H
+
+#include "Kernel/KernelImp.h"
+
+namespace vf
+{
+namespace gpu
+{
+class K15CompressibleNavierStokesUnified : public KernelImp
+{
+public:
+    K15CompressibleNavierStokesUnified(std::shared_ptr<Parameter> para, int level);
+    
+    void run();
+};
+
+}
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes_Device.cu
index 9c5d484ee00c1dfab92e1d5eaf0cdffb61fd122b..e38c24d6557c0abc64681a71fc63c51b866fb25a 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK15Comp(real omega,
+__global__ void K15CompressibleNavierStokes_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes_Device.cuh
similarity index 59%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes_Device.cuh
index e1d60ab0a181b88fba81bdb5ff649d7971c235a7..0dfdb3488136575921eb169cde4364d9de1507f5 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes_Device.cuh
@@ -1,11 +1,11 @@
-#ifndef LB_KERNEL_CUMULANT_K15_BULK_COMP_H
-#define LB_KERNEL_CUMULANT_K15_BULK_COMP_H
+#ifndef K15CompressibleNavierStokes_Device_H
+#define K15CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-
-__global__ void LB_Kernel_CumulantK15BulkComp(real omega,
+__global__ void K15CompressibleNavierStokes_Device(	
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
@@ -15,5 +15,4 @@ __global__ void LB_Kernel_CumulantK15BulkComp(real omega,
 	int level,
 	real* forces,
 	bool EvenOrOdd);
-
 #endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.cu
similarity index 86%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.cu
index b31e4964b609bcee1c3015dcf950b540977f8333..fccd9bfd246c9bd927bd9dcce6da8993e3d57374 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.cu
@@ -1,21 +1,21 @@
-#include "CumulantK17.h"
+#include "K17CompressibleNavierStokes.h"
 #include <logger/Logger.h>
 #include "Parameter/Parameter.h"
 #include "Parameter/CudaStreamManager.h"
-#include "CumulantK17_Device.cuh"
+#include "K17CompressibleNavierStokes_Device.cuh"
 
 #include <cuda.h>
 
 template<TurbulenceModel turbulenceModel>
-std::shared_ptr< CumulantK17<turbulenceModel> > CumulantK17<turbulenceModel>::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr< K17CompressibleNavierStokes<turbulenceModel> > K17CompressibleNavierStokes<turbulenceModel>::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-    return std::shared_ptr<CumulantK17<turbulenceModel> >(new CumulantK17<turbulenceModel>(para,level));
+    return std::shared_ptr<K17CompressibleNavierStokes<turbulenceModel> >(new K17CompressibleNavierStokes<turbulenceModel>(para,level));
 }
 
 template<TurbulenceModel turbulenceModel>
-void CumulantK17<turbulenceModel>::run()
+void K17CompressibleNavierStokes<turbulenceModel>::run()
 {
-    LB_Kernel_CumulantK17 < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads >>>(   para->getParD(level)->omega,
+    K17CompressibleNavierStokes_Device < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads >>>(   para->getParD(level)->omega,
                                                                                                         para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
                                                                                                         para->getParD(level)->distributions.f[0],
                                                                                                         para->getParD(level)->rho,
@@ -31,18 +31,18 @@ void CumulantK17<turbulenceModel>::run()
                                                                                                         para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::Default],
                                                                                                         para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default]);
 
-    getLastCudaError("LB_Kernel_CumulantK17 execution failed");
+    getLastCudaError("K17CompressibleNavierStokes_Device execution failed");
 }
 
 template<TurbulenceModel turbulenceModel>
-void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIndex )
+void K17CompressibleNavierStokes<turbulenceModel>::runOnIndices( const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIndex )
 {
     cudaStream_t stream = para->getStreamManager()->getStream(streamIndex);
 
     switch (collisionTemplate)
     {
         case CollisionTemplate::Default:
-            LB_Kernel_CumulantK17 < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(para->getParD(level)->omega,
+            K17CompressibleNavierStokes_Device < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(para->getParD(level)->omega,
                                                                                                                         para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
                                                                                                                         para->getParD(level)->distributions.f[0],
                                                                                                                         para->getParD(level)->rho,
@@ -60,7 +60,7 @@ void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, un
             break;
 
         case CollisionTemplate::WriteMacroVars:
-            LB_Kernel_CumulantK17 < turbulenceModel, true, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,
+            K17CompressibleNavierStokes_Device < turbulenceModel, true, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,
                                                                                                                         para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
                                                                                                                         para->getParD(level)->distributions.f[0],
                                                                                                                         para->getParD(level)->rho,
@@ -79,7 +79,7 @@ void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, un
 
         case CollisionTemplate::SubDomainBorder:
         case CollisionTemplate::AllFeatures:
-            LB_Kernel_CumulantK17 < turbulenceModel, true, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(  para->getParD(level)->omega,
+            K17CompressibleNavierStokes_Device < turbulenceModel, true, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(  para->getParD(level)->omega,
                                                                                                                         para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
                                                                                                                         para->getParD(level)->distributions.f[0],
                                                                                                                         para->getParD(level)->rho,
@@ -97,7 +97,7 @@ void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, un
             break;
 
         case CollisionTemplate::ApplyBodyForce:
-            LB_Kernel_CumulantK17 < turbulenceModel, false, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,
+            K17CompressibleNavierStokes_Device < turbulenceModel, false, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,
                                                                                                                         para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
                                                                                                                         para->getParD(level)->distributions.f[0],
                                                                                                                         para->getParD(level)->rho,
@@ -118,11 +118,11 @@ void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, un
             break;
     }
 
-    getLastCudaError("LB_Kernel_CumulantK17 execution failed");
+    getLastCudaError("K17CompressibleNavierStokes_Device execution failed");
 }
 
 template<TurbulenceModel turbulenceModel>
-CumulantK17<turbulenceModel>::CumulantK17(std::shared_ptr<Parameter> para, int level)
+K17CompressibleNavierStokes<turbulenceModel>::K17CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
     this->para = para;
     this->level = level;
@@ -137,7 +137,7 @@ CumulantK17<turbulenceModel>::CumulantK17(std::shared_ptr<Parameter> para, int l
     VF_LOG_INFO("Using turbulence model: {}", turbulenceModel);
 }
 
-template class CumulantK17<TurbulenceModel::AMD>;
-template class CumulantK17<TurbulenceModel::Smagorinsky>;
-template class CumulantK17<TurbulenceModel::QR>;
-template class CumulantK17<TurbulenceModel::None>;
+template class K17CompressibleNavierStokes<TurbulenceModel::AMD>;
+template class K17CompressibleNavierStokes<TurbulenceModel::Smagorinsky>;
+template class K17CompressibleNavierStokes<TurbulenceModel::QR>;
+template class K17CompressibleNavierStokes<TurbulenceModel::None>;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..543b2de3e2ef9ad7c4bf4881aae2afb6110ec552
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.h
@@ -0,0 +1,20 @@
+#ifndef K17CompressibleNavierStokes_H
+#define K17CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+#include "Parameter/Parameter.h"
+
+template<TurbulenceModel turbulenceModel> 
+class K17CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr< K17CompressibleNavierStokes<turbulenceModel> > getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run() override;
+    void runOnIndices(const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIndex) override;
+
+private:
+    K17CompressibleNavierStokes();
+    K17CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level);
+};
+
+#endif 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.cu
new file mode 100644
index 0000000000000000000000000000000000000000..bf6e7801cfc5c6c431f10f12d41521842955d7b4
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.cu
@@ -0,0 +1,47 @@
+#include "K17CompressibleNavierStokesBulkViscosity.h"
+
+#include "K17CompressibleNavierStokesBulkViscosity_Device.cuh"
+#include "Parameter/Parameter.h"
+
+std::shared_ptr<K17CompressibleNavierStokesBulkViscosity> K17CompressibleNavierStokesBulkViscosity::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<K17CompressibleNavierStokesBulkViscosity>(new K17CompressibleNavierStokesBulkViscosity(para, level));
+}
+
+void K17CompressibleNavierStokesBulkViscosity::run()
+{
+	int size_Array = para->getParD(level)->size_Array_SP;
+	int numberOfThreads = para->getParD(level)->numberofthreads;
+
+	int Grid = size_Array / numberOfThreads;
+	dim3 grid(Grid, 1, 1);
+	dim3 threads(numberOfThreads, 1, 1);
+
+	K17CompressibleNavierStokesBulkViscosity_Device << < grid, threads >> >(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getForcesDev(),
+		para->getQuadricLimitersDev(),
+		para->getParD(level)->isEvenTimestep);
+	getLastCudaError("K17CompressibleNavierStokesBulkViscosity_Device execution failed");
+}
+
+K17CompressibleNavierStokesBulkViscosity::K17CompressibleNavierStokesBulkViscosity(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+
+	myPreProcessorTypes.push_back(InitCompSP27);
+
+	
+}
+
+K17CompressibleNavierStokesBulkViscosity::K17CompressibleNavierStokesBulkViscosity()
+{
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.h
new file mode 100644
index 0000000000000000000000000000000000000000..9411cc4969af4fcd13f1a853710510a40fdf5069
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.h
@@ -0,0 +1,17 @@
+#ifndef K17CompressibleNavierStokesBulkViscosity_H
+#define K17CompressibleNavierStokesBulkViscosity_H
+
+#include "Kernel/KernelImp.h"
+
+class K17CompressibleNavierStokesBulkViscosity : public KernelImp
+{
+public:
+	static std::shared_ptr<K17CompressibleNavierStokesBulkViscosity> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K17CompressibleNavierStokesBulkViscosity();
+	K17CompressibleNavierStokesBulkViscosity(std::shared_ptr< Parameter> para, int level);
+
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity_Device.cu
index 5e98ebe6db990f5d16fd9d7a839c0e5f0927ba87..1803c083f8f04182cbe1556c33936fc052499596 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK17BulkComp(real omega,
+__global__ void K17CompressibleNavierStokesBulkViscosity_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..62b349df5750bd5baf743feb52e14146aeddea2b
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity_Device.cuh
@@ -0,0 +1,18 @@
+#ifndef K17CompressibleNavierStokesBulkViscosity_Device_H
+#define K17CompressibleNavierStokesBulkViscosity_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void K17CompressibleNavierStokesBulkViscosity_Device(real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	int level,
+	real* forces,
+    real* quadricLimiters,
+	bool EvenOrOdd);
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.cu
new file mode 100644
index 0000000000000000000000000000000000000000..0f637558ba9ed16afb0311ab4eefba5d7b4d1208
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.cu
@@ -0,0 +1,38 @@
+#include "K17CompressibleNavierStokesChimeraLegacy.h"
+
+#include "Parameter/Parameter.h"
+#include "K17CompressibleNavierStokesChimeraLegacy_Device.cuh"
+#include "cuda_helper/CudaGrid.h"
+
+std::shared_ptr<K17CompressibleNavierStokesChimeraLegacy> K17CompressibleNavierStokesChimeraLegacy::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<K17CompressibleNavierStokesChimeraLegacy>(new K17CompressibleNavierStokesChimeraLegacy(para,level));
+}
+
+void K17CompressibleNavierStokesChimeraLegacy::run()
+{
+	K17CompressibleNavierStokesChimeraLegacy_Device <<< cudaGrid.grid, cudaGrid.threads >>>(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getIsBodyForce(),
+		para->getForcesDev(),
+		para->getParD(level)->forceX_SP,
+		para->getParD(level)->forceY_SP,
+		para->getParD(level)->forceZ_SP,
+        para->getQuadricLimitersDev(),
+		para->getParD(level)->isEvenTimestep);
+	getLastCudaError("K17CompressibleNavierStokesChimeraLegacy_Device execution failed");
+}
+
+K17CompressibleNavierStokesChimeraLegacy::K17CompressibleNavierStokesChimeraLegacy(std::shared_ptr<Parameter> para, int level): KernelImp(para, level)
+{
+	myPreProcessorTypes.push_back(InitCompSP27);
+	
+	this->cudaGrid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.h
new file mode 100644
index 0000000000000000000000000000000000000000..b611526ce8f53ec0ed8215e3378764cf9858d19b
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.h
@@ -0,0 +1,17 @@
+#ifndef K17CompressibleNavierStokesChimeraLegacy_H
+#define K17CompressibleNavierStokesChimeraLegacy_H
+
+#include "Kernel/KernelImp.h"
+
+class K17CompressibleNavierStokesChimeraLegacy : public KernelImp
+{
+public:
+	static std::shared_ptr<K17CompressibleNavierStokesChimeraLegacy> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+    K17CompressibleNavierStokesChimeraLegacy();
+    K17CompressibleNavierStokesChimeraLegacy(std::shared_ptr<Parameter> para, int level);
+};
+
+#endif 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy_Device.cu
index 1da801654adb3682ea11ca87c7c7a2fd10b065d3..d796f38bca8b7c70940515db78160fe460a702f9 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy_Device.cu
@@ -41,7 +41,7 @@ using namespace vf::lbm::dir;
 using namespace vf::gpu;
 
 ////////////////////////////////////////////////////////////////////////////////
-__global__ void LB_Kernel_CumulantK17CompChim(
+__global__ void K17CompressibleNavierStokesChimeraLegacy_Device(
 	real omega,
 	uint* typeOfGridNode,
 	uint* neighborX,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy_Device.cuh
similarity index 64%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy_Device.cuh
index a480278652ca3bae0122d33b2655e2210d203727..bd2bd08ca184f468bd5491532fc9c444328ab487 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy_Device.cuh
@@ -1,10 +1,10 @@
-#ifndef LB_Kernel_CUMULANT_K17_COMP_CHIM_H
-#define LB_Kernel_CUMULANT_K17_COMP_CHIM_H
+#ifndef K17CompressibleNavierStokesChimeraLegacy_Device_H
+#define K17CompressibleNavierStokesChimeraLegacy_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_CumulantK17CompChim(
+__global__ void K17CompressibleNavierStokesChimeraLegacy_Device(
 	real omega,
 	uint* typeOfGridNode,
 	uint* neighborX,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.cu
new file mode 100644
index 0000000000000000000000000000000000000000..1b3c978487bd8c2cd39ab92e6ac6d2af59c5cf04
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.cu
@@ -0,0 +1,39 @@
+#include "K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.h"
+
+#include "K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cuh"
+#include "Parameter/Parameter.h"
+#include "cuda_helper/CudaGrid.h"
+
+std::shared_ptr<K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants> K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants>(new K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants(para, level));
+}
+
+void K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants::run()
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        level,
+        para->getForcesDev(),
+        para->getQuadricLimitersDev(),
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cumulant_D3Q27All4 execution failed");
+}
+
+K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants::K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+
+	myPreProcessorTypes.push_back(InitCompSP27);
+
+	
+}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.h
new file mode 100644
index 0000000000000000000000000000000000000000..cfc30852016375a4c6512f1ed1e35f069d5e366a
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.h
@@ -0,0 +1,16 @@
+#ifndef K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_H
+#define K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_H
+
+#include "Kernel/KernelImp.h"
+
+class K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants : public KernelImp
+{
+public:
+	static std::shared_ptr<K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+	
+private:
+	K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants();
+	K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cu
index 7a5e39d6f1f95f5b34bb38f1514ab728f477c34b..4919f56979ef004d3d74049feadc43895ad7cf28 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cu
@@ -1,4 +1,4 @@
-#include "CumulantAll4CompSP27_Device.cuh"
+#include "K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cuh"
 
 #include "LBM/LB.h" 
 #include "lbm/constants/D3Q27.h"
@@ -8,17 +8,18 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_Cumulant_D3Q27All4(	real omega,
-															unsigned int* bcMatD,
-															unsigned int* neighborX,
-															unsigned int* neighborY,
-															unsigned int* neighborZ,
-															real* DDStart,
-															int size_Mat,
-															int level,
-															real* forces,
-	                                                        real* quadricLimiters,
-															bool EvenOrOdd)
+__global__ void K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device(	
+	real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	int level,
+	real* forces,
+	real* quadricLimiters,
+	bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..df7f6a09676740503aaed1f4b16b0b8db96624c8
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device.cuh
@@ -0,0 +1,19 @@
+#ifndef K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device_H
+#define K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants_Device(	
+	real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	int level,
+	real* forces,
+    real* quadricLimiters,
+	bool EvenOrOdd);
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.cu
similarity index 80%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.cu
index 59c405ae6e3bb46f608454ddb3a11bb0baac134f..45a998e215b999a9f920358132865fbfccc458aa 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.cu
@@ -1,4 +1,4 @@
-#include "CumulantK17Unified.h"
+#include "K17CompressibleNavierStokesUnified.h"
 
 #include <stdexcept>
 
@@ -13,7 +13,7 @@ namespace gpu
 {
 
 
-CumulantK17Unified::CumulantK17Unified(std::shared_ptr<Parameter> para, int level)
+K17CompressibleNavierStokesUnified::K17CompressibleNavierStokesUnified(std::shared_ptr<Parameter> para, int level)
     : KernelImp(para, level)
 {
 #ifndef BUILD_CUDA_LTO
@@ -29,7 +29,7 @@ CumulantK17Unified::CumulantK17Unified(std::shared_ptr<Parameter> para, int leve
 
 
 
-void CumulantK17Unified::run()
+void K17CompressibleNavierStokesUnified::run()
 {
     GPUKernelParameter kernelParameter{
         para->getParD(level)->omega,
@@ -48,7 +48,7 @@ void CumulantK17Unified::run()
 
     runKernel<<<cudaGrid.grid, cudaGrid.threads>>>(lambda, kernelParameter);
 
-    getLastCudaError("LB_Kernel_CumulantK17Unified execution failed");
+    getLastCudaError("K17CompressibleNavierStokesUnified execution failed");
 }
 
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.h
new file mode 100644
index 0000000000000000000000000000000000000000..2b416a6d80d6bbb961152e6d3c559922e280b997
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.h
@@ -0,0 +1,23 @@
+#ifndef K17CompressibleNavierStokesUnified_H
+#define K17CompressibleNavierStokesUnified_H
+
+#include "Kernel/KernelImp.h"
+
+namespace vf
+{
+namespace gpu
+{
+
+
+class K17CompressibleNavierStokesUnified : public KernelImp
+{
+public:
+    K17CompressibleNavierStokesUnified(std::shared_ptr<Parameter> para, int level);
+
+    void run();
+};
+
+}
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes_Device.cu
similarity index 82%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes_Device.cu
index c206381d4b54130a7a5489536729465f398e5ee4..732e96ce44e64d2f86bf899bd87bb33de4725874 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes_Device.cu
@@ -55,7 +55,7 @@ using namespace vf::gpu;
 
 ////////////////////////////////////////////////////////////////////////////////
 template<TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce>
-__global__ void LB_Kernel_CumulantK17(
+__global__ void K17CompressibleNavierStokes_Device(
     real omega_in,
     uint* neighborX,
     uint* neighborY,
@@ -693,34 +693,34 @@ __global__ void LB_Kernel_CumulantK17(
     (dist.f[DIR_MMM])[k_MMM] = f_PPP;
 }
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::AMD, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::Smagorinsky, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::QR, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::None, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::AMD, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::Smagorinsky, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::QR, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::None, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::AMD, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::Smagorinsky, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::QR, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::None, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::AMD, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::Smagorinsky, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::QR, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void K17CompressibleNavierStokes_Device < TurbulenceModel::None, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes_Device.cuh
similarity index 77%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes_Device.cuh
index da576618d1b08b55629c3c65fc115ceb822c8f7e..49f144422bf5803582edebf9826f34b2af3f929a 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes_Device.cuh
@@ -1,10 +1,10 @@
-#ifndef LB_Kernel_CUMULANT_K17_H
-#define LB_Kernel_CUMULANT_K17_H
+#ifndef K17CompressibleNavierStokes_Device_H
+#define K17CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-template< TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce > __global__ void LB_Kernel_CumulantK17(
+template< TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce > __global__ void K17CompressibleNavierStokes_Device(
     real omega_in,
     uint* neighborX,
     uint* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.cu
similarity index 59%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.cu
index 15d3509e735faa08b97d0876600c30876829c35f..efc90492b18c2360c49f523e26c4bcfe2b594e47 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "CumulantK18Comp.h"
+#include "K18CompressibleNavierStokes.h"
 
-#include "CumulantK18Comp_Device.cuh"
+#include "K18CompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CumulantK18Comp> CumulantK18Comp::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K18CompressibleNavierStokes> K18CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantK18Comp>(new CumulantK18Comp(para, level));
+	return std::shared_ptr<K18CompressibleNavierStokes>(new K18CompressibleNavierStokes(para, level));
 }
 
-void CumulantK18Comp::run()
+void K18CompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_CumulantK18Comp <<< grid.grid, grid.threads >>>(
+    K18CompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -29,7 +29,7 @@ void CumulantK18Comp::run()
     getLastCudaError("LB_Kernel_CumulantK18Comp execution failed");
 }
 
-CumulantK18Comp::CumulantK18Comp(std::shared_ptr<Parameter> para, int level)
+K18CompressibleNavierStokes::K18CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..d75920c78efe48ad586c4c92f775c3868195e9b8
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.h
@@ -0,0 +1,17 @@
+#ifndef K18CompressibleNavierStokes_H
+#define K18CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class K18CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr< K18CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K18CompressibleNavierStokes();
+	K18CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes_Device.cu
index c585c19aaca870e97fec63b0cd1742f7aad32556..169dedd3660ba9fc3c5e15bdfb60941bad2856c3 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK18Comp(
+__global__ void K18CompressibleNavierStokes_Device(
 	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes_Device.cuh
similarity index 58%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes_Device.cuh
index 04448787256cb1cfeef46c5d9b7146918e6a4c38..601071a73c8ea2e0e9d3d0e1b3ba69f921fd821d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes_Device.cuh
@@ -1,18 +1,21 @@
-#ifndef LB_KERNEL_CUMULANT_K17_BULK_COMP_H
-#define LB_KERNEL_CUMULANT_K17_BULK_COMP_H
+#ifndef K18CompressibleNavierStokes_Device_H
+#define K18CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_CumulantK17BulkComp(real omega,
+__global__ void K18CompressibleNavierStokes_Device(	
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DDStart,
+	real* F3,
 	int size_Mat,
 	int level,
 	real* forces,
     real* quadricLimiters,
 	bool EvenOrOdd);
-#endif
\ No newline at end of file
+
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.cu
similarity index 59%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.cu
index 8181cdb690b5813c368eddadb9cda58a7d749302..1a07b5a09614e38bd589b3f02d70b831d73b587e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "CumulantK20Comp.h"
+#include "K20CompressibleNavierStokes.h"
 
-#include "CumulantK20Comp_Device.cuh"
+#include "K20CompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CumulantK20Comp> CumulantK20Comp::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K20CompressibleNavierStokes> K20CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantK20Comp>(new CumulantK20Comp(para, level));
+	return std::shared_ptr<K20CompressibleNavierStokes>(new K20CompressibleNavierStokes(para, level));
 }
 
-void CumulantK20Comp::run()
+void K20CompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_CumulantK20Comp <<< grid.grid, grid.threads >>>(
+    K20CompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -29,7 +29,7 @@ void CumulantK20Comp::run()
     getLastCudaError("LB_Kernel_CumulantK20Comp execution failed");
 }
 
-CumulantK20Comp::CumulantK20Comp(std::shared_ptr<Parameter> para, int level)
+K20CompressibleNavierStokes::K20CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..fc6d4e72acf330a482e80c145a669bda74c0dd8a
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.h
@@ -0,0 +1,16 @@
+#ifndef K20CompressibleNavierStokes_H
+#define K20CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class K20CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr< K20CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K20CompressibleNavierStokes();
+	K20CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes_Device.cu
index 0a26eff29c3624bd78ef7dd4a8f675b8cb1a99d3..d722baa512dea2d7cc01ebf4f986f3239345fb40 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK20Comp(
+__global__ void K20CompressibleNavierStokes_Device(
 	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes_Device.cuh
similarity index 75%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes_Device.cuh
index 17691f621b5a46d29556d71304195f4a346a7ec6..b86fc38428b964304772cf283b310d6056be2682 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes_Device.cuh
@@ -1,10 +1,10 @@
-#ifndef LB_Kernel_Cumulant_K20_H
-#define LB_Kernel_Cumulant_K20_H
+#ifndef K20CompressibleNavierStokes_Device_H
+#define K20CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_CumulantK20Comp(	real omega,
+__global__ void K20CompressibleNavierStokes_Device(	real omega,
 															unsigned int* bcMatD,
 															unsigned int* neighborX,
 															unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.cu
similarity index 55%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.cu
index 6e11bd97a2e76cca3983a83f785a2435d40f594b..ffba813e2626c61323c13a5d4ac74d331e6e6c78 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "MRTCompSP27.h"
+#include "M02CompressibleNavierStokes.h"
 
-#include "MRTCompSP27_Device.cuh"
+#include "M02CompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<MRTCompSP27> MRTCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<M02CompressibleNavierStokes> M02CompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<MRTCompSP27>(new MRTCompSP27(para, level));
+	return std::shared_ptr<M02CompressibleNavierStokes>(new M02CompressibleNavierStokes(para, level));
 }
 
-void MRTCompSP27::run()
+void M02CompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_MRT_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+    M02CompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,16 +25,15 @@ void MRTCompSP27::run()
     getLastCudaError("LB_Kernel_MRT_Comp_SP_27 execution failed");
 }
 
-MRTCompSP27::MRTCompSP27(std::shared_ptr<Parameter> para, int level)
+M02CompressibleNavierStokes::M02CompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
 
 	myPreProcessorTypes.push_back(InitCompSP27);
-
 	
 }
 
-MRTCompSP27::MRTCompSP27()
+M02CompressibleNavierStokes::M02CompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..b18eb3dfb7f144e664d9dd2236b5a76a1c63dfa2
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.h
@@ -0,0 +1,17 @@
+#ifndef M02CompressibleNavierStokes_H
+#define M02CompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+
+class M02CompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<M02CompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	M02CompressibleNavierStokes();
+	M02CompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes_Device.cu
index 41b24a349da75586be4fb818c9eb3f194a2447fd..ae0f67fdb44884ffbcdf555fd48b275b64499c85 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_MRT_Comp_SP_27(real omega,
+__global__ void M02CompressibleNavierStokes_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes_Device.cuh
similarity index 56%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes_Device.cuh
index cf6a926698e4082383b04c5f1e2d886c6dca6380..06542a20c7c40367195fda9bdb3acac339e62f0e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes_Device.cuh
@@ -1,10 +1,10 @@
-#ifndef LB_KERNEL_CUM_COMP_SP_27_H
-#define LB_KERNEL_CUM_COMP_SP_27_H
+#ifndef M02CompressibleNavierStokes_Device_H
+#define M02CompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_Cum_Comp_SP_27(real s9,
+__global__ void M02CompressibleNavierStokes_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/RunLBMKernel.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/RunLBMKernel.cuh
similarity index 100%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/RunLBMKernel.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Compressible/FluidFlow/RunLBMKernel.cuh
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.cu
new file mode 100644
index 0000000000000000000000000000000000000000..846c2effc1d7df08f76e9752ed706e821254aba7
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.cu
@@ -0,0 +1,40 @@
+#include "B15IncompressibleNavierStokesBGKplus.h"
+
+#include "B15IncompressibleNavierStokesBGKplus_Device.cuh"
+#include "Parameter/Parameter.h"
+#include <cuda_helper/CudaGrid.h>
+
+std::shared_ptr<B15IncompressibleNavierStokesBGKplus> B15IncompressibleNavierStokesBGKplus::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<B15IncompressibleNavierStokesBGKplus>(new B15IncompressibleNavierStokesBGKplus(para, level));
+}
+
+void B15IncompressibleNavierStokesBGKplus::run()
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    B15IncompressibleNavierStokesBGKplus_Device <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_BGK_Plus_Incomp_SP_27 execution failed");
+}
+
+B15IncompressibleNavierStokesBGKplus::B15IncompressibleNavierStokesBGKplus(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+
+	myPreProcessorTypes.push_back(InitSP27);
+
+	
+}
+
+B15IncompressibleNavierStokesBGKplus::B15IncompressibleNavierStokesBGKplus()
+{
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.h
new file mode 100644
index 0000000000000000000000000000000000000000..2426d32cb0262c90aa32e8eaeea40ad9e273b75d
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.h
@@ -0,0 +1,17 @@
+#ifndef B15IncompressibleNavierStokesBGKplus_H
+#define B15IncompressibleNavierStokesBGKplus_H
+
+#include "Kernel/KernelImp.h"
+
+class B15IncompressibleNavierStokesBGKplus : public KernelImp
+{
+public:
+	static std::shared_ptr<B15IncompressibleNavierStokesBGKplus> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	B15IncompressibleNavierStokesBGKplus();
+	B15IncompressibleNavierStokesBGKplus(std::shared_ptr< Parameter> para, int level);
+
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus_Device.cu
index 1fee181619070e3bc30370a1bc32b949a3af9a2a..49764bc07bc910911dff0668105252f75d062205 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_BGK_Plus_Incomp_SP_27(real omega,
+__global__ void B15IncompressibleNavierStokesBGKplus_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..1c812f936541deaba06060fda0367dc60f231e63
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus_Device.cuh
@@ -0,0 +1,17 @@
+#ifndef B15IncompressibleNavierStokesBGKplus_Device_H
+#define B15IncompressibleNavierStokesBGKplus_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void B15IncompressibleNavierStokesBGKplus_Device(
+	real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	bool EvenOrOdd);
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.cu
similarity index 54%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.cu
index 39bd1f3491d0d70e4734d04ef8a2d6e38cdc6448..99f5fda8377bd7ce5bd4d486db5e2a680add7e84 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "BGKIncompSP27.h"
+#include "B92IncompressibleNavierStokes.h"
 
-#include "BGKIncompSP27_Device.cuh"
+#include "B92IncompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<BGKIncompSP27> BGKIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<B92IncompressibleNavierStokes> B92IncompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<BGKIncompSP27>(new BGKIncompSP27(para, level));
+	return std::shared_ptr<B92IncompressibleNavierStokes>(new B92IncompressibleNavierStokes(para, level));
 }
 
-void BGKIncompSP27::run()
+void B92IncompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_BGK_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+    B92IncompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,7 +25,7 @@ void BGKIncompSP27::run()
     getLastCudaError("LB_Kernel_BGK_Incomp_SP_27 execution failed");
 }
 
-BGKIncompSP27::BGKIncompSP27(std::shared_ptr<Parameter> para, int level)
+B92IncompressibleNavierStokes::B92IncompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -35,6 +35,6 @@ BGKIncompSP27::BGKIncompSP27(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-BGKIncompSP27::BGKIncompSP27()
+B92IncompressibleNavierStokes::B92IncompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..782b764460b85b6525d8c3ec89ef25e333eadd40
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.h
@@ -0,0 +1,17 @@
+#ifndef B92IncompressibleNavierStokes_H
+#define B92IncompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+
+class B92IncompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<B92IncompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	B92IncompressibleNavierStokes();
+	B92IncompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes_Device.cu
index 6cfde7648bdfe8808cb39dd1b80d6537bb3c3280..1d343eb3020816fe3114538a5362162e4a86169e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes_Device.cu
@@ -6,7 +6,7 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_BGK_Incomp_SP_27(real omega,
+__global__ void B92IncompressibleNavierStokes_Device(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes_Device.cuh
similarity index 80%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes_Device.cuh
index f1a90b45238a2df4d93860d7e77cb1242b9fbd90..8b81ebf323cd27faaa60f4b5f75d113a17a2b5e8 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes_Device.cuh
@@ -4,7 +4,8 @@
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_BGK_Incomp_SP_27(real omega,
+__global__ void B92IncompressibleNavierStokes_Device(
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.cu
similarity index 54%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.cu
index b060137f2d505886ee02a4b72e372ce8b4d48a78..16f6ffd99e8e7b68b954976fd79f0f2aeb7370b9 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "CascadeIncompSP27.h"
+#include "C06IncompressibleNavierStokes.h"
 
 #include "CascadeIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CascadeIncompSP27> CascadeIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<C06IncompressibleNavierStokes> C06IncompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CascadeIncompSP27>(new CascadeIncompSP27(para, level));
+	return std::shared_ptr<C06IncompressibleNavierStokes>(new C06IncompressibleNavierStokes(para, level));
 }
 
-void CascadeIncompSP27::run()
+void C06IncompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_Cascade_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+    C06IncompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,7 +25,7 @@ void CascadeIncompSP27::run()
     getLastCudaError("LB_Kernel_Cascade_Incomp_SP_27 execution failed");
 }
 
-CascadeIncompSP27::CascadeIncompSP27(std::shared_ptr<Parameter> para, int level)
+C06IncompressibleNavierStokes::C06IncompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -35,6 +35,6 @@ CascadeIncompSP27::CascadeIncompSP27(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-CascadeIncompSP27::CascadeIncompSP27()
+C06IncompressibleNavierStokes::C06IncompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..292b37ee75e1f8098845888776089d448e133332
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.h
@@ -0,0 +1,17 @@
+#ifndef C06IncompressibleNavierStokes_H
+#define C06IncompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class C06IncompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<C06IncompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	C06IncompressibleNavierStokes();
+	C06IncompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/CascadeIncompSP27_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/CascadeIncompSP27_Device.cu
index 0346f12cf609c355aedd4743dd7f971f444d5fe9..3f51dd4044887803a1b6b5f2470639ce4537b8d2 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/CascadeIncompSP27_Device.cu
@@ -6,7 +6,8 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_Cascade_Incomp_SP_27(real omega,
+__global__ void C06IncompressibleNavierStokes_Device(
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/CascadeIncompSP27_Device.cuh
similarity index 56%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/CascadeIncompSP27_Device.cuh
index a531fa7bd64b9782f43f800b29fe666504612f1a..daebc3345411812700a8776da1b1f5917dff2f59 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/C06/CascadeIncompSP27_Device.cuh
@@ -1,10 +1,11 @@
-#ifndef LB_KERNEL_CASCADE_INCOMP_SP_27_H
-#define LB_KERNEL_CASCADE_INCOMP_SP_27_H
+#ifndef C06IncompressibleNavierStokes_Device_H
+#define C06IncompressibleNavierStokes_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_Cascade_Incomp_SP_27(real s9,
+__global__ void C06IncompressibleNavierStokes_Device(
+	real s9,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/FluidFlowIncompStrategy.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/FluidFlowIncompStrategy.cpp
similarity index 100%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/FluidFlowIncompStrategy.cpp
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/FluidFlowIncompStrategy.cpp
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/FluidFlowIncompStrategy.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/FluidFlowIncompStrategy.h
similarity index 100%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/FluidFlowIncompStrategy.h
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/FluidFlowIncompStrategy.h
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.cu
similarity index 51%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.cu
index c597924193d859a35dddaa7b37a56e21d265ceba..f457eb98e856733795681f5b285d82decc6ff2b6 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "CumulantK15Incomp.h"
+#include "K15IncompressibleNavierStokes.h"
 
-#include "CumulantK15Incomp_Device.cuh"
+#include "K15IncompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CumulantK15Incomp> CumulantK15Incomp::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K15IncompressibleNavierStokes> K15IncompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantK15Incomp>(new CumulantK15Incomp(para, level));
+	return std::shared_ptr<K15IncompressibleNavierStokes>(new K15IncompressibleNavierStokes(para, level));
 }
 
-void CumulantK15Incomp::run()
+void K15IncompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_CumulantK15Incomp <<< grid.grid, grid.threads >>>(
+    K15IncompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,7 +25,7 @@ void CumulantK15Incomp::run()
     getLastCudaError("LB_Kernel_CumulantK15Incomp execution failed");
 }
 
-CumulantK15Incomp::CumulantK15Incomp(std::shared_ptr<Parameter> para, int level)
+K15IncompressibleNavierStokes::K15IncompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -35,6 +35,6 @@ CumulantK15Incomp::CumulantK15Incomp(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-CumulantK15Incomp::CumulantK15Incomp()
+K15IncompressibleNavierStokes::K15IncompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..40d06dfaef95cdd71ab1d11fbfc356087345ce91
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.h
@@ -0,0 +1,16 @@
+#ifndef K15IncompressibleNavierStokes_H
+#define K15IncompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class K15IncompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<K15IncompressibleNavierStokes> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K15IncompressibleNavierStokes();
+	K15IncompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.cu
similarity index 53%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.cu
index 840067da7f34a4415b1b14458ae0fc8d316e366d..0db31e686cfce85c19ae5b4aa37fef71ecc6e354 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.cu
@@ -1,19 +1,19 @@
-#include "CumulantIsoIncompSP27.h"
+#include "K15IncompressibleNavierStokesIsoCheck.h"
 
-#include "CumulantIsoIncompSP27_Device.cuh"
+#include "K15IncompressibleNavierStokesIsoCheck_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<CumulantIsoIncompSP27> CumulantIsoIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<K15IncompressibleNavierStokesIsoCheck> K15IncompressibleNavierStokesIsoCheck::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantIsoIncompSP27>(new CumulantIsoIncompSP27(para, level));
+	return std::shared_ptr<K15IncompressibleNavierStokesIsoCheck>(new K15IncompressibleNavierStokesIsoCheck(para, level));
 }
 
-void CumulantIsoIncompSP27::run()
+void K15IncompressibleNavierStokesIsoCheck::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_Cum_IsoTest_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+    K15IncompressibleNavierStokesIsoCheck_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -28,7 +28,7 @@ void CumulantIsoIncompSP27::run()
     getLastCudaError("LB_Kernel_Cum_IsoTest_Incomp_SP_27 execution failed");
 }
 
-CumulantIsoIncompSP27::CumulantIsoIncompSP27(std::shared_ptr<Parameter> para, int level)
+K15IncompressibleNavierStokesIsoCheck::K15IncompressibleNavierStokesIsoCheck(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -38,6 +38,6 @@ CumulantIsoIncompSP27::CumulantIsoIncompSP27(std::shared_ptr<Parameter> para, in
 	
 }
 
-CumulantIsoIncompSP27::CumulantIsoIncompSP27()
+K15IncompressibleNavierStokesIsoCheck::K15IncompressibleNavierStokesIsoCheck()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.h
new file mode 100644
index 0000000000000000000000000000000000000000..c2871b389c421b191cb65b36fd8cab3c6c35cb2c
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.h
@@ -0,0 +1,18 @@
+#ifndef K15IncompressibleNavierStokesIsoCheck_H
+#define K15IncompressibleNavierStokesIsoCheck_H
+
+#include "Kernel/KernelImp.h"
+
+class K15IncompressibleNavierStokesIsoCheck : public KernelImp
+{
+public:
+	static std::shared_ptr<K15IncompressibleNavierStokesIsoCheck> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K15IncompressibleNavierStokesIsoCheck();
+	K15IncompressibleNavierStokesIsoCheck(std::shared_ptr< Parameter> para, int level);
+
+};
+
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck_Device.cu
index 623d3c2c26b2c4d8fdfdaa718ca92662dfe5b548..6c91d9bfc4cf2c39b812a493986da29b45165407 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck_Device.cu
@@ -6,7 +6,8 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_Cum_IsoTest_Incomp_SP_27(real omega,
+__global__ void K15IncompressibleNavierStokesIsoCheck_Device(
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck_Device.cuh
similarity index 56%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck_Device.cuh
index 57dc7180ce7900333b4071db409a03ac847dd641..b392245582cec7a098a9d7bf2583d75a578b6993 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck_Device.cuh
@@ -1,10 +1,11 @@
-#ifndef LB_KERNEL_CUM_ISO_TEST_INCOMP_SP_27
-#define LB_KERNEL_CUM_ISO_TEST_INCOMP_SP_27
+#ifndef K15IncompressibleNavierStokesIsoCheck_Device_27
+#define K15IncompressibleNavierStokesIsoCheck_Device_27
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_Cum_IsoTest_Incomp_SP_27(real omega,
+__global__ void K15IncompressibleNavierStokesIsoCheck_Device(
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.cu
new file mode 100644
index 0000000000000000000000000000000000000000..5e5f99045cdc6bdbe365a4624e73b05dc82c2438
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.cu
@@ -0,0 +1,45 @@
+#include "K15IncompressibleNavierStokesRotatingVelocityField.h"
+
+#include "K15IncompressibleNavierStokesRotatingVelocityField_Device.cuh"
+#include "Parameter/Parameter.h"
+#include "cuda_helper/CudaGrid.h"
+
+std::shared_ptr<K15IncompressibleNavierStokesRotatingVelocityField> K15IncompressibleNavierStokesRotatingVelocityField::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<K15IncompressibleNavierStokesRotatingVelocityField>(new K15IncompressibleNavierStokesRotatingVelocityField(para, level));
+}
+
+void K15IncompressibleNavierStokesRotatingVelocityField::run()
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    K15IncompressibleNavierStokesRotatingVelocityField_Device <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->deltaPhi,
+        para->getAngularVelocity(),
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->coordinateX,
+        para->getParD(level)->coordinateY,
+        para->getParD(level)->coordinateZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("K15IncompressibleNavierStokesRotatingVelocityField_Device execution failed");
+}
+
+K15IncompressibleNavierStokesRotatingVelocityField::K15IncompressibleNavierStokesRotatingVelocityField(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+
+	myPreProcessorTypes.push_back(InitSP27);
+
+	
+}
+
+K15IncompressibleNavierStokesRotatingVelocityField::K15IncompressibleNavierStokesRotatingVelocityField()
+{
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.h
new file mode 100644
index 0000000000000000000000000000000000000000..94858833254f2e2b40c0ae3ef00eaa0789ded88b
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.h
@@ -0,0 +1,18 @@
+#ifndef K15IncompressibleNavierStokesRotatingVelocityField_H
+#define K15IncompressibleNavierStokesRotatingVelocityField_H
+
+#include "Kernel/KernelImp.h"
+
+class K15IncompressibleNavierStokesRotatingVelocityField : public KernelImp
+{
+public:
+	static std::shared_ptr<K15IncompressibleNavierStokesRotatingVelocityField> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+
+private:
+	K15IncompressibleNavierStokesRotatingVelocityField();
+	K15IncompressibleNavierStokesRotatingVelocityField(std::shared_ptr< Parameter> para, int level);
+
+};
+
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField_Device.cu
index ac88396b42483e3178869be585124fb031d099ec..082a5dc3882a498838d174e0c7b24ae134dca622 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField_Device.cu
@@ -6,7 +6,8 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_Cum_1h_Incomp_SP_27(real omega,
+__global__ void K15IncompressibleNavierStokesRotatingVelocityField_Device(
+	real omega,
 	real deltaPhi,
 	real angularVelocity,
 	unsigned int* bcMatD,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField_Device.cuh
similarity index 56%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cuh
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField_Device.cuh
index 0679e770f244ad2e2c59c9cacf9d3524a640a42e..b313fcb8f2e7aa4544249ce26f6ada3cf85c7a79 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField_Device.cuh
@@ -1,10 +1,11 @@
-#ifndef LB_KERNEL_CUM_1H_INCOMP_SP_27_H
-#define LB_KERNEL_CUM_1H_INCOMP_SP_27_H
+#ifndef K15IncompressibleNavierStokesRotatingVelocityField_Device_H
+#define K15IncompressibleNavierStokesRotatingVelocityField_Device_H
 
 #include <DataTypes.h>
 #include <curand.h>
 
-__global__ void LB_Kernel_Cum_1h_Incomp_SP_27(real omega,
+__global__ void K15IncompressibleNavierStokesRotatingVelocityField_Device(
+	real omega,
 	real deltaPhi,
 	real angularVelocity,
 	unsigned int* bcMatD,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes_Device.cu
index 9fcfeaa97d97b9bfcf2ad0227464cbcabbc28f44..5b666eb73c7a19d472d26f2047b04462f83d0d23 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes_Device.cu
@@ -6,7 +6,8 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_CumulantK15Incomp(real omega,
+__global__ void K15IncompressibleNavierStokes_Device(
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..9252b17df43b405e7098359d3c5ff7406cc90759
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes_Device.cuh
@@ -0,0 +1,17 @@
+#ifndef K15IncompressibleNavierStokes_Device_H
+#define K15IncompressibleNavierStokes_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void K15IncompressibleNavierStokes_Device(
+	real s9,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	bool EvenOrOdd);
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.cu
similarity index 54%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.cu
index daa90091fe092a98741d0764e2327f3ce4c9d2bc..a08eef4a381b06729da8ff26a0ab305e5cf3615c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.cu
@@ -1,19 +1,19 @@
-#include "MRTIncompSP27.h"
+#include "M02IncompressibleNavierStokes.h"
 
-#include "MRTIncompSP27_Device.cuh"
+#include "M02IncompressibleNavierStokes_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
-std::shared_ptr<MRTIncompSP27> MRTIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+std::shared_ptr<M02IncompressibleNavierStokes> M02IncompressibleNavierStokes::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<MRTIncompSP27>(new MRTIncompSP27(para, level));
+	return std::shared_ptr<M02IncompressibleNavierStokes>(new M02IncompressibleNavierStokes(para, level));
 }
 
-void MRTIncompSP27::run()
+void M02IncompressibleNavierStokes::run()
 {
     vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
-    LB_Kernel_MRT_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+    M02IncompressibleNavierStokes_Device <<< grid.grid, grid.threads >>>(
         para->getParD(level)->omega,
         para->getParD(level)->typeOfGridNode,
         para->getParD(level)->neighborX,
@@ -25,7 +25,7 @@ void MRTIncompSP27::run()
     getLastCudaError("LB_Kernel_MRT_Incomp_SP_27 execution failed");
 }
 
-MRTIncompSP27::MRTIncompSP27(std::shared_ptr<Parameter> para, int level)
+M02IncompressibleNavierStokes::M02IncompressibleNavierStokes(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -35,6 +35,6 @@ MRTIncompSP27::MRTIncompSP27(std::shared_ptr<Parameter> para, int level)
 	
 }
 
-MRTIncompSP27::MRTIncompSP27()
+M02IncompressibleNavierStokes::M02IncompressibleNavierStokes()
 {
 }
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.h b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.h
new file mode 100644
index 0000000000000000000000000000000000000000..dde5846114b84abb6c276f155e3f583f7de0ecd6
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.h
@@ -0,0 +1,16 @@
+#ifndef M02IncompressibleNavierStokes_H
+#define M02IncompressibleNavierStokes_H
+
+#include "Kernel/KernelImp.h"
+
+class M02IncompressibleNavierStokes : public KernelImp
+{
+public:
+	static std::shared_ptr<M02IncompressibleNavierStokes> getNewInstance(std::shared_ptr<Parameter> para, int level);
+	void run();
+
+private:
+	M02IncompressibleNavierStokes();
+	M02IncompressibleNavierStokes(std::shared_ptr< Parameter> para, int level);
+};
+#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes_Device.cu
similarity index 99%
rename from src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu
rename to src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes_Device.cu
index 2fbc7d64d5f10a2c6313647e508fbb2192dd435b..4c94c960e0bf9521c558ede0c00076f2bfe82ce4 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes_Device.cu
@@ -6,7 +6,8 @@ using namespace vf::basics::constant;
 using namespace vf::lbm::dir;
 #include "math.h"
 
-__global__ void LB_Kernel_MRT_Incomp_SP_27(real omega,
+__global__ void M02IncompressibleNavierStokes_Device(
+	real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..c62c73b10fcab18f8e4c7b3189dc10204a60de28
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes_Device.cuh
@@ -0,0 +1,17 @@
+#ifndef M02IncompressibleNavierStokes_Device_H
+#define M02IncompressibleNavierStokes_Device_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+__global__ void M02IncompressibleNavierStokes_Device(
+	real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	int size_Mat,
+	bool EvenOrOdd);
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
index 84e5f3f6ac08b92ccd92fbf142cceb3245de51d5..00d392c9e8ff7b8c55b75f50327946b0140a3d68 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include <cuda/CudaGrid.h>
+#include <cuda_helper/CudaGrid.h>
 
 class CheckParameterStrategy;
 class Parameter;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu
index 4d4467acb20232ecb364451f61265b71f1692517..21ad7202a62a685bc18b8a0c44e093e487e8eb84 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu
@@ -2,7 +2,7 @@
 
 #include "ADComp27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<ADComp27> ADComp27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu
index d218489c754edc89f99277670f09536962ce62b2..fa6d378353aa5058f1b58979a517e8490d7d3916 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu
@@ -2,7 +2,7 @@
 
 #include "ADComp7_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<ADComp7> ADComp7::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu
index 3c10e7a6996a9a26668a18390ddee4e2cbbec853..22782ddf6aebb6b860c3dc1e2b1a384223931085 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu
@@ -2,7 +2,7 @@
 
 #include "ADIncomp27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<ADIncomp27> ADIncomp27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu
index 71adc96eef733084e01fa963f6d0fad66a2e1062..613491dcfc4e124fed2826f5439ae7a2b99544b7 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu
@@ -2,7 +2,7 @@
 
 #include "ADIncomp7_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<ADIncomp7> ADIncomp7::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.h
deleted file mode 100644
index 4163d87fa5105a737138cd5c5e67fe5b01edaeed..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef BGK_COMP_SP27_H
-#define BGK_COMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class BGKCompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<BGKCompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-	
-private:
-	BGKCompSP27();
-	BGKCompSP27(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cuh
deleted file mode 100644
index 59a5240862ed92a9ea3e9187c503ee9233da7e5a..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cuh
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef LB_Kernel_BGK_COMP_SP_27_H
-#define LB_Kernel_BGK_COMP_SP_27_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_BGK_Comp_SP_27(	real omega,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														int size_Mat,
-														bool EvenOrOdd);
-
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu
deleted file mode 100644
index 00aaf3c27f16a5d53e7aee225214f05bd62a541a..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "BGKPlusCompSP27.h"
-
-#include "BGKPlusCompSP27_Device.cuh"
-#include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
-
-std::shared_ptr<BGKPlusCompSP27> BGKPlusCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<BGKPlusCompSP27>(new BGKPlusCompSP27(para, level));
-}
-
-void BGKPlusCompSP27::run()
-{
-    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-
-    LB_Kernel_BGK_Plus_Comp_SP_27 <<< grid.grid, grid.threads >>>(
-        para->getParD(level)->omega,
-        para->getParD(level)->typeOfGridNode,
-        para->getParD(level)->neighborX,
-        para->getParD(level)->neighborY,
-        para->getParD(level)->neighborZ,
-        para->getParD(level)->distributions.f[0],
-        para->getParD(level)->numberOfNodes,
-        para->getParD(level)->isEvenTimestep);
-    getLastCudaError("LB_Kernel_BGK_Plus_Comp_SP_27 execution failed");
-}
-
-BGKPlusCompSP27::BGKPlusCompSP27(std::shared_ptr<Parameter> para, int level)
-{
-	this->para = para;
-	this->level = level;
-
-	myPreProcessorTypes.push_back(InitCompSP27);
-
-	
-}
-
-BGKPlusCompSP27::BGKPlusCompSP27()
-{
-}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.h
deleted file mode 100644
index da40eb8aeee5d19646a66b7a0f8f8da498b85a2a..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef BGK_PLUS_COMP_SP27_H
-#define BGK_PLUS_COMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class BGKPlusCompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<BGKPlusCompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	BGKPlusCompSP27();
-	BGKPlusCompSP27(std::shared_ptr< Parameter> para, int level);
-};
-
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cuh
deleted file mode 100644
index 9e991ffa4b16e0df78fe23f6ee5a1e0678919cd7..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cuh
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef LB_Kernel_BGK_PLUS_Comp_SP_27_H
-#define LB_Kernel_BGK_PLUS_Comp_SP_27_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_BGK_Plus_Comp_SP_27(	real omega,
-															unsigned int* bcMatD,
-															unsigned int* neighborX,
-															unsigned int* neighborY,
-															unsigned int* neighborZ,
-															real* DDStart,
-															int size_Mat,
-															bool EvenOrOdd);
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h
deleted file mode 100644
index 762eaaa5935bd01fa6ae002521a40e45cd239dfd..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef GPU_BKGUnified_H
-#define GPU_BKGUnified_H
-
-#include "Kernel/KernelImp.h"
-
-namespace vf
-{
-namespace gpu
-{
-
-class BGKUnified : public KernelImp
-{
-public:
-    BGKUnified(std::shared_ptr<Parameter> para, int level);
-
-    void run();
-};
-
-}
-}
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.h
deleted file mode 100644
index 900f41884c5f19f050c33a0e6141010e0b72b46f..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef CASCADE_COMP_SP27_H
-#define CASCADE_COMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class CascadeCompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<CascadeCompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CascadeCompSP27();
-	CascadeCompSP27(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.h
deleted file mode 100644
index 0f9317f12b9438f770cd60355c41dc13599f1ad2..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_COMP_SP27_H
-#define CUMULANT_COMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantCompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantCompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantCompSP27();
-	CumulantCompSP27(std::shared_ptr< Parameter> para, int level);
-
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu
deleted file mode 100644
index c8aad41b87ef39514f6cf5abc8b8bff42a869346..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "CumulantAll4CompSP27.h"
-
-#include "CumulantAll4CompSP27_Device.cuh"
-#include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
-
-std::shared_ptr<CumulantAll4CompSP27> CumulantAll4CompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<CumulantAll4CompSP27>(new CumulantAll4CompSP27(para, level));
-}
-
-void CumulantAll4CompSP27::run()
-{
-    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-
-    LB_Kernel_Cumulant_D3Q27All4 <<< grid.grid, grid.threads >>>(
-        para->getParD(level)->omega,
-        para->getParD(level)->typeOfGridNode,
-        para->getParD(level)->neighborX,
-        para->getParD(level)->neighborY,
-        para->getParD(level)->neighborZ,
-        para->getParD(level)->distributions.f[0],
-        para->getParD(level)->numberOfNodes,
-        level,
-        para->getForcesDev(),
-        para->getQuadricLimitersDev(),
-        para->getParD(level)->isEvenTimestep);
-    getLastCudaError("LB_Kernel_Cumulant_D3Q27All4 execution failed");
-}
-
-CumulantAll4CompSP27::CumulantAll4CompSP27(std::shared_ptr<Parameter> para, int level)
-{
-	this->para = para;
-	this->level = level;
-
-	myPreProcessorTypes.push_back(InitCompSP27);
-
-	
-}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.h
deleted file mode 100644
index e36d51bc471ff38a4f213f415c9e86bd677add32..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef CUMULANT_ALL4_COMP_SP27_H
-#define CUMULANT_ALL4_COMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantAll4CompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantAll4CompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-	
-private:
-	CumulantAll4CompSP27();
-	CumulantAll4CompSP27(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cuh
deleted file mode 100644
index 5f23194d561d106cf2493c36199444f8da15efd7..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cuh
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef LB_Kernel_Cumulant_D3Q27All4_H
-#define LB_Kernel_Cumulant_D3Q27All4_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_Cumulant_D3Q27All4(	real omega,
-															unsigned int* bcMatD,
-															unsigned int* neighborX,
-															unsigned int* neighborY,
-															unsigned int* neighborZ,
-															real* DDStart,
-															int size_Mat,
-															int level,
-															real* forces,
-                                                            real* quadricLimiters,
-															bool EvenOrOdd);
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.h
deleted file mode 100644
index 386a9c2047ec067abfb86c1f8741cc5cb548e81b..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef CUMULANT_K15_COMP_H
-#define CUMULANT_K15_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK15Comp : public KernelImp
-{
-public:
-	static std::shared_ptr< CumulantK15Comp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK15Comp();
-	CumulantK15Comp(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
deleted file mode 100644
index 149aab34a16673ddd707427c222a56cf18d127ca..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef LB_Kernel_CUMULANT_K15_COMP_H
-#define LB_Kernel_CUMULANT_K15_COMP_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_CumulantK15Comp(	real omega,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														int size_Mat,
-														int level,
-														real* forces,
-														bool EvenOrOdd);
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu
deleted file mode 100644
index f0e29a9740438bc78d39574e1046d937cd7b86ce..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "CumulantK15BulkComp.h"
-
-#include "CumulantK15BulkComp_Device.cuh"
-#include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
-
-std::shared_ptr<CumulantK15BulkComp> CumulantK15BulkComp::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<CumulantK15BulkComp>(new CumulantK15BulkComp(para, level));
-}
-
-void CumulantK15BulkComp::run()
-{
-    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-
-    LB_Kernel_CumulantK15BulkComp <<< grid.grid, grid.threads >>>(
-        para->getParD(level)->omega,
-        para->getParD(level)->typeOfGridNode,
-        para->getParD(level)->neighborX,
-        para->getParD(level)->neighborY,
-        para->getParD(level)->neighborZ,
-        para->getParD(level)->distributions.f[0],
-        para->getParD(level)->numberOfNodes,
-        level,
-        para->getForcesDev(),
-        para->getParD(level)->isEvenTimestep);
-    getLastCudaError("LB_Kernel_CumulantK15BulkComp execution failed");
-}
-
-CumulantK15BulkComp::CumulantK15BulkComp(std::shared_ptr<Parameter> para, int level)
-{
-	this->para = para;
-	this->level = level;
-
-	myPreProcessorTypes.push_back(InitCompSP27);
-
-	
-}
-
-CumulantK15BulkComp::CumulantK15BulkComp()
-{
-}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.h
deleted file mode 100644
index 389e961b21f7b54adc7fd0fc6b3f8712af6e4531..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_K15_BULK_COMP_H
-#define CUMULANT_K15_BULK_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK15BulkComp : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantK15BulkComp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK15BulkComp();
-	CumulantK15BulkComp(std::shared_ptr< Parameter> para, int level);
-};
-
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.h
deleted file mode 100644
index de7fbfd90afc89d4dfdd441e18160c21e683b67b..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_K15_SPONGE_COMP_H
-#define CUMULANT_K15_SPONGE_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK15SpongeComp : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantK15SpongeComp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK15SpongeComp();
-	CumulantK15SpongeComp(std::shared_ptr< Parameter> para, int level);
-
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h
deleted file mode 100644
index 8756253950484e00773af89327589c3d8f157729..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef CUMULANT_K15_UNIFIED_COMP_H
-#define CUMULANT_K15_UNIFIED_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-namespace vf
-{
-namespace gpu
-{
-class CumulantK15Unified : public KernelImp
-{
-public:
-    CumulantK15Unified(std::shared_ptr<Parameter> para, int level);
-    
-    void run();
-};
-
-}
-}
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.h
deleted file mode 100644
index 00c79a30c9ccf9a89901165d020fc85d5a479c1d..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef CUMULANT_K17_H
-#define CUMULANT_K17_H
-
-#include "Kernel/KernelImp.h"
-#include "Parameter/Parameter.h"
-
-template<TurbulenceModel turbulenceModel> 
-class CumulantK17 : public KernelImp
-{
-public:
-	static std::shared_ptr< CumulantK17<turbulenceModel> > getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run() override;
-    void runOnIndices(const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIndex) override;
-
-private:
-    CumulantK17();
-    CumulantK17(std::shared_ptr<Parameter> para, int level);
-};
-
-#endif 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu
deleted file mode 100644
index 13b54723780fa16374b332c731fc35c5664d75b6..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu
+++ /dev/null
@@ -1,47 +0,0 @@
-#include "CumulantK17BulkComp.h"
-
-#include "CumulantK17BulkComp_Device.cuh"
-#include "Parameter/Parameter.h"
-
-std::shared_ptr<CumulantK17BulkComp> CumulantK17BulkComp::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<CumulantK17BulkComp>(new CumulantK17BulkComp(para, level));
-}
-
-void CumulantK17BulkComp::run()
-{
-	int size_Array = para->getParD(level)->size_Array_SP;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = size_Array / numberOfThreads;
-	dim3 grid(Grid, 1, 1);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_CumulantK17BulkComp << < grid, threads >> >(
-		para->getParD(level)->omega,
-		para->getParD(level)->typeOfGridNode,
-		para->getParD(level)->neighborX,
-		para->getParD(level)->neighborY,
-		para->getParD(level)->neighborZ,
-		para->getParD(level)->distributions.f[0],
-		para->getParD(level)->numberOfNodes,
-		level,
-		para->getForcesDev(),
-		para->getQuadricLimitersDev(),
-		para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK17BulkComp execution failed");
-}
-
-CumulantK17BulkComp::CumulantK17BulkComp(std::shared_ptr<Parameter> para, int level)
-{
-	this->para = para;
-	this->level = level;
-
-	myPreProcessorTypes.push_back(InitCompSP27);
-
-	
-}
-
-CumulantK17BulkComp::CumulantK17BulkComp()
-{
-}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.h
deleted file mode 100644
index 94ad8064053360247bba6a7abf940e0ad21625b5..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_K17_BULK_COMP_H
-#define CUMULANT_K17_BULK_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK17BulkComp : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantK17BulkComp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK17BulkComp();
-	CumulantK17BulkComp(std::shared_ptr< Parameter> para, int level);
-
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
deleted file mode 100644
index af8470b717ad7a98e7a3fcd507976353d9e8bd41..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef CUMULANT_K17_UNIFIED_H
-#define CUMULANT_K17_UNIFIED_H
-
-#include "Kernel/KernelImp.h"
-
-namespace vf
-{
-namespace gpu
-{
-
-
-class CumulantK17Unified : public KernelImp
-{
-public:
-    CumulantK17Unified(std::shared_ptr<Parameter> para, int level);
-
-    void run();
-};
-
-}
-}
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.cu
deleted file mode 100644
index 466b9f85999257196e860e84919ca6ccce6946b7..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.cu
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "CumulantK17CompChim.h"
-
-#include "Parameter/Parameter.h"
-#include "CumulantK17CompChim_Device.cuh"
-#include "cuda/CudaGrid.h"
-
-std::shared_ptr<CumulantK17CompChim> CumulantK17CompChim::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<CumulantK17CompChim>(new CumulantK17CompChim(para,level));
-}
-
-void CumulantK17CompChim::run()
-{
-	LB_Kernel_CumulantK17CompChim <<< cudaGrid.grid, cudaGrid.threads >>>(
-		para->getParD(level)->omega,
-		para->getParD(level)->typeOfGridNode,
-		para->getParD(level)->neighborX,
-		para->getParD(level)->neighborY,
-		para->getParD(level)->neighborZ,
-		para->getParD(level)->distributions.f[0],
-		para->getParD(level)->numberOfNodes,
-		level,
-		para->getIsBodyForce(),
-		para->getForcesDev(),
-		para->getParD(level)->forceX_SP,
-		para->getParD(level)->forceY_SP,
-		para->getParD(level)->forceZ_SP,
-        para->getQuadricLimitersDev(),
-		para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK17CompChim execution failed");
-}
-
-CumulantK17CompChim::CumulantK17CompChim(std::shared_ptr<Parameter> para, int level): KernelImp(para, level)
-{
-	myPreProcessorTypes.push_back(InitCompSP27);
-	
-	this->cudaGrid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.h
deleted file mode 100644
index 2f8b807c57b26588eed0801bca14afab6b13e7dd..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_K17_COMP_CHIM_H
-#define CUMULANT_K17_COMP_CHIM_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK17CompChim : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantK17CompChim> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-    CumulantK17CompChim();
-    CumulantK17CompChim(std::shared_ptr<Parameter> para, int level);
-};
-
-#endif 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.h
deleted file mode 100644
index 6cffff12643d066d167d19bf9ab2f0c450979d3f..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_K18_COMP_H
-#define CUMULANT_K18_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK18Comp : public KernelImp
-{
-public:
-	static std::shared_ptr< CumulantK18Comp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK18Comp();
-	CumulantK18Comp(std::shared_ptr< Parameter> para, int level);
-};
-
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cuh
deleted file mode 100644
index 60a15145e3c117cadb7485f2899ba768b10eb0c1..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cuh
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef LB_Kernel_Cumulant_K18_H
-#define LB_Kernel_Cumulant_K18_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_CumulantK18Comp(	real omega,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														real* F3,
-														int size_Mat,
-														int level,
-														real* forces,
-                                                        real* quadricLimiters,
-														bool EvenOrOdd);
-
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.h
deleted file mode 100644
index 24745df47ed75eb3369f41068d49d27702eee461..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef CUMULANT_K20_COMP_H
-#define CUMULANT_K20_COMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK20Comp : public KernelImp
-{
-public:
-	static std::shared_ptr< CumulantK20Comp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK20Comp();
-	CumulantK20Comp(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.h
deleted file mode 100644
index 07aba55fd4bad868c919284ebf11846ba8f9ebec..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef MRT_COMP_SP27_H
-#define MRT_COMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-
-class MRTCompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<MRTCompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	MRTCompSP27();
-	MRTCompSP27(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.h
deleted file mode 100644
index 04308f6919fd15495761d929da06a583457ba0c0..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef BGK_INCOMP_SP27_H
-#define BGK_INCOMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-
-class BGKIncompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<BGKIncompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	BGKIncompSP27();
-	BGKIncompSP27(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu
deleted file mode 100644
index 84a55b89d68f9a1e18c5114f8088a7dee24a4cd1..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "BGKPlusIncompSP27.h"
-
-#include "BGKPlusIncompSP27_Device.cuh"
-#include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
-
-std::shared_ptr<BGKPlusIncompSP27> BGKPlusIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<BGKPlusIncompSP27>(new BGKPlusIncompSP27(para, level));
-}
-
-void BGKPlusIncompSP27::run()
-{
-    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-
-    LB_Kernel_BGK_Plus_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
-        para->getParD(level)->omega,
-        para->getParD(level)->typeOfGridNode,
-        para->getParD(level)->neighborX,
-        para->getParD(level)->neighborY,
-        para->getParD(level)->neighborZ,
-        para->getParD(level)->distributions.f[0],
-        para->getParD(level)->numberOfNodes,
-        para->getParD(level)->isEvenTimestep);
-    getLastCudaError("LB_Kernel_BGK_Plus_Incomp_SP_27 execution failed");
-}
-
-BGKPlusIncompSP27::BGKPlusIncompSP27(std::shared_ptr<Parameter> para, int level)
-{
-	this->para = para;
-	this->level = level;
-
-	myPreProcessorTypes.push_back(InitSP27);
-
-	
-}
-
-BGKPlusIncompSP27::BGKPlusIncompSP27()
-{
-}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.h
deleted file mode 100644
index c6a1dcaca1ea267738e4a9cec735273ce4ccdb9c..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef BGK_PLUS_INCOMP_SP27_H
-#define BGK_PLUS_INCOMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class BGKPlusIncompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<BGKPlusIncompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	BGKPlusIncompSP27();
-	BGKPlusIncompSP27(std::shared_ptr< Parameter> para, int level);
-
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cuh
deleted file mode 100644
index 7f85f3ca29d4d8d7620e2503df9947fd7e42fe8f..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cuh
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef LB_KERNEL_BGK_PLUS_INCOMP_SP_27_H
-#define LB_KERNEL_BGK_PLUS_INCOMP_SP_27_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_BGK_Plus_Incomp_SP_27(real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	bool EvenOrOdd);
-
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.h
deleted file mode 100644
index 4ebb0c50a642a943defb7a42ce96cba72d03ddf4..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CASCADE_INCOMP_P27_H
-#define CASCADE_INCOMP_P27_H
-
-#include "Kernel/KernelImp.h"
-
-class CascadeIncompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<CascadeIncompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CascadeIncompSP27();
-	CascadeIncompSP27(std::shared_ptr< Parameter> para, int level);
-
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu
deleted file mode 100644
index 2cade430786b17567c47264f0638dba259b3192d..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "Cumulant1hIncompSP27.h"
-
-#include "Cumulant1hIncompSP27_Device.cuh"
-#include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
-
-std::shared_ptr<Cumulant1hIncompSP27> Cumulant1hIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
-{
-	return std::shared_ptr<Cumulant1hIncompSP27>(new Cumulant1hIncompSP27(para, level));
-}
-
-void Cumulant1hIncompSP27::run()
-{
-    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-
-    LB_Kernel_Cum_1h_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
-        para->getParD(level)->omega,
-        para->getParD(level)->deltaPhi,
-        para->getAngularVelocity(),
-        para->getParD(level)->typeOfGridNode,
-        para->getParD(level)->neighborX,
-        para->getParD(level)->neighborY,
-        para->getParD(level)->neighborZ,
-        para->getParD(level)->coordinateX,
-        para->getParD(level)->coordinateY,
-        para->getParD(level)->coordinateZ,
-        para->getParD(level)->distributions.f[0],
-        para->getParD(level)->numberOfNodes,
-        para->getParD(level)->isEvenTimestep);
-    getLastCudaError("LB_Kernel_Cum_1h_Incomp_SP_27 execution failed");
-}
-
-Cumulant1hIncompSP27::Cumulant1hIncompSP27(std::shared_ptr<Parameter> para, int level)
-{
-	this->para = para;
-	this->level = level;
-
-	myPreProcessorTypes.push_back(InitSP27);
-
-	
-}
-
-Cumulant1hIncompSP27::Cumulant1hIncompSP27()
-{
-}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.h
deleted file mode 100644
index c6086649dc577afd6a00b684769858deb7d85e20..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CUMULANT_1H_INCOMP_SP27_H
-#define CUMULANT_1H_INCOMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class Cumulant1hIncompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<Cumulant1hIncompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	Cumulant1hIncompSP27();
-	Cumulant1hIncompSP27(std::shared_ptr< Parameter> para, int level);
-
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.h
deleted file mode 100644
index 99d2230be843d9acd6ff6e95283e8530a52acbef..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef CUMULANT_ISO_INCOMP_SP27_H
-#define CUMULANT_ISO_INCOMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantIsoIncompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantIsoIncompSP27> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantIsoIncompSP27();
-	CumulantIsoIncompSP27(std::shared_ptr< Parameter> para, int level);
-
-};
-
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.h
deleted file mode 100644
index c08737b4331df171efb72594d487da3ea346f8ca..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef CUMULANT_K15_INCOMP_H
-#define CUMULANT_K15_INCOMP_H
-
-#include "Kernel/KernelImp.h"
-
-class CumulantK15Incomp : public KernelImp
-{
-public:
-	static std::shared_ptr<CumulantK15Incomp> getNewInstance(std::shared_ptr< Parameter> para, int level);
-	void run();
-
-private:
-	CumulantK15Incomp();
-	CumulantK15Incomp(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cuh
deleted file mode 100644
index f2b5063f9db6d55b9efb547c0c05d450463e0509..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cuh
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef LB_KERNEL_CUMULANT_K15_IMCOMP_H
-#define LB_KERNEL_CUMULANT_K15_IMCOMP_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_CumulantK15Incomp(real s9,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	bool EvenOrOdd);
-
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.h
deleted file mode 100644
index dd467be23b888d0968520f706b3e2dd3da6c3fd7..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef MRT_INCOMP_SP27_H
-#define MRT_INCOMP_SP27_H
-
-#include "Kernel/KernelImp.h"
-
-class MRTIncompSP27 : public KernelImp
-{
-public:
-	static std::shared_ptr<MRTIncompSP27> getNewInstance(std::shared_ptr<Parameter> para, int level);
-	void run();
-
-private:
-	MRTIncompSP27();
-	MRTIncompSP27(std::shared_ptr< Parameter> para, int level);
-};
-#endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cuh
deleted file mode 100644
index d3a9fcea7c1a53e4084acf8dc5f1f815d0da967d..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cuh
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef LB_KERNEL_MRT_INCOMP_SP_27_H
-#define LB_KERNEL_MRT_INCOMP_SP_27_H
-
-#include <DataTypes.h>
-#include <curand.h>
-
-__global__ void LB_Kernel_MRT_Incomp_SP_27(real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	bool EvenOrOdd);
-
-#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
index 7b7b857d5c3ac157445bb154aecfb4dfa9c4b0bc..db803b0b3acc7cbddcc3aacfbf9c9eff594a0f74 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
@@ -7,32 +7,32 @@
 #include "Kernel/Utilities/KernelTypes.h"
 
 //LBM kernel (compressible)
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.h"
+#include "Kernel/Compressible/FluidFlow/B92/B92CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplusUnified.h"
+#include "Kernel/Compressible/FluidFlow/B15/B15CompressibleNavierStokesBGKplus.h"
+#include "Kernel/Compressible/FluidFlow/M02/M02CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/C06/C06CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/K08/K08CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesBulkViscosity.h"
+#include "Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesSponge.h"
+#include "Kernel/Compressible/FluidFlow/K15/K15CompressibleNavierStokesUnified.h"
+#include "Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesChimeraLegacy.h"
+#include "Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesBulkViscosity.h"
+#include "Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesUnified.h"
+#include "Kernel/Compressible/FluidFlow/K17/K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants.h"
+#include "Kernel/Compressible/FluidFlow/K18/K18CompressibleNavierStokes.h"
+#include "Kernel/Compressible/FluidFlow/K20/K20CompressibleNavierStokes.h"
 
 //LBM kernel (inkompressible)
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.h"
+#include "Kernel/Incompressible/FluidFlow/B92/B92IncompressibleNavierStokes.h"
+#include "Kernel/Incompressible/FluidFlow/B15/B15IncompressibleNavierStokesBGKplus.h"
+#include "Kernel/Incompressible/FluidFlow/C06/C06IncompressibleNavierStokes.h"
+#include "Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesRotatingVelocityField.h"
+#include "Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokesIsoCheck.h"
+#include "Kernel/Incompressible/FluidFlow/K15/K15IncompressibleNavierStokes.h"
+#include "Kernel/Incompressible/FluidFlow/M02/M02IncompressibleNavierStokes.h"
 
 //advection diffusion kernel (compressible)
 #include "Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.h"
@@ -52,8 +52,8 @@
 #include "Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp.h"
 
 //strategies
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h"
-#include "Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/FluidFlowIncompStrategy.h"
+#include "Kernel/Compressible/FluidFlow/FluidFlowCompStrategy.h"
+#include "Kernel/Incompressible/FluidFlow/FluidFlowIncompStrategy.h"
 #include "Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADMod27CompStrategy.h"
 #include "Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADMod7CompStrategy.h"
 #include "Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADMod27IncompStrategy.h"
@@ -101,49 +101,49 @@ std::shared_ptr<Kernel> KernelFactoryImp::makeKernel(std::shared_ptr<Parameter>
     std::shared_ptr<CheckParameterStrategy> checkStrategy;
 
     if (kernel == CollisionKernel::Compressible::BGK) {
-        newKernel     = BGKCompSP27::getNewInstance(para, level);               // compressible
+        newKernel     = B92CompressibleNavierStokes::getNewInstance(para, level);               // compressible
         checkStrategy = FluidFlowCompStrategy::getInstance();                   //      ||
     } else if (kernel == CollisionKernel::Compressible::BGKUnified) {           //      \/
-        newKernel     = std::make_shared<vf::gpu::BGKUnified>(para, level);
+        newKernel     = std::make_shared<vf::gpu::B15CompressibleNavierStokesBGKplusUnified>(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::BGKPlus) {
-        newKernel     = BGKPlusCompSP27::getNewInstance(para, level);
+        newKernel     = B15CompressibleNavierStokesBGKplus::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::MRT) {
-        newKernel     = MRTCompSP27::getNewInstance(para, level);
+        newKernel     = M02CompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::Cascade) {
-        newKernel     = CascadeCompSP27::getNewInstance(para, level);
+        newKernel     = C06CompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::CumulantClassic) {
-        newKernel     = CumulantCompSP27::getNewInstance(para, level);
+        newKernel     = K08CompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::CumulantK15Unified) {
-        newKernel     = std::make_shared<vf::gpu::CumulantK15Unified>(para, level);
+        newKernel     = std::make_shared<vf::gpu::K15CompressibleNavierStokesUnified>(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK17Unified) {
-        newKernel     = std::make_shared<vf::gpu::CumulantK17Unified>(para, level);
+    } else if (kernel == CollisionKernel::Compressible::K17CompressibleNavierStokesUnified) {
+        newKernel     = std::make_shared<vf::gpu::K17CompressibleNavierStokesUnified>(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK17Bulk) {
-        newKernel     = CumulantK17BulkComp::getNewInstance(para, level);
+    } else if (kernel == CollisionKernel::Compressible::K17CompressibleNavierStokesBulkViscosity) {
+        newKernel     = K17CompressibleNavierStokesBulkViscosity::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK17Chim) {
-        newKernel     = CumulantK17CompChim::getNewInstance(para, level);
+    } else if (kernel == CollisionKernel::Compressible::K17CompressibleNavierStokesChimeraLegacy) {
+        newKernel     = K17CompressibleNavierStokesChimeraLegacy::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK17){
+    } else if (kernel == CollisionKernel::Compressible::K17CompressibleNavierStokes){
         switch(para->getTurbulenceModel())
         {
             case TurbulenceModel::AMD:
-                newKernel = CumulantK17<TurbulenceModel::AMD>::getNewInstance(para, level);
+                newKernel = K17CompressibleNavierStokes<TurbulenceModel::AMD>::getNewInstance(para, level);
                 break;
             case TurbulenceModel::Smagorinsky:
-                newKernel = CumulantK17<TurbulenceModel::Smagorinsky>::getNewInstance(para, level);
+                newKernel = K17CompressibleNavierStokes<TurbulenceModel::Smagorinsky>::getNewInstance(para, level);
                 break;
             case TurbulenceModel::QR:
-                newKernel = CumulantK17<TurbulenceModel::QR>::getNewInstance(para, level);
+                newKernel = K17CompressibleNavierStokes<TurbulenceModel::QR>::getNewInstance(para, level);
                 break;
             case TurbulenceModel::None:
-                newKernel = CumulantK17<TurbulenceModel::None>::getNewInstance(para, level);
+                newKernel = K17CompressibleNavierStokes<TurbulenceModel::None>::getNewInstance(para, level);
                 break;
             default:
                 throw std::runtime_error("Unknown turbulence model!");
@@ -151,44 +151,44 @@ std::shared_ptr<Kernel> KernelFactoryImp::makeKernel(std::shared_ptr<Parameter>
         }
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::CumulantAll4SP27) {
-        newKernel     = CumulantAll4CompSP27::getNewInstance(para, level);
+        newKernel     = K17CompressibleNavierStokesSecondDerivatesFrom5thCumulants::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::CumulantK18) {
-        newKernel     = CumulantK18Comp::getNewInstance(para, level);
+        newKernel     = K18CompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Compressible::CumulantK20) {
-        newKernel     = CumulantK20Comp::getNewInstance(para, level);
+        newKernel     = K20CompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK15) {
-        newKernel     = CumulantK15Comp::getNewInstance(para, level);
+    } else if (kernel == CollisionKernel::Compressible::K15CompressibleNavierStokes) {
+        newKernel     = K15CompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK15Bulk) {
-        newKernel     = CumulantK15BulkComp::getNewInstance(para, level);
+    } else if (kernel == CollisionKernel::Compressible::K15CompressibleNavierStokesBulk) {
+        newKernel     = K15CompressibleNavierStokesBulkViscosity::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Compressible::CumulantK15Sponge) {    //     /\      //
-        newKernel     = CumulantK15SpongeComp::getNewInstance(para, level);     //     ||
+    } else if (kernel == CollisionKernel::Compressible::K15CompressibleNavierStokesSponge) { //     /\      //
+        newKernel     = K15CompressibleNavierStokesSponge::getNewInstance(para, level);     //     ||
         checkStrategy = FluidFlowCompStrategy::getInstance();                   // compressible
     }                                                                           //===============
     else if (  kernel == CollisionKernel::Incompressible::BGK) {                // incompressible
-        newKernel     = BGKIncompSP27::getNewInstance(para, level);             //     ||
+        newKernel     = B92IncompressibleNavierStokes::getNewInstance(para, level);             //     ||
         checkStrategy = FluidFlowIncompStrategy::getInstance();                 //     \/
     } else if (kernel == CollisionKernel::Incompressible::BGKPlus) {
-        newKernel     = BGKPlusIncompSP27::getNewInstance(para, level);
+        newKernel     = B15IncompressibleNavierStokesBGKplus::getNewInstance(para, level);
         checkStrategy = FluidFlowIncompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Incompressible::MRT) {
-        newKernel     = MRTIncompSP27::getNewInstance(para, level);
+        newKernel     = M02IncompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowIncompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Incompressible::Cascade) {
-        newKernel     = CascadeIncompSP27::getNewInstance(para, level);
+        newKernel     = C06IncompressibleNavierStokes::getNewInstance(para, level);
         checkStrategy = FluidFlowIncompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Incompressible::Cumulant1h) {
-        newKernel     = Cumulant1hIncompSP27::getNewInstance(para, level);
-        checkStrategy = FluidFlowIncompStrategy::getInstance();
-    } else if (kernel == CollisionKernel::Incompressible::CumulantIsometric) {
-        newKernel     = CumulantIsoIncompSP27::getNewInstance(para, level);
+        newKernel     = K15IncompressibleNavierStokesRotatingVelocityField::getNewInstance(para, level);
         checkStrategy = FluidFlowIncompStrategy::getInstance();
+    //} else if (kernel == CollisionKernel::Incompressible::CumulantIsometric) {
+    //    newKernel     = K15IncompressibleNavierStokesIsoTest::getNewInstance(para, level);
+    //    checkStrategy = FluidFlowIncompStrategy::getInstance();
     } else if (kernel == CollisionKernel::Incompressible::CumulantK15) {          //     /\      //
-        newKernel     = CumulantK15Incomp::getNewInstance(para, level);           //     ||
+        newKernel     = K15IncompressibleNavierStokes::getNewInstance(para, level);           //     ||
         checkStrategy = FluidFlowIncompStrategy::getInstance();                   // incompressible
     }                                                                             //===============
     else if (kernel == CollisionKernel::PorousMedia::CumulantOne) {               // porous media
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h
index f249c0bd595d21455b4338334763be4e08abeda9..fd502fbeadf6d9445a786a8567dee1677557365f 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h
@@ -11,20 +11,20 @@ namespace vf::CollisionKernel::Compressible {
     static const std::string CumulantClassic = "CumulantCompSP27";
 
     static const std::string CumulantK15Unified = "CumulantK15Unified";
-    static const std::string CumulantK17Unified = "CumulantK17Unified";
+    static const std::string K17CompressibleNavierStokesUnified = "K17CompressibleNavierStokesUnified";
 
-    static const std::string CumulantK17Bulk = "CumulantK17BulkComp";
-    static const std::string CumulantK17Chim = "CumulantK17CompChim";
-    static const std::string CumulantK17 = "CumulantK17";
+    static const std::string K17CompressibleNavierStokes = "K17CompressibleNavierStokes";
+    static const std::string K17CompressibleNavierStokesBulkViscosity = "K17CompressibleNavierStokesBulkViscosity";
+    static const std::string K17CompressibleNavierStokesChimeraLegacy = "K17CompressibleNavierStokesChimeraLegacy";
 
     static const std::string CumulantAll4SP27 = "CumulantAll4CompSP27";
     static const std::string CumulantK18 = "CumulantK18Comp";
     static const std::string CumulantK20 = "CumulantK20Comp";
 
-    static const std::string CumulantK15 = "CumulantK15Comp";
-    static const std::string CumulantK15Bulk = "CumulantK15BulkComp";
-    static const std::string CumulantK15Sponge = "CumulantK15SpongeComp";
-}
+    static const std::string K15CompressibleNavierStokes = "K15CompressibleNavierStokes";
+    static const std::string K15CompressibleNavierStokesBulk = "K15CompressibleNavierStokesBulk";
+    static const std::string K15CompressibleNavierStokesSponge = "K15CompressibleNavierStokesSponge";
+    }
 
 namespace vf::CollisionKernel::Incompressible {
     static const std::string BGK = "BGKIncompSP27";
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index dddc795ccda96b49a03373c05a701f32662e9565..eb4e4f7bec0a23d4658825f26c26bdb637cb0c58 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -4,10 +4,8 @@
 
 #include <helper_timer.h>
 
-
 #include "Factories/GridScalingFactory.h"
 #include "LBM/LB.h"
-#include "Communication/Communicator.h"
 #include "Communication/ExchangeData27.h"
 #include "Parameter/Parameter.h"
 #include "Parameter/CudaStreamManager.h"
@@ -58,11 +56,12 @@
 #include "Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
 #include "Kernel/Kernel.h"
 #include "TurbulenceModels/TurbulenceModelFactory.h"
-#include <cuda/DeviceInfo.h>
 
-#include <logger/Logger.h>
+#include <cuda_helper/DeviceInfo.h>
 
+#include <logger/Logger.h>
 
+#include <parallel/Communicator.h>
 
 std::string getFileName(const std::string& fname, int step, int myID)
 {
@@ -70,7 +69,7 @@ std::string getFileName(const std::string& fname, int step, int myID)
 }
 
 Simulation::Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> memoryManager,
-                       vf::gpu::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, GridScalingFactory* scalingFactory)
+                       vf::parallel::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, GridScalingFactory* scalingFactory)
     : para(para), cudaMemoryManager(memoryManager), communicator(communicator), kernelFactory(std::make_unique<KernelFactoryImp>()),
       preProcessorFactory(std::make_shared<PreProcessorFactoryImp>()), dataWriter(std::make_unique<FileWriter>())
 {
@@ -79,7 +78,7 @@ Simulation::Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemo
 }
 
 Simulation::Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> memoryManager,
-                       vf::gpu::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, SPtr<TurbulenceModelFactory> tmFactory, GridScalingFactory* scalingFactory)
+                       vf::parallel::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, SPtr<TurbulenceModelFactory> tmFactory, GridScalingFactory* scalingFactory)
     : para(para), cudaMemoryManager(memoryManager), communicator(communicator), kernelFactory(std::make_unique<KernelFactoryImp>()),
       preProcessorFactory(std::make_shared<PreProcessorFactoryImp>()), dataWriter(std::make_unique<FileWriter>())
 {
@@ -90,8 +89,7 @@ void Simulation::init(GridProvider &gridProvider, BoundaryConditionFactory *bcFa
 {
     gridProvider.initalGridInformations();
 
-    vf::cuda::verifyAndSetDevice(
-        communicator.mapCudaDevice(para->getMyProcessID(), para->getNumprocs(), para->getDevices(), para->getMaxDev()));
+    vf::cuda::verifyAndSetDevice(communicator.mapCudaDevicesOnHosts(para->getDevices(), para->getMaxDev()));
 
     para->initLBMSimulationParameter();
 
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
index ba2a321707db4138aee9e1c30bae4dede017a5b8..146ab4cf6aebe395bff695f3e99aa7b6b1e776d3 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
@@ -6,11 +6,13 @@
 
 #include <PointerDefinitions.h>
 
-#include "Utilities/Buffer2D.hpp"
 #include "LBM/LB.h"
+#include "Utilities/Buffer2D.hpp"
 
-
-namespace vf::gpu { class Communicator; }
+namespace vf::parallel
+{
+class Communicator;
+}
 
 class CudaMemoryManager;
 class Parameter;
@@ -37,9 +39,9 @@ class Simulation
 {
 public:
     Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> memoryManager,
-               vf::gpu::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, GridScalingFactory* scalingFactory = nullptr);	
+               vf::parallel::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, GridScalingFactory* scalingFactory = nullptr);	
 	Simulation(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> memoryManager,
-               vf::gpu::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, SPtr<TurbulenceModelFactory> tmFactory, GridScalingFactory* scalingFactory = nullptr);
+               vf::parallel::Communicator &communicator, GridProvider &gridProvider, BoundaryConditionFactory* bcFactory, SPtr<TurbulenceModelFactory> tmFactory, GridScalingFactory* scalingFactory = nullptr);
 
     ~Simulation();
     void run();
@@ -76,7 +78,7 @@ private:
 	Buffer2D <int> geo_rbuf_b;
 
 
-	vf::gpu::Communicator& communicator;
+	vf::parallel::Communicator& communicator;
     SPtr<Parameter> para;
     std::shared_ptr<DataWriter> dataWriter;
 	std::shared_ptr<CudaMemoryManager> cudaMemoryManager;
diff --git a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu
index e5062a8ec63940ab6e23e567c0674681d4af6509..df6b2e6623977331bf4b64f2ea798deb7700020f 100644
--- a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu
+++ b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu
@@ -37,7 +37,7 @@
 #include "basics/constants/NumericConstants.h"
 #include "LBM/GPUHelperFunctions/KernelUtilities.h"
 
-#include <cuda/CudaGrid.h>
+#include <cuda_helper/CudaGrid.h>
 #include <cuda.h>
 
 #include <iostream>
diff --git a/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp
index ee5333dfc130ac7dfdf7ab8c4de812a2916777fa..eb43a5f1fb85e538d4a930ba43fdf546b5c878a8 100644
--- a/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp
@@ -3,7 +3,7 @@
 
 #include <fstream>
 #include <sstream>
-#include <stdio.h>
+#include <cstdio>
 // #include <math.h>
 #include "StringUtilities/StringUtil.h"
 #include "lbm/constants/D3Q27.h"
@@ -13,7 +13,6 @@
 #include <basics/writer/WbWriterVtkXmlBinary.h>
 #include <cmath>
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
 
 namespace EdgeNodeDebugWriter
 {
@@ -25,7 +24,7 @@ void addCoordinatesToNodeVector(SPtr<LBMSimulationParameter> parH, std::vector<U
             nodesVec[indexInNodesVector] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
 }
 
-void writeEdgeNodesXZ_Send(SPtr<Parameter> para)
+void writeEdgeNodesXZ_Send(SPtr<Parameter> para, int processID = 0)
 {
     std::vector<UbTupleFloat3> nodesVec;
     std::vector<std::string> datanames = { "SparseIndex", "ProcessNeighbor", "IndexInSendVector", "AfterFtoC" };
@@ -54,14 +53,14 @@ void writeEdgeNodesXZ_Send(SPtr<Parameter> para)
             nodeCount++;
         }
         std::string filenameVec = para->getFName() + "_writeEdgeNodesXZ_Send_PID_" +
-                                  std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + "_" +
+                                  std::to_string(processID) + "_" +
                                   StringUtil::toString<int>(level);
 
         WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
     }
 }
 
-void writeEdgeNodesXZ_Recv(SPtr<Parameter> para)
+void writeEdgeNodesXZ_Recv(SPtr<Parameter> para, int processID = 0)
 {
     std::vector<UbTupleFloat3> nodesVec;
     std::vector<std::string> datanames = { "SparseIndex", "ProcessNeighbor", "IndexInRecvVector", "AfterFtoC" };
@@ -90,7 +89,7 @@ void writeEdgeNodesXZ_Recv(SPtr<Parameter> para)
             nodeCount++;
         }
         std::string filenameVec = para->getFName() + "_writeEdgeNodesXZ_Recv_PID_" +
-                                  std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + "_" +
+                                  std::to_string(processID) + "_" +
                                   StringUtil::toString<int>(level);
 
         WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
index e28c802429c1703314c59402e2d4d490388b8ce1..9d4173b22a458f089d6ba96618dafeb6b89cbca0 100644
--- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
@@ -54,6 +54,12 @@ std::string makeMedianCollectionFileName(const std::string &prefix, int ID, int
     return prefix + "_bin_median" + makeCollectionFileNameEnding(ID, timestep);
 }
 
+std::string makePvdCollectionFileName(const std::string &prefix, int mpiProcessID)
+{
+    return prefix + "_bin" + "_ID_" + StringUtil::toString<int>(mpiProcessID);
+}
+
+
 void FileWriter::writeInit(std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager)
 {
     unsigned int timestep = para->getTimestepInit();
@@ -62,6 +68,7 @@ void FileWriter::writeInit(std::shared_ptr<Parameter> para, std::shared_ptr<Cuda
         writeTimestep(para, timestep, level);
     }
 
+    this->fileNamesForCollectionFileTimeSeries[timestep] = this->fileNamesForCollectionFile;
     this->writeCollectionFile(para, timestep);
 
     if( para->getCalcMedian() )
@@ -73,6 +80,10 @@ void FileWriter::writeTimestep(std::shared_ptr<Parameter> para, unsigned int tim
     for (int level = para->getCoarse(); level <= para->getFine(); level++)
         writeTimestep(para, timestep, level);
 
+    this->fileNamesForCollectionFileTimeSeries[timestep] = this->fileNamesForCollectionFile;
+    if (timestep == para->getTimestepEnd())
+        this->writePvdCollectionFileForTimeSeries(*para);
+
     this->writeCollectionFile(para, timestep);
 
     if( para->getCalcMedian() )
@@ -98,7 +109,6 @@ void FileWriter::writeTimestep(std::shared_ptr<Parameter> para, unsigned int tim
     for(auto fname : fnamesLong)
         this->fileNamesForCollectionFile.push_back(fname.substr( fname.find_last_of('/') + 1 ));
 
-
     if (para->getCalcMedian())
     {
         std::vector<std::string> fnamesMedianLong = writeUnstructuredGridMedianLT(para, level, fnamesMed);
@@ -187,6 +197,12 @@ std::string VIRTUALFLUIDS_GPU_EXPORT FileWriter::writeCollectionFileMedian(std::
     return pFileName;
 }
 
+std::string FileWriter::writePvdCollectionFileForTimeSeries(const Parameter &para)
+{
+    const std::string filename = makePvdCollectionFileName(para.getFName(), para.getMyProcessID());
+    return WbWriterVtkXmlBinary::getInstance()->writeCollectionForTimeSeries(filename, this->fileNamesForCollectionFileTimeSeries, false);
+}
+
 std::vector<std::string> FileWriter::writeUnstructuredGridLT(std::shared_ptr<Parameter> para, int level, std::vector<std::string >& fname)
 {
     std::vector< UbTupleFloat3 > nodes;
diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.h b/src/gpu/VirtualFluids_GPU/Output/FileWriter.h
index 73794f957f573d9dc29f57adff4e15d1f6ba7e18..c30e33b171563a612e224fd08fd1e4ee68b8fea8 100644
--- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.h
+++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.h
@@ -4,7 +4,7 @@
 #include <memory>
 #include <vector>
 #include <string>
-
+#include <map>
 
 
 #include "DataWriter.h"
@@ -29,10 +29,14 @@ private:
 
     std::string writeCollectionFileMedian( std::shared_ptr<Parameter> para, unsigned int timestep );
 
+    std::string writePvdCollectionFileForTimeSeries(const Parameter &para);
+
     std::vector<std::string> getNodeDataNames(std::shared_ptr<Parameter> para);
     std::vector<std::string> getMedianNodeDataNames(std::shared_ptr<Parameter> para);
 
     std::vector< std::string > fileNamesForCollectionFile;
     std::vector< std::string > fileNamesForCollectionFileMedian;
+
+    std::map<uint, std::vector<std::string>> fileNamesForCollectionFileTimeSeries; // key: timeStep, value: fileNames for timeStep
 };
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
index 4af9a50a123588e25f1ca9faa5c18581601f69d2..da5307c3d8080d7d10ad91dc970639fdd83dd2dc 100644
--- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
@@ -11,8 +11,6 @@
 #include <basics/writer/WbWriterVtkXmlBinary.h>
 #include <cmath>
 
-#include "VirtualFluids_GPU/Communication/MpiCommunicator.h"
-
 namespace InterfaceDebugWriter
 {
 
@@ -603,7 +601,7 @@ void checkForSendNodeZ(int pos, int &sendDir, int &sendDirectionInCommAfterFtoC,
                            para->getParH(level)->sendProcessNeighborsAfterFtoCZ, 8.0);
 }
 
-void writeInterfaceFCC_Send(Parameter *para)
+void writeInterfaceFCC_Send(Parameter *para, int processID = 0)
 {
     std::vector<UbTupleFloat3> nodesVec;
     int nodeNumberVec = 0;
@@ -650,14 +648,14 @@ void writeInterfaceFCC_Send(Parameter *para)
             nodeCount++;
         }
         std::string filenameVec = para->getFName() + "_writeInterfaceFCC_Send_PID_" +
-                                  std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + "_" +
+                                  std::to_string(processID) + "_" +
                                   StringUtil::toString<int>(level);
 
         WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
     }
 }
 
-void writeInterfaceCFC_Recv(Parameter *para)
+void writeInterfaceCFC_Recv(Parameter *para, int processID = 0)
 {
     std::vector<UbTupleFloat3> nodesVec;
     int nodeNumberVec = 0;
@@ -703,7 +701,7 @@ void writeInterfaceCFC_Recv(Parameter *para)
             nodeCount++;
         }
         std::string filenameVec = para->getFName() + "_writeInterfaceCFC_Recv_PID_" +
-                                  std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + "_" +
+                                  std::to_string(processID) + "_" +
                                   StringUtil::toString<int>(level);
 
         WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
@@ -718,7 +716,7 @@ void addToNodesVector(const int level, const int pos, std::vector<UbTupleFloat3>
     nodesVec.push_back(makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
 }
 
-void writeSendNodesStream(Parameter *para)
+void writeSendNodesStream(Parameter *para, int processID = 0)
 {
     std::vector<UbTupleFloat3> nodesVec;
 
@@ -808,14 +806,14 @@ void writeSendNodesStream(Parameter *para)
             }
         }
         std::string filenameVec = para->getFName() + "_writeSendNodesStreams_PID_" +
-                                  std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + "_" +
+                                  std::to_string(processID) + "_" +
                                   StringUtil::toString<int>(level);
 
         WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
     }
 }
 
-void writeRecvNodesStream(Parameter *para)
+void writeRecvNodesStream(Parameter *para, int processID = 0)
 {
     std::vector<UbTupleFloat3> nodesVec;
 
@@ -894,7 +892,7 @@ void writeRecvNodesStream(Parameter *para)
         // Recv are nodes ghost nodes and therefore they can't be coarse cells for the interpolation from coarse to fine
 
         std::string filenameVec = para->getFName() + "_writeRecvNodesStreams_PID_" +
-                                  std::to_string(vf::gpu::MpiCommunicator::getInstance().getPID()) + "_" +
+                                  std::to_string(processID) + "_" +
                                   StringUtil::toString<int>(level);
 
         WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
diff --git a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp
index e506a56bb76a263ac8982a7e53f39e67c268e49b..a05aad82137fc378b7f899d31c1b06d53199d694 100644
--- a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp
@@ -11,7 +11,6 @@
 
 #include "StringUtilities/StringUtil.h"
 #include "Utilities/FindNeighbors.h"
-#include "gpu/VirtualFluids_GPU/Communication/Communicator.h"
 
 namespace NeighborDebugWriter
 {
diff --git a/src/gpu/VirtualFluids_GPU/Output/QDebugVtkWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/QDebugVtkWriter.hpp
index d075c78e53a45e96adea43c8846159f4ba128c6d..5448db1329885ca542c951b3d068f3ab48fe502c 100644
--- a/src/gpu/VirtualFluids_GPU/Output/QDebugVtkWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/QDebugVtkWriter.hpp
@@ -11,7 +11,6 @@
 #include <logger/Logger.h>
 
 #include "gpu/GridGenerator/grid/NodeValues.h"
-#include "gpu/VirtualFluids_GPU/Communication/Communicator.h"
 #include "gpu/VirtualFluids_GPU/LBM/LB.h"
 #include "gpu/VirtualFluids_GPU/Parameter/Parameter.h"
 #include "gpu/VirtualFluids_GPU/Utilities/FindNeighbors.h"
diff --git a/src/gpu/VirtualFluids_GPU/Output/Timer.cpp b/src/gpu/VirtualFluids_GPU/Output/Timer.cpp
index f6efff58440bd786d57a3ccb44d2271c29761323..a3048e62d674aff4e21a93292f694541dc86e36f 100644
--- a/src/gpu/VirtualFluids_GPU/Output/Timer.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/Timer.cpp
@@ -4,7 +4,8 @@
 
 #include "UbScheduler.h"
 #include "Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Communication/Communicator.h"
+
+#include <parallel/Communicator.h>
 
 void Timer::initTimer()
 {
@@ -31,7 +32,7 @@ void Timer::resetTimer()
         this->totalElapsedTime = 0.0;
 }
 
-void Timer::outputPerformance(uint t, Parameter* para, vf::gpu::Communicator& communicator)
+void Timer::outputPerformance(uint t, Parameter* para, vf::parallel::Communicator& communicator)
 {
     real fnups      = 0.0;
     real bandwidth  = 0.0;
@@ -42,18 +43,18 @@ void Timer::outputPerformance(uint t, Parameter* para, vf::gpu::Communicator& co
         bandwidth   += (27.0+1.0) * 4.0 * 1000.0 * (t-para->getTimestepStart()) * para->getParH(lev)->numberOfNodes  / (this->totalElapsedTime*1.0E9);
     }
 
-    if(this->firstOutput && communicator.getPID() == 0) //only display the legend once
+    if(this->firstOutput && communicator.getProcessID() == 0) //only display the legend once
     {
         VF_LOG_INFO("PID \t --- {} ---  Processing time (ms) \t Nups in Mio \t Bandwidth in GB/sec", this->name );
         this->firstOutput = false;
     }
 
-    VF_LOG_INFO(" {} \t --- {} --- {:>8.1f}/ {:<8.1f} \t   {:5.1f} \t       {:4.1f}",  communicator.getPID(), this->name, this->elapsedTime, this->totalElapsedTime, fnups, bandwidth);
+    VF_LOG_INFO(" {} \t --- {} --- {:>8.1f}/ {:<8.1f} \t   {:5.1f} \t       {:4.1f}",  communicator.getProcessID(), this->name, this->elapsedTime, this->totalElapsedTime, fnups, bandwidth);
 
     // When using multiple GPUs, sum the nups of all processes
-    if (communicator.getNumberOfProcess() > 1) {
-        double nupsSum =  communicator.reduceSum(fnups);
-        if (communicator.getPID() == 0)
-            VF_LOG_INFO("Sum of all {} processes: Nups in Mio: {:.1f}", communicator.getNumberOfProcess(), nupsSum);
+    if (communicator.getNumberOfProcesses() > 1) {
+        double nupsSum = communicator.reduceSum(fnups);
+        if (communicator.getProcessID() == 0)
+            VF_LOG_INFO("Sum of all {} processes: Nups in Mio: {:.1f}", communicator.getNumberOfProcesses(), nupsSum);
     }
 }
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Output/Timer.h b/src/gpu/VirtualFluids_GPU/Output/Timer.h
index 55ada64ad245ee41aa99a1185eba134a652067c9..fd76c66703c2a60d9aed26365f415fe3c93e7e1f 100644
--- a/src/gpu/VirtualFluids_GPU/Output/Timer.h
+++ b/src/gpu/VirtualFluids_GPU/Output/Timer.h
@@ -6,14 +6,15 @@
 #include "Parameter/Parameter.h"
 #include <logger/Logger.h>
 
-namespace vf::gpu{
-    class Communicator;
+namespace vf::parallel
+{
+class Communicator;
 }
 class Parameter;
 
 class Timer
 {
-    public:
+public:
     Timer(std::string _name): name(_name)
     {
         this->initTimer();
@@ -29,13 +30,12 @@ class Timer
     void startTimer();
     void stopTimer();
     void resetTimer();
-    void outputPerformance(uint t, Parameter* para, vf::gpu::Communicator& communicator);
+    void outputPerformance(uint t, Parameter* para, vf::parallel::Communicator& communicator);
 
     float getElapsedTime(){ return this->elapsedTime; }
     float getTotalElapsedTime(){ return this->totalElapsedTime; }
 
-    private:
-    
+private:
     cudaEvent_t start_t, stop_t;
     float elapsedTime = 0.0;
     float totalElapsedTime = 0.0;
@@ -44,6 +44,4 @@ class Timer
     bool firstOutput = true;
 };
 
-
-
 #endif 
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
index 9044f69dccdc848192f62b02c737b8ec961d4ba8..746029baf8cfdc7529b3150e97e6a1efb7ba18ab 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
@@ -346,7 +346,7 @@ void Parameter::readConfigData(const vf::basics::ConfigurationFile &configData)
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // Kernel
     if (configData.contains("MainKernelName"))
-        this->setMainKernel(configData.getValue<std::string>("MainKernelName"));
+        this->configureMainKernel(configData.getValue<std::string>("MainKernelName"));
 
     if (configData.contains("MultiKernelOn"))
         this->setMultiKernelOn(configData.getValue<bool>("MultiKernelOn"));
@@ -599,7 +599,7 @@ void Parameter::initLBMSimulationParameter()
 
 void Parameter::checkParameterValidityCumulantK17() const
 {
-    if (this->mainKernel != "CumulantK17")
+    if (this->mainKernel != vf::CollisionKernel::Compressible::K17CompressibleNavierStokes)
         return;
 
     const real viscosity = this->parH[maxlevel]->viscosity;
@@ -1635,10 +1635,10 @@ void Parameter::setOutflowBoundaryNormalZ(std::string outflowNormalZ)
 {
     this->outflowNormalZ = outflowNormalZ;
 }
-void Parameter::setMainKernel(std::string kernel)
+void Parameter::configureMainKernel(std::string kernel)
 {
     this->mainKernel = kernel;
-    if ( kernel.find("CumulantK17") != std::string::npos )
+    if (kernel == vf::CollisionKernel::Compressible::K17CompressibleNavierStokes)
         this->kernelNeedsFluidNodeIndicesToRun = true;
 }
 void Parameter::setMultiKernelOn(bool isOn)
@@ -1883,7 +1883,7 @@ std::string Parameter::getOutputPrefix()
 {
     return this->oPrefix;
 }
-std::string Parameter::getFName()
+std::string Parameter::getFName() const
 {
     return this->fname;
 }
@@ -1955,11 +1955,11 @@ int Parameter::getMaxDev()
 {
     return this->maxdev;
 }
-int Parameter::getMyProcessID()
+int Parameter::getMyProcessID() const
 {
     return this->myProcessId;
 }
-int Parameter::getNumprocs()
+int Parameter::getNumprocs() const
 {
     return this->numprocs;
 }
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index 89398e063027fe062cce240e397eff59a67732c2..739b07cbaca6ce8aedb1c030d179f192fe15e228 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -43,6 +43,7 @@
 #include "LBM/LB.h"
 #include "PreCollisionInteractor/PreCollisionInteractor.h"
 #include "TurbulenceModels/TurbulenceModelFactory.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
 
 #include "VirtualFluids_GPU_export.h"
 
@@ -676,7 +677,7 @@ public:
     void setOutflowBoundaryNormalY(std::string outflowNormalY);
     void setOutflowBoundaryNormalZ(std::string outflowNormalZ);
     // Kernel
-    void setMainKernel(std::string kernel);
+    void configureMainKernel(std::string kernel);
     void setMultiKernelOn(bool isOn);
     void setMultiKernelLevel(std::vector<int> kernelLevel);
     void setMultiKernel(std::vector<std::string> kernel);
@@ -730,11 +731,11 @@ public:
     int getTimeCalcMedEnd();
     int getMaxDev();
     //! \returns the ID of the current MPI process
-    int getMyProcessID();
-    int getNumprocs();
+    int getMyProcessID() const;
+    int getNumprocs() const;
     std::string getOutputPath();
     std::string getOutputPrefix();
-    std::string getFName();
+    std::string getFName() const;
     std::string getGridPath();
     std::string getGeometryFileC();
     std::string getGeometryFileM();
@@ -1085,7 +1086,7 @@ private:
 
 
     // Kernel
-    std::string mainKernel{ "CumulantK17CompChim" };
+    std::string mainKernel{ vf::CollisionKernel::Compressible::K17CompressibleNavierStokes };
     bool multiKernelOn{ false };
     std::vector<int> multiKernelLevel;
     std::vector<std::string> multiKernel;
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp b/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp
index bed52dc97b8bde45712bca95f924a026ccb894f1..2eee0f7f2e88ee3315e6c80fe6e7827141979a80 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp
@@ -9,12 +9,14 @@
 #include "PointerDefinitions.h"
 #include "basics/config/ConfigurationFile.h"
 
+#include "DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "Factories/BoundaryConditionFactory.h"
 #include "Factories/GridScalingFactory.h"
-#include "Communication/Communicator.h"
-#include "DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "GPU/CudaMemoryManager.h"
 #include "gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelTypes.h"
+
+#include <parallel/Communicator.h>
 
 TEST(ParameterTest, passingEmptyFileWithoutPath_ShouldNotThrow)
 {
@@ -212,7 +214,7 @@ class MockGridGenerator : public GridGenerator
 
 public:
     MockGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para,
-                      std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::Communicator &communicator)
+                      std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::parallel::Communicator &communicator)
         : GridGenerator(builder, para, cudaMemoryManager, communicator)
     {
     }
@@ -270,7 +272,7 @@ TEST_F(ParameterTestCumulantK17, CumulantK17_VelocityIsTooHigh_expectWarning)
 {
 
     para.setVelocityLB(0.11);
-    para.setMainKernel("CumulantK17");
+    para.configureMainKernel(vf::CollisionKernel::Compressible::K17CompressibleNavierStokes);
     testing::internal::CaptureStdout();
 
     para.initLBMSimulationParameter();
@@ -281,7 +283,7 @@ TEST_F(ParameterTestCumulantK17, CumulantK17_VelocityIsTooHigh_expectWarning)
 TEST_F(ParameterTestCumulantK17, CumulantK17_VelocityIsOk_expectNoWarning)
 {
     para.setVelocityLB(0.09);
-    para.setMainKernel("CumulantK17");
+    para.configureMainKernel("K17CompressibleNavierStokes");
     testing::internal::CaptureStdout();
 
     para.initLBMSimulationParameter();
@@ -292,7 +294,7 @@ TEST_F(ParameterTestCumulantK17, CumulantK17_VelocityIsOk_expectNoWarning)
 TEST_F(ParameterTestCumulantK17, NotCumulantK17_VelocityIsTooHigh_expectNoWarning)
 {
     para.setVelocityLB(42);
-    para.setMainKernel("K");
+    para.configureMainKernel("K");
     testing::internal::CaptureStdout();
 
     para.initLBMSimulationParameter();
@@ -303,7 +305,7 @@ TEST_F(ParameterTestCumulantK17, NotCumulantK17_VelocityIsTooHigh_expectNoWarnin
 TEST_F(ParameterTestCumulantK17, CumulantK17_ViscosityIsTooHigh_expectWarning)
 {
     para.setViscosityLB(0.024);
-    para.setMainKernel("CumulantK17");
+    para.configureMainKernel("K17CompressibleNavierStokes");
     testing::internal::CaptureStdout();
 
     para.initLBMSimulationParameter();
@@ -314,7 +316,7 @@ TEST_F(ParameterTestCumulantK17, CumulantK17_ViscosityIsTooHigh_expectWarning)
 TEST_F(ParameterTestCumulantK17, CumulantK17_ViscosityIsOk_expectNoWarning)
 {
     para.setViscosityLB(0.023);
-    para.setMainKernel("CumulantK17");
+    para.configureMainKernel("K17CompressibleNavierStokes");
     testing::internal::CaptureStdout();
 
     para.initLBMSimulationParameter();
@@ -325,7 +327,7 @@ TEST_F(ParameterTestCumulantK17, CumulantK17_ViscosityIsOk_expectNoWarning)
 TEST_F(ParameterTestCumulantK17, NotCumulantK17_ViscosityIsTooHigh_expectNoWarning)
 {
     para.setViscosityLB(10);
-    para.setMainKernel("K");
+    para.configureMainKernel("K");
     testing::internal::CaptureStdout();
 
     para.initLBMSimulationParameter();
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu
index f2d4b27a159c3f3687bd58933b55558ca08cd16d..c09e58d9dd664e7b513131ffa1bdb548eb35a244 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu
@@ -31,43 +31,29 @@
 //! \author Henrik Asmuth, Henry Korb
 //======================================================================================
 #include "ActuatorFarm.h"
+#include "ActuatorFarmInlines.h"
 
 #include <cuda.h>
 #include <cuda_runtime.h>
 #include <helper_cuda.h>
 
-#include "cuda/CudaGrid.h"
+#include <logger/Logger.h>
+#include <cuda_helper/CudaGrid.h>
+#include <basics/constants/NumericConstants.h>
+#include <basics/writer/WbWriterVtkXmlBinary.h>
+
 #include "VirtualFluids_GPU/GPU/GeometryUtils.h"
 #include "LBM/GPUHelperFunctions/KernelUtilities.h"
-
 #include "Parameter/Parameter.h"
 #include "Parameter/CudaStreamManager.h"
 #include "DataStructureInitializer/GridProvider.h"
 #include "GPU/CudaMemoryManager.h"
-#include "basics/constants/NumericConstants.h"
-#include <logger/Logger.h>
 
 using namespace vf::basics::constant;
 
-
-__host__ __device__ __inline__ uint calcNode(uint bladeNode, uint numberOfBladeNodes, uint blade, uint numberOfBlades, uint turbine, uint numberOfTurbines)
-{
-
-    return bladeNode+numberOfBladeNodes*(blade+numberOfBlades*turbine);
-}
-
-__host__ __device__ __inline__ void calcTurbineBladeAndBladeNode(uint node, uint& bladeNode, uint numberOfBladeNodes, uint& blade, uint numberOfBlades, uint& turbine, uint numberOfTurbines)
-{
-    turbine = node/(numberOfBladeNodes*numberOfBlades);
-    uint x_off = turbine*numberOfBladeNodes*numberOfBlades;
-    blade = (node - x_off)/numberOfBlades;
-    uint y_off = numberOfBladeNodes*blade+x_off;
-    bladeNode = (node - y_off);
-}
-
 __host__ __device__ __forceinline__ real distSqrd(real distX, real distY, real distZ)
 {
-    return distX*distX+distY*distY+distZ*distZ;
+    return distX * distX + distY * distY + distZ * distZ;
 }
 
 void swapArrays(real* &arr1, real* &arr2)
@@ -100,13 +86,31 @@ __host__ __device__ __inline__ void rotateFromGlobalToBlade(
     invRotateAboutX3D(azimuth, tmpX, tmpY, tmpZ, bladeCoordX_BF, bladeCoordY_BF, bladeCoordZ_BF);
 }
 
-__global__ void interpolateVelocities(real* gridCoordsX, real* gridCoordsY, real* gridCoordsZ, 
-                                      uint* neighborsX, uint* neighborsY, uint* neighborsZ, uint* neighborsWSB, 
-                                      real* vx, real* vy, real* vz, 
+__host__ __device__ __inline__ void calcCoordinateOfBladeNodeInGridFrameOfReference(uint bladeNodeIndex, uint turbine, real localAzimuth, real yaw,
+                                                                                    const real* bladeCoordsX, const real* bladeCoordsY, const real* bladeCoordsZ,
+                                                                                    const real* turbPosX, const real* turbPosY, const real* turbPosZ,
+                                                                                    real& bladeCoordX_GF, real& bladeCoordY_GF, real& bladeCoordZ_GF)
+{
+
+    const real bladeCoordX_BF = bladeCoordsX[bladeNodeIndex];
+    const real bladeCoordY_BF = bladeCoordsY[bladeNodeIndex];
+    const real bladeCoordZ_BF = bladeCoordsZ[bladeNodeIndex];
+
+    rotateFromBladeToGlobal(bladeCoordX_BF, bladeCoordY_BF, bladeCoordZ_BF, bladeCoordX_GF, bladeCoordY_GF,
+                            bladeCoordZ_GF, localAzimuth, yaw);
+
+    bladeCoordX_GF += turbPosX[turbine];
+    bladeCoordY_GF += turbPosY[turbine];
+    bladeCoordZ_GF += turbPosZ[turbine];
+}
+
+__global__ void interpolateVelocities(real* gridCoordsX, real* gridCoordsY, real* gridCoordsZ,
+                                      uint* neighborsX, uint* neighborsY, uint* neighborsZ, uint* neighborsWSB,
+                                      real* vx, real* vy, real* vz,
                                       real* bladeCoordsX, real* bladeCoordsY, real* bladeCoordsZ,
-                                      real* bladeVelocitiesX, real* bladeVelocitiesY, real* bladeVelocitiesZ, 
-                                      uint numberOfTurbines, uint numberOfBlades, uint numberOfBladeNodes, 
-                                      real* azimuths, real* yaws, real* omegas, 
+                                      real* bladeVelocitiesX, real* bladeVelocitiesY, real* bladeVelocitiesZ,
+                                      uint numberOfTurbines, uint numberOfBlades, uint numberOfBladeNodes,
+                                      real* azimuths, real* yaws, real* omegas,
                                       real* turbPosX, real* turbPosY, real* turbPosZ,
                                       uint* bladeIndices, real velocityRatio, real invDeltaX)
 {
@@ -116,66 +120,54 @@ __global__ void interpolateVelocities(real* gridCoordsX, real* gridCoordsY, real
     //!
     const unsigned nodeIndex = vf::gpu::getNodeIndex();
 
-    if(nodeIndex>=numberOfBladeNodes*numberOfBlades*numberOfTurbines) return;
-
-    uint turbine, bladeNode, blade;
+    if (nodeIndex >= numberOfBladeNodes * numberOfBlades * numberOfTurbines) return;
 
-    calcTurbineBladeAndBladeNode(nodeIndex, bladeNode, numberOfBladeNodes, blade, numberOfBlades, turbine, numberOfTurbines);
+    auto [turbine, blade, bladeNodeIndexOnBlade] = calcTurbineBladeAndBladeNode(nodeIndex, numberOfBladeNodes, numberOfBlades);
 
-    real bladeCoordX_BF = bladeCoordsX[nodeIndex];
-    real bladeCoordY_BF = bladeCoordsY[nodeIndex];
-    real bladeCoordZ_BF = bladeCoordsZ[nodeIndex];
+    const real localAzimuth = azimuths[turbine] + blade * c2Pi / numberOfBlades;
+    const real yaw = yaws[turbine];
 
     real bladeCoordX_GF, bladeCoordY_GF, bladeCoordZ_GF;
-
-    real localAzimuth = azimuths[turbine]+blade*c2Pi/numberOfBlades;
-    real yaw = yaws[turbine];
-
-
-    rotateFromBladeToGlobal(bladeCoordX_BF, bladeCoordY_BF, bladeCoordZ_BF, 
-                            bladeCoordX_GF, bladeCoordY_GF, bladeCoordZ_GF,
-                            localAzimuth, yaw);
-
-    bladeCoordX_GF += turbPosX[turbine];
-    bladeCoordY_GF += turbPosY[turbine];
-    bladeCoordZ_GF += turbPosZ[turbine];
+    calcCoordinateOfBladeNodeInGridFrameOfReference(nodeIndex, turbine, localAzimuth, yaw,
+                                                    bladeCoordsX, bladeCoordsY, bladeCoordsZ,
+                                                    turbPosX, turbPosY, turbPosZ,
+                                                    bladeCoordX_GF, bladeCoordY_GF, bladeCoordZ_GF);
 
     uint k, ke, kn, kt;
     uint kne, kte, ktn, ktne;
 
-    k = findNearestCellBSW(bladeIndices[nodeIndex], 
-                           gridCoordsX, gridCoordsY, gridCoordsZ, 
-                           bladeCoordX_GF, bladeCoordY_GF, bladeCoordZ_GF, 
+    k = findNearestCellBSW(bladeIndices[nodeIndex],
+                           gridCoordsX, gridCoordsY, gridCoordsZ,
+                           bladeCoordX_GF, bladeCoordY_GF, bladeCoordZ_GF,
                            neighborsX, neighborsY, neighborsZ, neighborsWSB);
-        
+
     bladeIndices[nodeIndex] = k;
 
     getNeighborIndicesOfBSW(k, ke, kn, kt, kne, kte, ktn, ktne, neighborsX, neighborsY, neighborsZ);
 
     real dW, dE, dN, dS, dT, dB;
 
-    real distX = invDeltaX*(bladeCoordX_GF-gridCoordsX[k]);
-    real distY = invDeltaX*(bladeCoordY_GF-gridCoordsY[k]);
-    real distZ = invDeltaX*(bladeCoordZ_GF-gridCoordsZ[k]);
+    real distX = invDeltaX * (bladeCoordX_GF - gridCoordsX[k]);
+    real distY = invDeltaX * (bladeCoordY_GF - gridCoordsY[k]);
+    real distZ = invDeltaX * (bladeCoordZ_GF - gridCoordsZ[k]);
 
     getInterpolationWeights(dW, dE, dN, dS, dT, dB, distX, distY, distZ);
 
-    real bladeVelX_GF = trilinearInterpolation(dW, dE, dN, dS, dT, dB, k, ke, kn, kt, kne, kte, ktn, ktne, vx)*velocityRatio;
-    real bladeVelY_GF = trilinearInterpolation(dW, dE, dN, dS, dT, dB, k, ke, kn, kt, kne, kte, ktn, ktne, vy)*velocityRatio;
-    real bladeVelZ_GF = trilinearInterpolation(dW, dE, dN, dS, dT, dB, k, ke, kn, kt, kne, kte, ktn, ktne, vz)*velocityRatio;
+    real bladeVelX_GF = trilinearInterpolation(dW, dE, dN, dS, dT, dB, k, ke, kn, kt, kne, kte, ktn, ktne, vx) * velocityRatio;
+    real bladeVelY_GF = trilinearInterpolation(dW, dE, dN, dS, dT, dB, k, ke, kn, kt, kne, kte, ktn, ktne, vy) * velocityRatio;
+    real bladeVelZ_GF = trilinearInterpolation(dW, dE, dN, dS, dT, dB, k, ke, kn, kt, kne, kte, ktn, ktne, vz) * velocityRatio;
 
     real bladeVelX_BF, bladeVelY_BF, bladeVelZ_BF;
 
-    rotateFromGlobalToBlade(bladeVelX_BF, bladeVelY_BF, bladeVelZ_BF, 
-                            bladeVelX_GF, bladeVelY_GF, bladeVelZ_GF, 
+    rotateFromGlobalToBlade(bladeVelX_BF, bladeVelY_BF, bladeVelZ_BF,
+                            bladeVelX_GF, bladeVelY_GF, bladeVelZ_GF,
                             localAzimuth, yaw);
 
     bladeVelocitiesX[nodeIndex] = bladeVelX_BF;
-    bladeVelocitiesY[nodeIndex] = bladeVelY_BF+omegas[turbine]*bladeCoordZ_BF;
+    bladeVelocitiesY[nodeIndex] = bladeVelY_BF + omegas[turbine] * bladeCoordsZ[nodeIndex];
     bladeVelocitiesZ[nodeIndex] = bladeVelZ_BF;
 }
 
-
 __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* gridCoordsZ,
                                 real* gridForcesX, real* gridForcesY, real* gridForcesZ, 
                                 real* bladeCoordsX, real* bladeCoordsY, real* bladeCoordsZ, 
@@ -189,8 +181,7 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid
 
     const uint index = vf::gpu::getNodeIndex();
 
-    if(index>=nIndices) return;
-
+    if (index >= nIndices) return;
 
     uint gridIndex = gridIndices[index];
 
@@ -202,34 +193,30 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid
     real gridForceY_RF = c0o1;
     real gridForceZ_RF = c0o1;
 
-    real dAzimuth = c2Pi/numberOfBlades;
+    real dAzimuth = c2Pi / numberOfBlades;
 
-    for(uint turbine = 0; turbine<numberOfTurbines; turbine++)
-    {
-        real radius = c1o2*diameters[turbine];
+    for (uint turbine = 0; turbine < numberOfTurbines; turbine++) {
+        real radius = c1o2 * diameters[turbine];
         real gridCoordX_RF = gridCoordX_GF - turbPosX[turbine];
         real gridCoordY_RF = gridCoordY_GF - turbPosY[turbine];
         real gridCoordZ_RF = gridCoordZ_GF - turbPosZ[turbine];
 
-        if(distSqrd(gridCoordX_RF, gridCoordY_RF, gridCoordZ_RF)*invEpsilonSqrd > radius*radius*invEpsilonSqrd+c7o1)
-            continue;
+        if (distSqrd(gridCoordX_RF, gridCoordY_RF, gridCoordZ_RF) * invEpsilonSqrd > radius * radius * invEpsilonSqrd + c7o1) continue;
 
         real azimuth = azimuths[turbine];
         real yaw = yaws[turbine];
 
-        for( uint blade=0; blade<numberOfBlades; blade++)
-        { 
-            real localAzimuth = azimuth+blade*dAzimuth;
-
+        for (uint blade = 0; blade < numberOfBlades; blade++) {
+            real localAzimuth = azimuth + blade * dAzimuth;
 
             real gridCoordX_BF, gridCoordY_BF, gridCoordZ_BF;
 
             rotateFromGlobalToBlade(gridCoordX_BF, gridCoordY_BF, gridCoordZ_BF,
                                     gridCoordX_RF, gridCoordY_RF, gridCoordZ_RF,
                                     localAzimuth, yaw);
-            
+
             uint node;
-            uint nextNode = calcNode(0, numberOfBladeNodes, blade, numberOfBlades, turbine, numberOfTurbines);
+            uint nextNode = calcNodeIndexInBladeArrays({ /*.turbine = */ turbine, /* .blade = */ blade, /*.bladeNode =*/0 }, numberOfBladeNodes, numberOfBlades);
 
             real last_z = c0o1;
             real current_z = c0o1;
@@ -237,10 +224,9 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid
 
             real x, y, dz, eta, forceX_RF, forceY_RF, forceZ_RF;
 
-            for( uint bladeNode=0; bladeNode<numberOfBladeNodes-1; bladeNode++)
-            {
+            for (uint bladeNode = 0; bladeNode < numberOfBladeNodes - 1; bladeNode++) {
                 node = nextNode;
-                nextNode = calcNode(bladeNode+1, numberOfBladeNodes, blade, numberOfBlades, turbine, numberOfTurbines);
+                nextNode = calcNodeIndexInBladeArrays({ /*.turbine = */ turbine, /* .blade = */ blade, /*.bladeNode =*/bladeNode + 1 }, numberOfBladeNodes, numberOfBlades);
 
                 x = bladeCoordsX[node];
                 y = bladeCoordsY[node];
@@ -248,19 +234,17 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid
                 current_z = next_z;
                 next_z = bladeCoordsZ[nextNode];
 
-                dz = c1o2*(next_z-last_z);
+                dz = c1o2 * (next_z - last_z);
 
-                eta = dz*factorGaussian*exp(-distSqrd(x-gridCoordX_BF, y-gridCoordY_BF, current_z-gridCoordZ_BF)*invEpsilonSqrd);
-                rotateFromBladeToGlobal(bladeForcesX[node], bladeForcesY[node], bladeForcesZ[node], 
-                                        forceX_RF, forceY_RF, forceZ_RF, 
-                                        localAzimuth, yaw);
-                                        
-                gridForceX_RF += forceX_RF*eta;
-                gridForceY_RF += forceY_RF*eta;
-                gridForceZ_RF += forceZ_RF*eta;
+                eta = dz * factorGaussian * exp(-distSqrd(x - gridCoordX_BF, y - gridCoordY_BF, current_z - gridCoordZ_BF) * invEpsilonSqrd);
+                rotateFromBladeToGlobal(bladeForcesX[node], bladeForcesY[node], bladeForcesZ[node], forceX_RF, forceY_RF, forceZ_RF, localAzimuth, yaw);
+
+                gridForceX_RF += forceX_RF * eta;
+                gridForceY_RF += forceY_RF * eta;
+                gridForceZ_RF += forceZ_RF * eta;
             }
 
-            //Handle last node separately
+            // Handle last node separately
 
             node = nextNode;
 
@@ -269,17 +253,17 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid
             last_z = current_z;
             current_z = next_z;
 
-            dz = c1o2*(radius-last_z);
+            dz = c1o2 * (radius - last_z);
 
-            eta = dz*factorGaussian*exp(-distSqrd(x-gridCoordX_BF, y-gridCoordY_BF, current_z-gridCoordZ_BF)*invEpsilonSqrd);
+            eta = dz * factorGaussian * exp(-distSqrd(x - gridCoordX_BF, y - gridCoordY_BF, current_z - gridCoordZ_BF) * invEpsilonSqrd);
 
-            rotateFromBladeToGlobal(bladeForcesX[node], bladeForcesY[node], bladeForcesZ[node], 
-                                    forceX_RF, forceY_RF, forceZ_RF, 
+            rotateFromBladeToGlobal(bladeForcesX[node], bladeForcesY[node], bladeForcesZ[node],
+                                    forceX_RF, forceY_RF, forceZ_RF,
                                     localAzimuth, yaw);
-                
-            gridForceX_RF += forceX_RF*eta;
-            gridForceY_RF += forceY_RF*eta;
-            gridForceZ_RF += forceZ_RF*eta;
+
+            gridForceX_RF += forceX_RF * eta;
+            gridForceY_RF += forceY_RF * eta;
+            gridForceZ_RF += forceZ_RF * eta;
         }
     }
 
@@ -300,9 +284,9 @@ void ActuatorFarm::addTurbine(real posX, real posY, real posZ, real diameter, re
     preInitBladeRadii.push_back(bladeRadii);
 }
 
-void ActuatorFarm::init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* cudaMemoryManager)
+void ActuatorFarm::init(Parameter *para, GridProvider *gridProvider, CudaMemoryManager *cudaMemoryManager)
 {
-    if(!para->getIsBodyForce()) throw std::runtime_error("try to allocate ActuatorFarm but BodyForce is not set in Parameter.");
+    if (!para->getIsBodyForce()) throw std::runtime_error("try to allocate ActuatorFarm but BodyForce is not set in Parameter.");
     this->forceRatio = para->getForceRatio();
     this->initTurbineGeometries(cudaMemoryManager);
     this->initBladeCoords(cudaMemoryManager);
@@ -313,40 +297,42 @@ void ActuatorFarm::init(Parameter* para, GridProvider* gridProvider, CudaMemoryM
     this->streamIndex = para->getStreamManager()->registerAndLaunchStream(CudaStreamIndex::ActuatorFarm);
 }
 
-void ActuatorFarm::interact(Parameter* para, CudaMemoryManager* cudaMemoryManager, int level, unsigned int t)
+void ActuatorFarm::interact(Parameter *para, CudaMemoryManager *cudaMemoryManager, int level, unsigned int t)
 {
     if (level != this->level) return;
 
     cudaStream_t stream = para->getStreamManager()->getStream(CudaStreamIndex::ActuatorFarm, this->streamIndex);
 
-    if(useHostArrays) cudaMemoryManager->cudaCopyBladeCoordsHtoD(this);
+    if (useHostArrays) cudaMemoryManager->cudaCopyBladeCoordsHtoD(this);
 
     vf::cuda::CudaGrid bladeGrid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, this->numberOfGridNodes);
 
+    // if (t == 0) this->writeBladeCoordsToVtkForDebug("output/ALM/bladecoords_" + std::to_string(t));
+
     interpolateVelocities<<< bladeGrid.grid, bladeGrid.threads, 0, stream >>>(
-        para->getParD(this->level)->coordinateX, para->getParD(this->level)->coordinateY, para->getParD(this->level)->coordinateZ,        
+        para->getParD(this->level)->coordinateX, para->getParD(this->level)->coordinateY, para->getParD(this->level)->coordinateZ,
         para->getParD(this->level)->neighborX, para->getParD(this->level)->neighborY, para->getParD(this->level)->neighborZ, para->getParD(this->level)->neighborInverse,
         para->getParD(this->level)->velocityX, para->getParD(this->level)->velocityY, para->getParD(this->level)->velocityZ,
         this->bladeCoordsXDCurrentTimestep, this->bladeCoordsYDCurrentTimestep, this->bladeCoordsZDCurrentTimestep,  
-        this->bladeVelocitiesXDCurrentTimestep, this->bladeVelocitiesYDCurrentTimestep, this->bladeVelocitiesZDCurrentTimestep,  
+        this->bladeVelocitiesXDCurrentTimestep, this->bladeVelocitiesYDCurrentTimestep, this->bladeVelocitiesZDCurrentTimestep,
         this->numberOfTurbines, this->numberOfBlades, this->numberOfBladeNodes,
         this->azimuthsD, this->yawsD, this->omegasD, 
         this->turbinePosXD, this->turbinePosYD, this->turbinePosZD,
         this->bladeIndicesD, para->getVelocityRatio(), this->invDeltaX);
 
     cudaStreamSynchronize(stream);
-    if(useHostArrays) cudaMemoryManager->cudaCopyBladeVelocitiesDtoH(this);
+    if (useHostArrays) cudaMemoryManager->cudaCopyBladeVelocitiesDtoH(this);
     this->calcBladeForces();
     this->swapDeviceArrays();
 
-    if(useHostArrays) cudaMemoryManager->cudaCopyBladeForcesHtoD(this);
+    if (useHostArrays) cudaMemoryManager->cudaCopyBladeForcesHtoD(this);
 
     vf::cuda::CudaGrid sphereGrid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, this->numberOfIndices);
 
     applyBodyForces<<<sphereGrid.grid, sphereGrid.threads, 0, stream>>>(
-        para->getParD(this->level)->coordinateX, para->getParD(this->level)->coordinateY, para->getParD(this->level)->coordinateZ,        
-        para->getParD(this->level)->forceX_SP, para->getParD(this->level)->forceY_SP, para->getParD(this->level)->forceZ_SP,        
-        this->bladeCoordsXDCurrentTimestep, this->bladeCoordsYDCurrentTimestep, this->bladeCoordsZDCurrentTimestep,  
+        para->getParD(this->level)->coordinateX, para->getParD(this->level)->coordinateY, para->getParD(this->level)->coordinateZ,
+        para->getParD(this->level)->forceX_SP, para->getParD(this->level)->forceY_SP, para->getParD(this->level)->forceZ_SP,
+        this->bladeCoordsXDCurrentTimestep, this->bladeCoordsYDCurrentTimestep, this->bladeCoordsZDCurrentTimestep,
         this->bladeForcesXDCurrentTimestep, this->bladeForcesYDCurrentTimestep, this->bladeForcesZDCurrentTimestep,
         this->numberOfTurbines, this->numberOfBlades, this->numberOfBladeNodes,
         this->azimuthsD, this->yawsD, this->diametersD,
@@ -357,8 +343,7 @@ void ActuatorFarm::interact(Parameter* para, CudaMemoryManager* cudaMemoryManage
     cudaStreamSynchronize(stream);
 }
 
-
-void ActuatorFarm::free(Parameter* para, CudaMemoryManager* cudaMemoryManager)
+void ActuatorFarm::free(Parameter *para, CudaMemoryManager *cudaMemoryManager)
 {
     cudaMemoryManager->cudaFreeBladeGeometries(this);
     cudaMemoryManager->cudaFreeBladeOrientations(this);
@@ -369,43 +354,42 @@ void ActuatorFarm::free(Parameter* para, CudaMemoryManager* cudaMemoryManager)
     cudaMemoryManager->cudaFreeSphereIndices(this);
 }
 
-
 void ActuatorFarm::calcForcesEllipticWing()
 {
     real u_rel, v_rel, u_rel_sq;
     real phi;
     real Cl = c1o1;
     real Cd = c0o1;
-    real c0 = 20*c1o10;
+    real c0 = 20 * c1o10;
     real c, Cn, Ct;
 
-    for(uint turbine=0; turbine<this->numberOfTurbines; turbine++)
+    for (uint turbine = 0; turbine < this->numberOfTurbines; turbine++)
     {
         real diameter = this->diametersH[turbine];
-        for( uint blade=0; blade<this->numberOfBlades; blade++)
-        { 
-            for( uint bladeNode=0; bladeNode<this->numberOfBladeNodes; bladeNode++)
-            {        
-                uint node = calcNode(bladeNode, this->numberOfBladeNodes, blade, this->numberOfBlades, turbine, this->numberOfTurbines);
+        for (uint blade = 0; blade < this->numberOfBlades; blade++)
+        {
+            for (uint bladeNode = 0; bladeNode < this->numberOfBladeNodes; bladeNode++)
+            {
+                uint node = calcNodeIndexInBladeArrays({ /*.turbine = */ turbine, /* .blade = */ blade, /*.bladeNode =*/bladeNode }, this->numberOfBladeNodes, this->numberOfBlades);
 
                 u_rel = this->bladeVelocitiesXH[node];
                 v_rel = this->bladeVelocitiesYH[node];
-                u_rel_sq = u_rel*u_rel+v_rel*v_rel;
+                u_rel_sq = u_rel * u_rel + v_rel * v_rel;
                 phi = atan2(u_rel, v_rel);
-                
-                real tmp = c4o1*this->bladeRadiiH[bladeNode]/diameter-c1o1;
-                c = c0 * sqrt( c1o1- tmp*tmp );
-                Cn = Cl*cos(phi)+Cd*sin(phi);
-                Ct = Cl*sin(phi)-Cd*cos(phi);
-                real fx = c1o2*u_rel_sq*c*this->density*Cn;
-                real fy = c1o2*u_rel_sq*c*this->density*Ct;
+
+                real tmp = c4o1 * this->bladeRadiiH[bladeNode] / diameter - c1o1;
+                c = c0 * sqrt(c1o1 - tmp * tmp);
+                Cn = Cl * cos(phi) + Cd * sin(phi);
+                Ct = Cl * sin(phi) - Cd * cos(phi);
+                real fx = c1o2 * u_rel_sq * c * this->density * Cn;
+                real fy = c1o2 * u_rel_sq * c * this->density * Ct;
                 this->bladeForcesXH[node] = -fx;
                 this->bladeForcesYH[node] = -fy;
                 this->bladeForcesZH[node] = c0o1;
                 // printf("u %f v %f fx %f fy %f \n", u_rel, v_rel, fx, fy);
             }
         }
-        azimuthsH[turbine] = azimuthsH[turbine]+deltaT*omegasH[turbine];
+        azimuthsH[turbine] = azimuthsH[turbine] + deltaT * omegasH[turbine];
     }
 }
 
@@ -414,28 +398,24 @@ void ActuatorFarm::calcBladeForces()
     this->calcForcesEllipticWing();
 }
 
-void ActuatorFarm::getTaggedFluidNodes(Parameter *para, GridProvider* gridProvider)
+void ActuatorFarm::getTaggedFluidNodes(Parameter *para, GridProvider *gridProvider)
 {
-    std::vector<uint> indicesInSphere(this->boundingSphereIndicesH, this->boundingSphereIndicesH+this->numberOfIndices);
+    std::vector<uint> indicesInSphere(this->boundingSphereIndicesH, this->boundingSphereIndicesH + this->numberOfIndices);
     gridProvider->tagFluidNodeIndices(indicesInSphere, CollisionTemplate::AllFeatures, this->level);
-}   
-
+}
 
-void ActuatorFarm::initTurbineGeometries(CudaMemoryManager* cudaMemoryManager)
+void ActuatorFarm::initTurbineGeometries(CudaMemoryManager *cudaMemoryManager)
 {
     this->numberOfTurbines = uint(this->preInitDiameters.size());
-    this->numberOfGridNodes = numberOfTurbines*numberOfBladeNodes*numberOfBlades;
+    this->numberOfGridNodes = numberOfTurbines * numberOfBladeNodes * numberOfBlades;
 
     cudaMemoryManager->cudaAllocBladeGeometries(this);
     cudaMemoryManager->cudaAllocBladeOrientations(this);
 
-    for(uint turbine=0; turbine<this->numberOfTurbines; turbine++)
-    {
-        for(uint node=0; node<this->numberOfBladeNodes; node++)
-        {
-            this->bladeRadiiH[calcNode(node, numberOfBladeNodes, 0, 1, turbine, numberOfTurbines)] = this->preInitBladeRadii[turbine][node];
+    for (uint turbine = 0; turbine < this->numberOfTurbines; turbine++) {
+        for (uint node = 0; node < this->numberOfBladeNodes; node++) {
+            this->bladeRadiiH[calcNodeIndexInBladeArrays({ /*.turbine = */ turbine, /* .blade = */ 0, /*.bladeNode =*/node }, numberOfBladeNodes, 1)] = this->preInitBladeRadii[turbine][node];
         }
-
     }
     std::copy(preInitPosX.begin(), preInitPosX.end(), turbinePosXH);
     std::copy(preInitPosY.begin(), preInitPosY.end(), turbinePosYH);
@@ -448,24 +428,23 @@ void ActuatorFarm::initTurbineGeometries(CudaMemoryManager* cudaMemoryManager)
     std::copy(preInitYaws.begin(), preInitYaws.end(), this->yawsH);
 
     cudaMemoryManager->cudaCopyBladeOrientationsHtoD(this);
-    this->factorGaussian = pow(this->epsilon*sqrt(cPi),-c3o1)/this->forceRatio;
+    this->factorGaussian = pow(this->epsilon * sqrt(cPi), -c3o1) / this->forceRatio;
 }
 
-void ActuatorFarm::initBladeCoords(CudaMemoryManager* cudaMemoryManager)
-{   
+void ActuatorFarm::initBladeCoords(CudaMemoryManager *cudaMemoryManager)
+{
     cudaMemoryManager->cudaAllocBladeCoords(this);
 
-    for(uint turbine=0; turbine<numberOfTurbines; turbine++)
+    for (uint turbine = 0; turbine < numberOfTurbines; turbine++)
     {
-        for(uint blade=0; blade<this->numberOfBlades; blade++)
+        for (uint blade = 0; blade < this->numberOfBlades; blade++)
         {
-            for(uint bladeNode=0; bladeNode<this->numberOfBladeNodes; bladeNode++)
-            {
-                uint node = calcNode(bladeNode, this->numberOfBladeNodes, blade, this->numberOfBlades, turbine, this->numberOfTurbines);
+            for (uint bladeNode = 0; bladeNode < this->numberOfBladeNodes; bladeNode++) {
+                uint node = calcNodeIndexInBladeArrays({ /*.turbine = */ turbine, /* .blade = */ blade, /*.bladeNode =*/bladeNode }, this->numberOfBladeNodes, this->numberOfBlades);
 
                 this->bladeCoordsXH[node] = c0o1;
                 this->bladeCoordsYH[node] = c0o1;
-                this->bladeCoordsZH[node] = this->bladeRadiiH[calcNode(bladeNode, numberOfBladeNodes, 0, 1, turbine, numberOfTurbines)];
+                this->bladeCoordsZH[node] = this->bladeRadiiH[calcNodeIndexInBladeArrays({ /*.turbine = */ turbine, /* .blade = */ 0, /*.bladeNode =*/bladeNode }, numberOfBladeNodes, 1)];
             }
         }
     }
@@ -476,8 +455,8 @@ void ActuatorFarm::initBladeCoords(CudaMemoryManager* cudaMemoryManager)
     cudaMemoryManager->cudaCopyBladeCoordsHtoD(this);
 }
 
-void ActuatorFarm::initBladeVelocities(CudaMemoryManager* cudaMemoryManager)
-{   
+void ActuatorFarm::initBladeVelocities(CudaMemoryManager *cudaMemoryManager)
+{
     cudaMemoryManager->cudaAllocBladeVelocities(this);
 
     std::fill_n(this->bladeVelocitiesXH, this->numberOfGridNodes, c0o1);
@@ -491,8 +470,8 @@ void ActuatorFarm::initBladeVelocities(CudaMemoryManager* cudaMemoryManager)
     cudaMemoryManager->cudaCopyBladeVelocitiesHtoD(this);
 }
 
-void ActuatorFarm::initBladeForces(CudaMemoryManager* cudaMemoryManager)
-{   
+void ActuatorFarm::initBladeForces(CudaMemoryManager *cudaMemoryManager)
+{
     cudaMemoryManager->cudaAllocBladeForces(this);
 
     std::fill_n(this->bladeForcesXH, this->numberOfGridNodes, c0o1);
@@ -506,8 +485,8 @@ void ActuatorFarm::initBladeForces(CudaMemoryManager* cudaMemoryManager)
     cudaMemoryManager->cudaCopyBladeForcesHtoD(this);
 }
 
-void ActuatorFarm::initBladeIndices(Parameter* para, CudaMemoryManager* cudaMemoryManager)
-{   
+void ActuatorFarm::initBladeIndices(Parameter *para, CudaMemoryManager *cudaMemoryManager)
+{
     cudaMemoryManager->cudaAllocBladeIndices(this);
 
     std::fill_n(this->bladeIndicesH, this->numberOfGridNodes, 1);
@@ -515,37 +494,34 @@ void ActuatorFarm::initBladeIndices(Parameter* para, CudaMemoryManager* cudaMemo
     cudaMemoryManager->cudaCopyBladeIndicesHtoD(this);
 }
 
-void ActuatorFarm::initBoundingSpheres(Parameter* para, CudaMemoryManager* cudaMemoryManager)
+void ActuatorFarm::initBoundingSpheres(Parameter *para, CudaMemoryManager *cudaMemoryManager)
 {
     std::vector<int> nodesInSpheres;
 
-    for(uint turbine=0; turbine<this->numberOfTurbines; turbine++)
-    {
-        real sphereRadius = c1o2*this->diametersH[turbine]+c4o1*this->epsilon;
+    for (uint turbine = 0; turbine < this->numberOfTurbines; turbine++) {
+        real sphereRadius = c1o2 * this->diametersH[turbine] + c4o1 * this->epsilon;
 
         real posX = this->turbinePosXH[turbine];
         real posY = this->turbinePosYH[turbine];
         real posZ = this->turbinePosZH[turbine];
 
-        real sphereRadiusSqrd = sphereRadius*sphereRadius;
-            
-        uint minimumNumberOfNodesPerSphere = (uint)(c4o3*cPi*pow(sphereRadius-this->deltaX, c3o1)/pow(this->deltaX, c3o1));
+        real sphereRadiusSqrd = sphereRadius * sphereRadius;
+
+        uint minimumNumberOfNodesPerSphere =
+            (uint)(c4o3 * cPi * pow(sphereRadius - this->deltaX, c3o1) / pow(this->deltaX, c3o1));
         uint nodesInThisSphere = 0;
 
-        for (size_t pos = 1; pos <= para->getParH(this->level)->numberOfNodes; pos++)
-        {
-            const real distX = para->getParH(this->level)->coordinateX[pos]-posX;
-            const real distY = para->getParH(this->level)->coordinateY[pos]-posY;
-            const real distZ = para->getParH(this->level)->coordinateZ[pos]-posZ;
-            if(distSqrd(distX,distY,distZ) < sphereRadiusSqrd) 
-            {
+        for (size_t pos = 1; pos <= para->getParH(this->level)->numberOfNodes; pos++) {
+            const real distX = para->getParH(this->level)->coordinateX[pos] - posX;
+            const real distY = para->getParH(this->level)->coordinateY[pos] - posY;
+            const real distZ = para->getParH(this->level)->coordinateZ[pos] - posZ;
+            if (distSqrd(distX, distY, distZ) < sphereRadiusSqrd) {
                 nodesInSpheres.push_back((int)pos);
                 nodesInThisSphere++;
             }
         }
 
-        if(nodesInThisSphere<minimumNumberOfNodesPerSphere)
-        {
+        if (nodesInThisSphere < minimumNumberOfNodesPerSphere) {
             VF_LOG_CRITICAL("Found only {} nodes in bounding sphere of turbine no. {}, expected at least {}!", nodesInThisSphere, turbine, minimumNumberOfNodesPerSphere);
             throw std::runtime_error("ActuatorFarm::initBoundingSpheres: Turbine bounding sphere partially out of domain.");
         }
@@ -558,60 +534,60 @@ void ActuatorFarm::initBoundingSpheres(Parameter* para, CudaMemoryManager* cudaM
     cudaMemoryManager->cudaCopySphereIndicesHtoD(this);
 }
 
-void ActuatorFarm::setAllAzimuths(real* _azimuths)
-{ 
+void ActuatorFarm::setAllAzimuths(real *_azimuths)
+{
     std::copy_n(_azimuths, this->numberOfTurbines, this->azimuthsH);
 }
 
-void ActuatorFarm::setAllOmegas(real* _omegas)
-{ 
+void ActuatorFarm::setAllOmegas(real *_omegas)
+{
     std::copy_n(_omegas, this->numberOfTurbines, this->omegasH);
 }
 
-void ActuatorFarm::setAllYaws(real* _yaws)
-{ 
+void ActuatorFarm::setAllYaws(real *_yaws)
+{
     std::copy_n(_yaws, this->numberOfTurbines, this->yawsH);
 }
 
-void ActuatorFarm::setAllBladeCoords(real* _bladeCoordsX, real* _bladeCoordsY, real* _bladeCoordsZ)
-{ 
+void ActuatorFarm::setAllBladeCoords(real *_bladeCoordsX, real *_bladeCoordsY, real *_bladeCoordsZ)
+{
     std::copy_n(_bladeCoordsX, this->numberOfGridNodes, this->bladeCoordsXH);
     std::copy_n(_bladeCoordsY, this->numberOfGridNodes, this->bladeCoordsYH);
     std::copy_n(_bladeCoordsZ, this->numberOfGridNodes, this->bladeCoordsZH);
 }
 
-void ActuatorFarm::setAllBladeVelocities(real* _bladeVelocitiesX, real* _bladeVelocitiesY, real* _bladeVelocitiesZ)
-{ 
+void ActuatorFarm::setAllBladeVelocities(real *_bladeVelocitiesX, real *_bladeVelocitiesY, real *_bladeVelocitiesZ)
+{
     std::copy_n(_bladeVelocitiesX, this->numberOfGridNodes, this->bladeVelocitiesXH);
     std::copy_n(_bladeVelocitiesY, this->numberOfGridNodes, this->bladeVelocitiesYH);
     std::copy_n(_bladeVelocitiesZ, this->numberOfGridNodes, this->bladeVelocitiesZH);
 }
 
-void ActuatorFarm::setAllBladeForces(real* _bladeForcesX, real* _bladeForcesY, real* _bladeForcesZ)
-{ 
+void ActuatorFarm::setAllBladeForces(real *_bladeForcesX, real *_bladeForcesY, real *_bladeForcesZ)
+{
     std::copy_n(_bladeForcesX, this->numberOfGridNodes, this->bladeForcesXH);
     std::copy_n(_bladeForcesY, this->numberOfGridNodes, this->bladeForcesYH);
     std::copy_n(_bladeForcesZ, this->numberOfGridNodes, this->bladeForcesZH);
-
-}void ActuatorFarm::setTurbineBladeCoords(uint turbine, real* _bladeCoordsX, real* _bladeCoordsY, real* _bladeCoordsZ)
-{ 
-    std::copy_n(_bladeCoordsX, numberOfBladeNodes*numberOfBlades, &this->bladeCoordsXH[turbine*numberOfBladeNodes*numberOfBlades]);
-    std::copy_n(_bladeCoordsY, numberOfBladeNodes*numberOfBlades, &this->bladeCoordsYH[turbine*numberOfBladeNodes*numberOfBlades]);
-    std::copy_n(_bladeCoordsZ, numberOfBladeNodes*numberOfBlades, &this->bladeCoordsZH[turbine*numberOfBladeNodes*numberOfBlades]);
+}
+void ActuatorFarm::setTurbineBladeCoords(uint turbine, real *_bladeCoordsX, real *_bladeCoordsY, real *_bladeCoordsZ)
+{
+    std::copy_n(_bladeCoordsX, numberOfBladeNodes * numberOfBlades, &this->bladeCoordsXH[turbine * numberOfBladeNodes * numberOfBlades]);
+    std::copy_n(_bladeCoordsY, numberOfBladeNodes * numberOfBlades, &this->bladeCoordsYH[turbine * numberOfBladeNodes * numberOfBlades]);
+    std::copy_n(_bladeCoordsZ, numberOfBladeNodes * numberOfBlades, &this->bladeCoordsZH[turbine * numberOfBladeNodes * numberOfBlades]);
 }
 
-void ActuatorFarm::setTurbineBladeVelocities(uint turbine, real* _bladeVelocitiesX, real* _bladeVelocitiesY, real* _bladeVelocitiesZ)
-{ 
-    std::copy_n(_bladeVelocitiesX, numberOfBladeNodes*numberOfBlades, &this->bladeVelocitiesXH[turbine*numberOfBladeNodes*numberOfBlades]);
-    std::copy_n(_bladeVelocitiesY, numberOfBladeNodes*numberOfBlades, &this->bladeVelocitiesYH[turbine*numberOfBladeNodes*numberOfBlades]);
-    std::copy_n(_bladeVelocitiesZ, numberOfBladeNodes*numberOfBlades, &this->bladeVelocitiesZH[turbine*numberOfBladeNodes*numberOfBlades]);
+void ActuatorFarm::setTurbineBladeVelocities(uint turbine, real *_bladeVelocitiesX, real *_bladeVelocitiesY, real *_bladeVelocitiesZ)
+{
+    std::copy_n(_bladeVelocitiesX, numberOfBladeNodes * numberOfBlades, &this->bladeVelocitiesXH[turbine * numberOfBladeNodes * numberOfBlades]);
+    std::copy_n(_bladeVelocitiesY, numberOfBladeNodes * numberOfBlades, &this->bladeVelocitiesYH[turbine * numberOfBladeNodes * numberOfBlades]);
+    std::copy_n(_bladeVelocitiesZ, numberOfBladeNodes * numberOfBlades, &this->bladeVelocitiesZH[turbine * numberOfBladeNodes * numberOfBlades]);
 }
 
-void ActuatorFarm::setTurbineBladeForces(uint turbine, real* _bladeForcesX, real* _bladeForcesY, real* _bladeForcesZ)
-{ 
-    std::copy_n(_bladeForcesX, numberOfBladeNodes*numberOfBlades, &this->bladeForcesXH[turbine*numberOfBladeNodes*numberOfBlades]);
-    std::copy_n(_bladeForcesY, numberOfBladeNodes*numberOfBlades, &this->bladeForcesYH[turbine*numberOfBladeNodes*numberOfBlades]);
-    std::copy_n(_bladeForcesZ, numberOfBladeNodes*numberOfBlades, &this->bladeForcesZH[turbine*numberOfBladeNodes*numberOfBlades]);
+void ActuatorFarm::setTurbineBladeForces(uint turbine, real *_bladeForcesX, real *_bladeForcesY, real *_bladeForcesZ)
+{
+    std::copy_n(_bladeForcesX, numberOfBladeNodes * numberOfBlades, &this->bladeForcesXH[turbine * numberOfBladeNodes * numberOfBlades]);
+    std::copy_n(_bladeForcesY, numberOfBladeNodes * numberOfBlades, &this->bladeForcesYH[turbine * numberOfBladeNodes * numberOfBlades]);
+    std::copy_n(_bladeForcesZ, numberOfBladeNodes * numberOfBlades, &this->bladeForcesZH[turbine * numberOfBladeNodes * numberOfBlades]);
 }
 
 void ActuatorFarm::swapDeviceArrays()
@@ -627,4 +603,27 @@ void ActuatorFarm::swapDeviceArrays()
     swapArrays(this->bladeForcesXDPreviousTimestep, this->bladeForcesXDCurrentTimestep);
     swapArrays(this->bladeForcesYDPreviousTimestep, this->bladeForcesYDCurrentTimestep);
     swapArrays(this->bladeForcesZDPreviousTimestep, this->bladeForcesZDCurrentTimestep);
+}
+
+void ActuatorFarm::writeBladeCoordsToVtkForDebug(const std::string &filename)
+{
+    std::vector<real> coordsX(numberOfGridNodes);
+    std::vector<real> coordsY(numberOfGridNodes);
+    std::vector<real> coordsZ(numberOfGridNodes);
+
+    for (uint nodeIndex = 0; nodeIndex < numberOfGridNodes; nodeIndex++) {
+        auto [turbine, blade, bladeNodeIndexOnBlade] = calcTurbineBladeAndBladeNode(nodeIndex, numberOfBladeNodes, numberOfBlades);
+
+        const real localAzimuth = this->getTurbineAzimuth(turbine) + blade * c2Pi / numberOfBlades;
+        const real yaw = this->getTurbineYaw(turbine);
+        real bladeCoordX_GF;
+        real bladeCoordY_GF;
+        real bladeCoordZ_GF;
+        calcCoordinateOfBladeNodeInGridFrameOfReference(nodeIndex, turbine, localAzimuth, yaw, this->bladeCoordsXH, this->bladeCoordsYH, this->bladeCoordsZH, this->turbinePosXH, this->turbinePosYH, this->turbinePosZH, bladeCoordX_GF, bladeCoordY_GF, bladeCoordZ_GF);
+        coordsX[nodeIndex] = bladeCoordX_GF;
+        coordsY[nodeIndex] = bladeCoordY_GF;
+        coordsZ[nodeIndex] = bladeCoordZ_GF;
+    }
+
+    WbWriterVtkXmlBinary::getInstance()->writePolyLines(filename, coordsX, coordsY, coordsZ);
 }
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h
index 67bf83691d19179984647cb808bb6c0592bb0bfb..c71bb9407e686ce14a957d120f233958359f243d 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h
@@ -154,6 +154,7 @@ private:
     void rotateBlades(real angle, uint turbineID);
 
     void writeBladeCoords(uint t);
+    void writeBladeCoordsToVtkForDebug(const std::string& filename);
     void writeBladeForces(uint t);
     void writeBladeVelocities(uint t);
 
diff --git a/pythonbindings/src/VirtualFluids.cpp b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarmInlines.h
similarity index 51%
rename from pythonbindings/src/VirtualFluids.cpp
rename to src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarmInlines.h
index 91682b79e8125a7513565b28e2e22e74e0b2dac1..cc151088db963f00d3d39af705c80d22337701c9 100644
--- a/pythonbindings/src/VirtualFluids.cpp
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarmInlines.h
@@ -26,39 +26,49 @@
 //  You should have received a copy of the GNU General Public License along
 //  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
-//! \file VirtualFluids.cpp
-//! \ingroup src
-//! \author Henry Korb
-//=======================================================================================
-#include <pybind11/pybind11.h>
-#include "basics/basics.cpp"
-#include "lbm/lbm.cpp"
-#include "logger/logger.cpp"
+//! \file ActuatorFarm.cu
+//! \ingroup PreCollisionInteractor
+//! \author Henrik Asmuth, Henry Korb, Anna Wellmann
+//======================================================================================
 
-#ifdef VF_GPU_PYTHONBINDINGS
-#include "gpu/gpu.cpp"
-#endif
-#ifdef VF_CPU_PYTHONBINDINGS
-#include "cpu/cpu.cpp"
-#endif
+#ifndef ACTUATOR_FARM_INLINES
+#define ACTUATOR_FARM_INLINES
+
+#include "basics/DataTypes.h"
 
+struct TurbineNodeIndex {
+    uint turbine;
+    uint blade;
+    uint bladeNode;
+};
 
-namespace py_bindings
+__host__ __device__ __inline__ uint calcNodeIndexInBladeArrays(uint bladeNode, uint numberOfNodesPerBlade, uint blade, uint numberOfBlades, uint turbine)
 {
-    namespace py = pybind11;
+    // see https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/merge_requests/248 for visualization
+    return bladeNode + numberOfNodesPerBlade * (blade + numberOfBlades * turbine);
+}
 
-    PYBIND11_MODULE(bindings, m)
-    {
-        // because we do not use the old logger (src/basics/logger) anymore and cout is not passed anymore to the old logger, we probably do not need this anymore
-        // pybind11::add_ostream_redirect(m, "ostream_redirect");
-        basics::makeModule(m);
-        lbm::makeModule(m);
-        logging::makeModule(m);
-#ifdef VF_GPU_PYTHONBINDINGS
-        gpu::makeModule(m);
-#endif
-#ifdef VF_CPU_PYTHONBINDINGS
-        cpu::makeModule(m);
-#endif
-    }
+__host__ __device__ __inline__ uint calcNodeIndexInBladeArrays(const TurbineNodeIndex &turbineNodeIndex, uint numberOfNodesPerBlade, uint numberOfBlades)
+{
+    return calcNodeIndexInBladeArrays(turbineNodeIndex.bladeNode, numberOfNodesPerBlade, turbineNodeIndex.blade, numberOfBlades, turbineNodeIndex.turbine);
 }
+
+__host__ __device__ __inline__ void calcTurbineBladeAndBladeNode(uint node, uint &bladeNode, uint numberOfNodesPerBlade, uint &blade, uint numberOfBlades, uint &turbine)
+{
+    // see https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/merge_requests/248 for visualization
+    turbine = node / (numberOfNodesPerBlade * numberOfBlades);
+    uint x_off = turbine * numberOfNodesPerBlade * numberOfBlades;
+    blade = (node - x_off) / numberOfNodesPerBlade;
+    uint y_off = numberOfNodesPerBlade * blade + x_off;
+    bladeNode = node - y_off;
+}
+__host__ __device__ __inline__ TurbineNodeIndex calcTurbineBladeAndBladeNode(uint node, uint numberOfNodesPerBlade, uint numberOfBlades)
+{
+    uint turbine;
+    uint blade;
+    uint bladeNode;
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    return { /*.turbine = */ turbine, /*.blade = */ blade, /*.bladeNode = */ bladeNode }; // Designated initializers are a C++ 20 feature
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarmInlinesTest.cpp b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarmInlinesTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..64ede907f8c60263e042b483ce9c18e94f4e5f6c
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarmInlinesTest.cpp
@@ -0,0 +1,135 @@
+#include <gmock/gmock.h>
+
+#include "ActuatorFarmInlines.h"
+
+TEST(ActuatorFarmInlinesTest, calcNodeIndexInBladeArrays)
+{
+    const uint numberOfNodesPerBlade = 4;
+    const uint numberOfBlades = 3;
+
+    // first node on first blade
+    uint bladeNode = 0;
+    uint blade = 0;
+    uint turbine = 0;
+    auto nodeIndexInBladeArrays = calcNodeIndexInBladeArrays(bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(0));
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays({turbine, blade, bladeNode}, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(0));
+
+    // last node on first blade
+    bladeNode = 3;
+    blade = 0;
+    turbine = 0;
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays(bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(3));
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays({turbine, blade, bladeNode}, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(3));
+
+    // first node on third blade
+    bladeNode = 0;
+    blade = 2;
+    turbine = 0;
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays(bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(8));
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays({turbine, blade, bladeNode}, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(8));
+
+    // last node on third blade, also last node on first turbine
+    bladeNode = 3;
+    blade = 2;
+    turbine = 0;
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays(bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(11));
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays({turbine, blade, bladeNode}, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(11));
+
+    // first node on second turbine
+    bladeNode = 0;
+    blade = 0;
+    turbine = 1;
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays(bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(12));
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays({turbine, blade, bladeNode}, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(12));
+
+    // last node on second turbine
+    bladeNode = 3;
+    blade = 2;
+    turbine = 1;
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays(bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(23));
+    nodeIndexInBladeArrays = calcNodeIndexInBladeArrays({turbine, blade, bladeNode}, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(nodeIndexInBladeArrays, testing::Eq(23));
+}
+
+TEST(ActuatorFarmInlinesTest, calcTurbineBladeAndBladeNode)
+{
+    const uint numberOfNodesPerBlade = 4;
+    const uint numberOfBlades = 3;
+
+    uint bladeNode;
+    uint blade;
+    uint turbine;
+
+    TurbineNodeIndex result;
+
+    uint node = 0; // first node on first blade
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(bladeNode, testing::Eq(0));
+    EXPECT_THAT(blade, testing::Eq(0));
+    EXPECT_THAT(turbine, testing::Eq(0));
+    result = calcTurbineBladeAndBladeNode(node, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(result.bladeNode, testing::Eq(0));
+    EXPECT_THAT(result.blade, testing::Eq(0));
+    EXPECT_THAT(result.turbine, testing::Eq(0));
+
+    node = 3; // last node on first blade
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(bladeNode, testing::Eq(3));
+    EXPECT_THAT(blade, testing::Eq(0));
+    EXPECT_THAT(turbine, testing::Eq(0));
+    result = calcTurbineBladeAndBladeNode(node, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(result.bladeNode, testing::Eq(3));
+    EXPECT_THAT(result.blade, testing::Eq(0));
+    EXPECT_THAT(result.turbine, testing::Eq(0));
+
+    node = 8; // first node on third blade
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(bladeNode, testing::Eq(0));
+    EXPECT_THAT(blade, testing::Eq(2));
+    EXPECT_THAT(turbine, testing::Eq(0));
+    result = calcTurbineBladeAndBladeNode(node, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(result.bladeNode, testing::Eq(0));
+    EXPECT_THAT(result.blade, testing::Eq(2));
+    EXPECT_THAT(result.turbine, testing::Eq(0));
+
+    node = 11; // last node on third blade, also last node on first turbine
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(bladeNode, testing::Eq(3));
+    EXPECT_THAT(blade, testing::Eq(2));
+    EXPECT_THAT(turbine, testing::Eq(0));
+    result = calcTurbineBladeAndBladeNode(node, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(result.bladeNode, testing::Eq(3));
+    EXPECT_THAT(result.blade, testing::Eq(2));
+    EXPECT_THAT(result.turbine, testing::Eq(0));
+
+    node = 12; // first node on second turbine
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(bladeNode, testing::Eq(0));
+    EXPECT_THAT(blade, testing::Eq(0));
+    EXPECT_THAT(turbine, testing::Eq(1));
+    result = calcTurbineBladeAndBladeNode(node, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(result.bladeNode, testing::Eq(0));
+    EXPECT_THAT(result.blade, testing::Eq(0));
+    EXPECT_THAT(result.turbine, testing::Eq(1));
+
+    node = 23; // last node on second turbine
+    calcTurbineBladeAndBladeNode(node, bladeNode, numberOfNodesPerBlade, blade, numberOfBlades, turbine);
+    EXPECT_THAT(bladeNode, testing::Eq(3));
+    EXPECT_THAT(blade, testing::Eq(2));
+    EXPECT_THAT(turbine, testing::Eq(1));
+    result = calcTurbineBladeAndBladeNode(node, numberOfNodesPerBlade, numberOfBlades);
+    EXPECT_THAT(result.bladeNode, testing::Eq(3));
+    EXPECT_THAT(result.blade, testing::Eq(2));
+    EXPECT_THAT(result.turbine, testing::Eq(1));
+}
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu
index b1ebaf28edc7966074f7cc96e31bf8489ca8e4a9..ca1ed594829682ad94b98a59349e082bf3b315a4 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu
@@ -36,7 +36,7 @@
 #include <cuda.h>
 #include <cuda_runtime.h>
 #include <helper_cuda.h>
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 #include "LBM/GPUHelperFunctions/KernelUtilities.h"
 
 #include "StringUtilities/StringUtil.h"
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu
index 705b7173606d1956c50c59d5cc1f7635a4b7883b..43be448998b5fe73ccc1444450f55acdceab9232 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu
@@ -1,7 +1,7 @@
 #include "Probe.h"
 #include "PlanarAverageProbe.h"
 
-#include <cuda/CudaGrid.h>
+#include <cuda_helper/CudaGrid.h>
 
 #include <cuda.h>
 #include <cuda_runtime.h>
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu
index 19f7f6c62ae7ac83c90fc2a7aff0e286a70063d1..a0f15cc340b99bcb5a837b3afbc4840511644a3f 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu
@@ -1,7 +1,7 @@
 #include "Probe.h"
 #include "PlaneProbe.h"
 
-#include <cuda/CudaGrid.h>
+#include <cuda_helper/CudaGrid.h>
 
 #include <cuda.h>
 #include <cuda_runtime.h>
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu
index 19c170608a606227d21c25791776bd3195b16e04..bedcc513a1e441b8d5927f5afafa79f13af2cdbc 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu
@@ -5,7 +5,7 @@
 #include <cuda_runtime.h>
 #include <helper_cuda.h>
 
-#include <cuda/CudaGrid.h>
+#include <cuda_helper/CudaGrid.h>
 
 #include "Parameter/Parameter.h"
 #include "DataStructureInitializer/GridProvider.h"
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h
index c7391e2a3d6b858facfd4fba094d7942f2bf4505..c4ec985beb2b5aa4313ac0a92866a75351f630fa 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h
@@ -33,7 +33,7 @@
 //!
 //! Any probe should be initiated in the app and added via para->addProbe( someProbe )
 //! Note, that all probes generally require that macroscopic variables have been updated in the 
-//! time step they are called in. Most collision kernels (atm, all except TurbulentViscosityCumulantK17CompChim )
+//! time step they are called in. Most collision kernels (atm, all except K17CompressibleNavierStokes)
 //! don't do this and would require an explicit call of calcMacroscopicQuantities. It does seem quite 
 //! inexpensive though to simply save vx, vy, etc., directly in the collider.
 //!
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
index f52c666c920a049012888e8e1b71578e68d3da31..6b263342e899c53917d71aa190eef08f1451fa49 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
@@ -1,7 +1,7 @@
 #include "Probe.h"
 #include "WallModelProbe.h"
 
-#include <cuda/CudaGrid.h>
+#include <cuda_helper/CudaGrid.h>
 
 #include <cuda.h>
 #include <cuda_runtime.h>
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu
index 1e70fc642a3fd7f6fca4ed90b9ff4ebc1bb437db..32c02ce8f2ab9a67ba3cbc09ae909d27cf4c9223 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu
@@ -2,7 +2,7 @@
 
 #include "InitCompAD27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<PreProcessorStrategy> InitCompAD27::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu
index f8fc6af00d93cc5a51da4a69d67b69b616f97140..3b70cc80827b2e5f5081a7bcfca6b83789284a05 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu
@@ -2,7 +2,7 @@
 
 #include "InitCompAD7_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<InitCompAD7> InitCompAD7::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu
index c4676f28f969e2db8ff7f1910ac784a1c0dab351..3f2176eace98b825a2dcb8557506787563286434 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu
@@ -2,7 +2,7 @@
 
 #include "InitCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<PreProcessorStrategy> InitCompSP27::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu
index 14d6b725337aa8b9af279bf794ff1c0912516b64..cac748bcea4cf3a9067552f87142e6a019c84d90 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu
@@ -2,7 +2,7 @@
 
 #include "InitF3_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<PreProcessorStrategy> InitF3::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu
index 6a9b4cb31b1032f6921bddbe60d3cd570ef46b6d..246a5884f51af97b4e32977d30f114d6e90a6959 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu
@@ -2,7 +2,7 @@
 
 #include "InitIncompAD27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<PreProcessorStrategy> InitIncompAD27::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu
index b7c7d46a9ea8e3133b8240e27959b6b4d2ed0cf5..d246d58a279e6edd79de98a911c293d627bba4c3 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu
@@ -2,7 +2,7 @@
 
 #include "InitIncompAD7_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<PreProcessorStrategy> InitIncompAD7::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu
index 078ad24f24659bf10a3dc9ed90bfd62b5e021187..8e0702bc9bd6486edff43212098e5df223842a2a 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu
@@ -2,7 +2,7 @@
 
 #include "InitSP27_Device.cuh"
 #include "Parameter/Parameter.h"
-#include "cuda/CudaGrid.h"
+#include <cuda_helper/CudaGrid.h>
 
 std::shared_ptr<PreProcessorStrategy> InitSP27::getNewInstance(std::shared_ptr<Parameter> para)
 {
diff --git a/src/gpu/cuda_helper/CMakeLists.txt b/src/gpu/cuda_helper/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..314ba43431a31643ff9df63018b9194d92a99d6d
--- /dev/null
+++ b/src/gpu/cuda_helper/CMakeLists.txt
@@ -0,0 +1,3 @@
+project(cuda LANGUAGES CUDA CXX)
+
+vf_add_library(PUBLIC_LINK logger)
diff --git a/src/cuda/CudaGrid.cpp b/src/gpu/cuda_helper/CudaGrid.cpp
similarity index 100%
rename from src/cuda/CudaGrid.cpp
rename to src/gpu/cuda_helper/CudaGrid.cpp
diff --git a/src/cuda/CudaGrid.h b/src/gpu/cuda_helper/CudaGrid.h
similarity index 100%
rename from src/cuda/CudaGrid.h
rename to src/gpu/cuda_helper/CudaGrid.h
diff --git a/src/cuda/CudaTimer.cpp b/src/gpu/cuda_helper/CudaTimer.cpp
similarity index 100%
rename from src/cuda/CudaTimer.cpp
rename to src/gpu/cuda_helper/CudaTimer.cpp
diff --git a/src/cuda/CudaTimer.h b/src/gpu/cuda_helper/CudaTimer.h
similarity index 100%
rename from src/cuda/CudaTimer.h
rename to src/gpu/cuda_helper/CudaTimer.h
diff --git a/src/cuda/DeviceInfo.cpp b/src/gpu/cuda_helper/DeviceInfo.cpp
similarity index 100%
rename from src/cuda/DeviceInfo.cpp
rename to src/gpu/cuda_helper/DeviceInfo.cpp
diff --git a/src/cuda/DeviceInfo.h b/src/gpu/cuda_helper/DeviceInfo.h
similarity index 100%
rename from src/cuda/DeviceInfo.h
rename to src/gpu/cuda_helper/DeviceInfo.h
diff --git a/src/lbm/refinement/Coefficients.h b/src/lbm/refinement/Coefficients.h
index 441c2567327c34b67c52754e33c5087a4d3d253b..78790f758f597a49caaad5e719641cf3df08afca 100644
--- a/src/lbm/refinement/Coefficients.h
+++ b/src/lbm/refinement/Coefficients.h
@@ -59,7 +59,7 @@ namespace vf::lbm
 // Coefficients coeffs;
 // momentsSet.calculateCoefficients(coeffs);
 
-// Coefficient which are used in the interpolation
+// Coefficients of the interpolation polynomial
 struct Coefficients
 {
     real a000, a100, a010, a001, a200, a020, a002, a110, a101, a011;
diff --git a/src/mpi/CMakeLists.txt b/src/mpi/CMakeLists.txt
deleted file mode 100644
index de1d58f5bd39e14742180b9cc6a77fb640d117f6..0000000000000000000000000000000000000000
--- a/src/mpi/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-
-vf_add_library(NAME mpi PUBLIC_LINK logger PRIVATE_LINK MPI::MPI_CXX basics)
diff --git a/src/mpi/NullCommunicator.cpp b/src/mpi/NullCommunicator.cpp
deleted file mode 100644
index 267942895df0afbfae7e2d528feb67ff7a2c6519..0000000000000000000000000000000000000000
--- a/src/mpi/NullCommunicator.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file NullCommunicator.cpp
-//! \ingroup Parallel
-//! \author Konstantin Kutscher
-//=======================================================================================
-
-#include "NullCommunicator.h"
-
-namespace vf::mpi
-{
-
-    std::shared_ptr<Communicator> NullCommunicator::getInstance()
-    {
-        std::lock_guard<std::mutex> myLock(instantiation_mutex);
-        if (!instance){
-            instance = std::shared_ptr<NullCommunicator>(new NullCommunicator);
-        }
-        return instance;
-    }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getBundleID() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getNumberOfBundles() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getProcessID() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getNumberOfProcesses() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    void *NullCommunicator::getNativeCommunicator() { return NULL; }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getRoot() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getBundleRoot() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    int NullCommunicator::getProcessRoot() { return 0; }
-    //////////////////////////////////////////////////////////////////////////
-    std::vector<std::string> NullCommunicator::gather(const std::string & /*str*/) { return std::vector<std::string>(); }
-    //////////////////////////////////////////////////////////////////////////
-
-    void NullCommunicator::sendSerializedObject(std::stringstream &ss, int target) {}
-    //////////////////////////////////////////////////////////////////////////
-    void NullCommunicator::receiveSerializedObject(std::stringstream &ss, int source) {}
-
-    int NullCommunicator::getProcessID(int bundle, int rank) { return 0; }
-    bool NullCommunicator::isRoot() {return true; }
-
-    int NullCommunicator::getNumberOfProcessesInBundle(int bundle) {return 0;}
-    void NullCommunicator::barrier() {}
-    void NullCommunicator::abort(int errorcode) {}
-
-
-    std::vector<int> NullCommunicator::gather(std::vector<int> &values){ return std::vector<int>(); }
-    std::vector<float> NullCommunicator::gather(std::vector<float> &values){ return std::vector<float>(); }
-    std::vector<double> NullCommunicator::gather(std::vector<double> &values){ return std::vector<double>(); }
-    std::vector<unsigned long long> NullCommunicator::gather(std::vector<unsigned long long> &values){ return std::vector<unsigned long long>(); }
-
-    void NullCommunicator::allGather(std::vector<int> &svalues, std::vector<int> &rvalues){ }
-    void NullCommunicator::allGather(std::vector<float> &svalues, std::vector<float> &rvalues){ }
-    void NullCommunicator::allGather(std::vector<double> &svalues, std::vector<double> &rvalues){ }
-    void NullCommunicator::allGather(std::vector<unsigned long long> &svalues, std::vector<unsigned long long> &rvalues){ }
-
-    void NullCommunicator::broadcast(int &value){ }
-    void NullCommunicator::broadcast(float &value){ }
-    void NullCommunicator::broadcast(double &value){ }
-    void NullCommunicator::broadcast(long int &value){ }
-    void NullCommunicator::broadcast(std::vector<int> &values){ }
-    void NullCommunicator::broadcast(std::vector<float> &values){ }
-    void NullCommunicator::broadcast(std::vector<double> &values){ }
-    void NullCommunicator::broadcast(std::vector<long int> &values){ }
-}
diff --git a/src/parallel/CMakeLists.txt b/src/parallel/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..742ebc3631ed3419bae3ebf1a67b40baf6a5be28
--- /dev/null
+++ b/src/parallel/CMakeLists.txt
@@ -0,0 +1,6 @@
+
+vf_add_library(PUBLIC_LINK logger MPI::MPI_CXX basics)
+
+if(MSVC)
+    target_link_libraries(parallel PRIVATE ws2_32)
+endif()
diff --git a/src/mpi/Communicator.cpp b/src/parallel/Communicator.cpp
similarity index 99%
rename from src/mpi/Communicator.cpp
rename to src/parallel/Communicator.cpp
index 937f4d819f67804380d807bfe5ef6048ff507058..b7708cb5ab79ce4acee9c76b6ba26e001b655c17 100644
--- a/src/mpi/Communicator.cpp
+++ b/src/parallel/Communicator.cpp
@@ -34,7 +34,7 @@
 #include "Communicator.h"
 #include <basics/utilities/UbException.h>
 
-namespace vf::mpi 
+namespace vf::parallel
 {
 std::mutex Communicator::instantiation_mutex = std::mutex();
 std::shared_ptr<Communicator> Communicator::instance = std::shared_ptr<Communicator>();
diff --git a/src/mpi/Communicator.h b/src/parallel/Communicator.h
similarity index 68%
rename from src/mpi/Communicator.h
rename to src/parallel/Communicator.h
index bcec064a23801c7b597d91deb601b44a1d9c7a71..23a760981944cfa143d7521275255f39a92bb7fe 100644
--- a/src/mpi/Communicator.h
+++ b/src/parallel/Communicator.h
@@ -34,43 +34,43 @@
 #ifndef MPI_COMMUNICATOR_H
 #define MPI_COMMUNICATOR_H
 
-#include <string>
-#include <vector>
 #include <memory>
-#include <sstream>
 #include <mutex>
+#include <sstream>
+#include <string>
+#include <vector>
 
+#include <basics/DataTypes.h>
 
-namespace vf::mpi 
+namespace vf::parallel
 {
 
 //! \brief An abstract class for communication between processes in parallel computation
 class Communicator
 {
 public:
-    Communicator(const Communicator&) = delete;
-    Communicator & operator=(const Communicator& rhs) = delete;
+    Communicator(const Communicator &) = delete;
+    Communicator &operator=(const Communicator &rhs) = delete;
     static std::shared_ptr<Communicator> getInstance();
 
     virtual ~Communicator() = default;
 
-    virtual int getBundleID()                      = 0;
-    virtual int getNumberOfBundles()               = 0;
-    virtual int getProcessID()                     = 0;
-    virtual int getProcessID(int bundle, int rank) = 0;
-    virtual int getNumberOfProcesses()             = 0;
-    virtual bool isRoot()                          = 0;
-    virtual void *getNativeCommunicator()          = 0;
+    virtual int getBundleID() const                      = 0;
+    virtual int getNumberOfBundles() const               = 0;
+    virtual int getProcessID() const                     = 0;
+    virtual int getProcessID(int bundle, int rank) const = 0;
+    virtual bool isRoot() const                          = 0;
+    virtual void *getNativeCommunicator()                = 0;
 
     virtual void sendSerializedObject(std::stringstream &ss, int target)    = 0;
     virtual void receiveSerializedObject(std::stringstream &ss, int source) = 0;
 
-    virtual int getRoot()                                = 0;
-    virtual int getBundleRoot()                          = 0;
-    virtual int getProcessRoot()                         = 0;
-    virtual int getNumberOfProcessesInBundle(int bundle) = 0;
-    virtual void barrier()                               = 0;
-    virtual void abort(int errorcode)                    = 0;
+    virtual int getRoot() const                                = 0;
+    virtual int getBundleRoot() const                          = 0;
+    virtual int getProcessRoot() const                         = 0;
+    virtual int getNumberOfProcessesInBundle(int bundle) const = 0;
+    virtual void barrier()                                     = 0;
+    virtual void abort(int errorcode)                          = 0;
 
     virtual std::vector<std::string> gather(const std::string &str)                         = 0;
     virtual std::vector<int> gather(std::vector<int> &values)                               = 0;
@@ -92,6 +92,20 @@ public:
     virtual void broadcast(std::vector<double> &values)   = 0;
     virtual void broadcast(std::vector<long int> &values) = 0;
 
+    virtual void receiveSend(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
+                             int size_buffer_send, int neighbor_rank_send) const = 0;
+    virtual int getNumberOfProcesses() const = 0;
+    virtual void send(real *sbuf, int count_s, int nb_rank) const = 0;
+    virtual double reduceSum(double quantityPerProcess) const = 0;
+    virtual int mapCudaDevicesOnHosts(const std::vector<unsigned int> &devices, int numberOfDevices) const = 0;
+    virtual void receiveSend(real *buffer_send, int size_buffer_send, real *buffer_receive, int size_buffer_recv,
+                             int neighbor_rank) const = 0;
+    virtual void receiveNonBlocking(real *rbuf, int count_r, int sourceRank) = 0;
+    virtual void sendNonBlocking(real *sbuf, int count_s, int destinationRank) = 0;
+    virtual void send(real *sbuf, int count_s, int destinationRank) = 0;
+    virtual void waitAll() = 0;
+    virtual void resetRequests() = 0;
+
 protected:
     Communicator() = default;
 
diff --git a/src/mpi/MPICommunicator.cpp b/src/parallel/MPICommunicator.cpp
similarity index 58%
rename from src/mpi/MPICommunicator.cpp
rename to src/parallel/MPICommunicator.cpp
index 4e7a155ef3b78f7daa0a582f84f2ef8af83886c8..8ae7ea66387f5e02b2e90dcacefbc324e81ca564 100644
--- a/src/mpi/MPICommunicator.cpp
+++ b/src/parallel/MPICommunicator.cpp
@@ -1,17 +1,26 @@
 #if defined VF_MPI
+#if defined (_WIN32) || defined (_WIN64)
+   #include <Winsock2.h>
+#elif defined (__unix__)
+   #include <unistd.h>
+#endif
 
 #include "MPICommunicator.h"
+
 #include <mpi.h>
 
 #include <sstream>
+
+#include <logger/Logger.h>
+
 using namespace std;
 
-namespace vf::mpi 
+namespace vf::parallel
 {
 std::shared_ptr<Communicator> MPICommunicator::getInstance()
 {
     std::lock_guard<std::mutex> myLock(instantiation_mutex);
-    if (!instance){
+    if (!instance) {
         instance = std::shared_ptr<MPICommunicator>(new MPICommunicator);
     }
     return instance;
@@ -22,13 +31,11 @@ MPICommunicator::MPICommunicator()
     // proof if MPI is initialized
     int mpiInitialized = 0; // false
     MPI_Initialized(&mpiInitialized);
-    if (!mpiInitialized) {
+    if (mpiInitialized == 0) {
         MPI_Init(NULL, NULL);
-        // MPI_Init_thread(NULL, NULL, MPI_THREAD_FUNNELED, NULL);
     }
     MPI_Comm_rank(MPI_COMM_WORLD, &PID);
     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
-    // numprocs = 1000;
     comm = MPI_COMM_WORLD;
     root = 0;
 }
@@ -38,9 +45,8 @@ MPICommunicator::~MPICommunicator()
     // proof if MPI is finalized
     int _mpiFinalized = 0; // false
     MPI_Finalized(&_mpiFinalized);
-    if (!_mpiFinalized) {
+    if (_mpiFinalized == 0) {
         MPI_Finalize();
-        // UBLOG(logINFO, "MPI_Finalize()");
     }
 }
 //////////////////////////////////////////////////////////////////////////
@@ -88,27 +94,27 @@ std::vector<unsigned long long> MPICommunicator::gather(std::vector<unsigned lon
     return gather<unsigned long long>(values);
 }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getProcessID() { return PID; }
+int MPICommunicator::getProcessID() const { return PID; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getProcessID(int /*bundle*/, int /*rank*/) { return PID; }
+int MPICommunicator::getProcessID(int /*bundle*/, int /*rank*/) const { return PID; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getNumberOfProcesses() { return numprocs; }
+int MPICommunicator::getNumberOfProcesses() const { return numprocs; }
 //////////////////////////////////////////////////////////////////////////
 void *MPICommunicator::getNativeCommunicator() { return &comm; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getBundleID() { return 0; }
+int MPICommunicator::getBundleID() const { return 0; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getNumberOfBundles() { return 1; }
+int MPICommunicator::getNumberOfBundles() const { return 1; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getRoot() { return root; }
+int MPICommunicator::getRoot() const { return root; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getBundleRoot() { return 0; }
+int MPICommunicator::getBundleRoot() const { return 0; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getProcessRoot() { return 0; }
+int MPICommunicator::getProcessRoot() const { return 0; }
 //////////////////////////////////////////////////////////////////////////
-int MPICommunicator::getNumberOfProcessesInBundle(int /*bundle*/) { return numprocs; }
+int MPICommunicator::getNumberOfProcessesInBundle(int /*bundle*/) const { return numprocs; }
 //////////////////////////////////////////////////////////////////////////
-bool MPICommunicator::isRoot() { return PID == root; }
+bool MPICommunicator::isRoot() const { return PID == root; }
 //////////////////////////////////////////////////////////////////////////
 void MPICommunicator::sendSerializedObject(std::stringstream &ss, int target)
 {
@@ -169,6 +175,120 @@ void MPICommunicator::broadcast(double &value) { broadcast<double>(value); }
 //////////////////////////////////////////////////////////////////////////
 void MPICommunicator::broadcast(long int &value) { broadcast<long int>(value); }
 
+void MPICommunicator::receiveSend(uint *buffer_receive, int size_buffer_recv,
+                                  int neighbor_rank_recv, uint *buffer_send, int size_buffer_send,
+                                  int neighbor_rank_send) const
+{
+    MPI_Request recv_request;
+    MPI_Irecv(buffer_receive, size_buffer_recv, MPI_UNSIGNED, neighbor_rank_recv, 0, comm,
+              &recv_request);
+    // printf("receive_send PID: %i,   nbRev: nb_rank_recv: %i", this->getPID(), nb_rank_r);
+    // fflush(stdout);
+    MPI_Send(buffer_send, size_buffer_send, MPI_UNSIGNED, neighbor_rank_send, 0, comm);
+    // printf("receive_send PID: %i,   sendUintGPU: nb_rank_send: %i", this->getPID(), nb_rank_s);
+    // fflush(stdout);
+    MPI_Wait(&recv_request, MPI_STATUSES_IGNORE); // TODO: Do we have a benefit here or could we simply do a blocking receiv.
+}
+
+void MPICommunicator::receiveSend(real *buffer_send, int size_buffer_send, real *buffer_receive, int size_buffer_recv,
+                     int neighbor_rank) const
+{
+    MPI_Send(buffer_send, size_buffer_send, VF_MPI_REAL, neighbor_rank, 0, comm);
+    MPI_Recv(buffer_receive, size_buffer_recv, VF_MPI_REAL, neighbor_rank, 0, comm, MPI_STATUS_IGNORE);
+}
+
+void MPICommunicator::send(real *sbuf, int count_s, int nb_rank) const
+{
+    MPI_Send(sbuf, count_s, VF_MPI_REAL, nb_rank, 0, comm);
+}
+
+double MPICommunicator::reduceSum(double quantityPerProcess) const
+{
+    double *buffer_send = &quantityPerProcess;
+    double *buffer_recv = (double *)malloc(sizeof(double));
+
+    MPI_Reduce(buffer_send, buffer_recv, 1, MPI_DOUBLE, MPI_SUM, 0, comm);
+
+    return *buffer_recv;
+}
+
+int MPICommunicator::mapCudaDevicesOnHosts(const std::vector<unsigned int> &devices, int numberOfDevices) const
+{
+    int device        = -1;
+    char *host        = (char *)malloc(sizeof(char) * getNumberOfProcesses() * 255);
+    unsigned int *map = (unsigned int *)malloc(sizeof(unsigned int) * getNumberOfProcesses());
+
+    char hostname[255];
+    gethostname(hostname, 254);
+    hostname[254] = 0;
+
+    MPI_Gather(hostname, 255, MPI_BYTE, host, 255, MPI_BYTE, 0, MPI_COMM_WORLD);
+
+    int i, j;
+    if (isRoot()) {
+        for (i = 0; i < getNumberOfProcesses(); i++) {
+            int counter = 0;
+            for (j = 0; j < i; j++) {
+                if (strcmp(&host[i * 255], &host[j * 255]) == 0)
+                    counter++;
+            }
+            if (counter >= numberOfDevices) {
+                VF_LOG_CRITICAL("More processes than GPUs!");
+                exit(1);
+            }
+            map[i] = devices[counter];
+        }
+    }
+
+    MPI_Scatter(map, 1, MPI_UNSIGNED, &device, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD);
+
+    VF_LOG_INFO("Rank: {} runs on host: {} with GPU: {}", getProcessID(), hostname, device);
+
+    free(map);
+    free(host);
+    return device;
+}
+
+void MPICommunicator::receiveNonBlocking(real *rbuf, int count_r, int sourceRank)
+{
+    // printf("\n Start Recv Rank: %d, neighbor Rank: %d, request = %d \n", PID, nb_rank, (int)requestGPU.size());
+    // fflush(stdout);
+
+    MPI_Request request;
+    MPI_Irecv(rbuf, count_r, VF_MPI_REAL, sourceRank, 0, comm, &request);
+    requests.push_back(request);
+
+    // printf("\n End Recv - Rank: %d , neighbor Rank: %d \n", PID, nb_rank);
+    // fflush(stdout);
+}
+
+void MPICommunicator::sendNonBlocking(real *sbuf, int count_s, int destinationRank)
+{
+    // printf("\n Start Send Rank: %d, neighbor Rank: %d, request = %d \n", PID, nb_rank, (int)requestGPU.size());
+    // fflush(stdout);
+
+    MPI_Request request;
+    MPI_Isend(sbuf, count_s, VF_MPI_REAL, destinationRank, 0, comm, &request);
+    requests.push_back(request);
+    // printf("\n End Send - Rank: %d , neighbor Rank: %d \n", PID, nb_rank);
+    // fflush(stdout);
+}
+
+void MPICommunicator::send(real *sbuf, int count_s, int destinationRank)
+{
+    MPI_Send(sbuf, count_s, VF_MPI_REAL, destinationRank, 0, comm);
+}
+
+void MPICommunicator::waitAll()
+{
+    MPI_Waitall((int)requests.size(), requests.data(), MPI_STATUSES_IGNORE);
+}
+
+void MPICommunicator::resetRequests()
+{
+    requests.clear();
+}
+
 }
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/mpi/MPICommunicator.h b/src/parallel/MPICommunicator.h
similarity index 80%
rename from src/mpi/MPICommunicator.h
rename to src/parallel/MPICommunicator.h
index 941bdac8f03d64184c17966ada27111193bbfa2d..466a3c3f8d311c743b546116a0a4ca9a23735488 100644
--- a/src/mpi/MPICommunicator.h
+++ b/src/parallel/MPICommunicator.h
@@ -4,14 +4,22 @@
 #define MPI_MPICOMMUNICATOR_H
 
 #include "Communicator.h"
-#include <PointerDefinitions.h>
+#include <basics/PointerDefinitions.h>
 #include <basics/utilities/UbException.h>
 #include <basics/utilities/UbLogger.h>
 #include <mpi.h>
 #include <string>
 #include <vector>
 
-namespace vf::mpi 
+//////////////////////////////////
+#ifdef VF_DOUBLE_ACCURACY
+#define VF_MPI_REAL MPI_DOUBLE
+#else
+#define VF_MPI_REAL MPI_FLOAT
+#endif
+//////////////////////////////////
+
+namespace vf::parallel
 {
 
 //! \brief A class uses MPI library to communication.
@@ -25,17 +33,17 @@ public:
 
     ~MPICommunicator() override;
     static std::shared_ptr<Communicator> getInstance();
-    int getBundleID() override;
-    int getNumberOfBundles() override;
-    int getProcessID() override;
-    int getProcessID(int bundle, int rank) override;
-    int getNumberOfProcesses() override;
+    int getBundleID() const override;
+    int getNumberOfBundles() const override;
+    int getProcessID() const override;
+    int getProcessID(int bundle, int rank) const override;
+    int getNumberOfProcesses() const override;
     void *getNativeCommunicator() override;
-    int getRoot() override;
-    int getBundleRoot() override;
-    int getProcessRoot() override;
-    int getNumberOfProcessesInBundle(int bundle) override;
-    bool isRoot() override;
+    int getRoot() const override;
+    int getBundleRoot() const override;
+    int getProcessRoot() const override;
+    int getNumberOfProcessesInBundle(int bundle) const override;
+    bool isRoot() const override;
     void abort(int errorcode) override;
 
     void sendSerializedObject(std::stringstream &ss, int target) override;
@@ -75,12 +83,30 @@ public:
     template <class T>
     void broadcast(T &value);
 
+    void receiveSend(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
+                     int size_buffer_send, int neighbor_rank_send) const override;
+
+    void send(real *sbuf, int count_s, int nb_rank) const override;
+    double reduceSum(double quantityPerProcess) const override;
+
+    int mapCudaDevicesOnHosts(const std::vector<unsigned int> &devices, int numberOfDevices) const override;
+    void receiveSend(real *buffer_send, int size_buffer_send, real *buffer_receive, int size_buffer_recv,
+                     int neighbor_rank) const override;
+
+    void receiveNonBlocking(real *rbuf, int count_r, int sourceRank) override;
+    void sendNonBlocking(real *sbuf, int count_s, int destinationRank) override;
+    void send(real *sbuf, int count_s, int destinationRank) override;
+    void waitAll() override;
+    void resetRequests() override;
+
 private:
     MPICommunicator();
 
     int numprocs, PID;
     MPI_Comm comm;
     int root;
+
+    std::vector<MPI_Request> requests;
 };
 
 //////////////////////////////////////////////////////////////////////////
@@ -96,6 +122,8 @@ std::vector<T> MPICommunicator::gather(std::vector<T> &values)
         mpiDataType = MPI_INT;
     else if ((std::string) typeid(T).name() == (std::string) typeid(unsigned long long).name())
         mpiDataType = MPI_UNSIGNED_LONG_LONG;
+    else if ((std::string) typeid(T).name() == (std::string) typeid(char).name())
+        mpiDataType = MPI_CHAR;
     else
         throw UbException(UB_EXARGS, "no MpiDataType for T" + (std::string) typeid(T).name());
 
@@ -209,6 +237,7 @@ void MPICommunicator::broadcast(T &value)
 }
 //////////////////////////////////////////////////////////////////////////
 
+
 #endif
 
 }
diff --git a/src/parallel/NullCommunicator.cpp b/src/parallel/NullCommunicator.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..56c17a8c3c466dae3299d0b32f9e918c68cc1610
--- /dev/null
+++ b/src/parallel/NullCommunicator.cpp
@@ -0,0 +1,217 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file NullCommunicator.cpp
+//! \ingroup Parallel
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "NullCommunicator.h"
+
+#include <memory>
+
+namespace vf::parallel
+{
+
+std::shared_ptr<Communicator> NullCommunicator::getInstance()
+{
+    std::lock_guard<std::mutex> myLock(instantiation_mutex);
+    if (!instance) {
+        instance = std::make_shared<NullCommunicator>();
+    }
+    return instance;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getBundleID() const
+{
+    return 0;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getNumberOfBundles() const
+{
+    return 0;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getProcessID() const
+{
+    return 0;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getNumberOfProcesses() const
+{
+    return 1;
+}
+//////////////////////////////////////////////////////////////////////////
+void *NullCommunicator::getNativeCommunicator()
+{
+    return NULL;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getRoot() const
+{
+    return 0;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getBundleRoot() const
+{
+    return 0;
+}
+//////////////////////////////////////////////////////////////////////////
+int NullCommunicator::getProcessRoot() const
+{
+    return 0;
+}
+//////////////////////////////////////////////////////////////////////////
+std::vector<std::string> NullCommunicator::gather(const std::string & /*str*/)
+{
+    return {};
+}
+//////////////////////////////////////////////////////////////////////////
+
+void NullCommunicator::sendSerializedObject(std::stringstream &stream, int target)
+{
+}
+//////////////////////////////////////////////////////////////////////////
+void NullCommunicator::receiveSerializedObject(std::stringstream &stream, int source)
+{
+}
+
+int NullCommunicator::getProcessID(int bundle, int rank) const
+{
+    return 0;
+}
+bool NullCommunicator::isRoot() const
+{
+    return true;
+}
+
+int NullCommunicator::getNumberOfProcessesInBundle(int bundle) const
+{
+    return 0;
+}
+void NullCommunicator::barrier()
+{
+}
+void NullCommunicator::abort(int errorcode)
+{
+}
+
+std::vector<int> NullCommunicator::gather(std::vector<int> &values)
+{
+    return {};
+}
+std::vector<float> NullCommunicator::gather(std::vector<float> &values)
+{
+    return {};
+}
+std::vector<double> NullCommunicator::gather(std::vector<double> &values)
+{
+    return {};
+}
+std::vector<unsigned long long> NullCommunicator::gather(std::vector<unsigned long long> &values)
+{
+    return {};
+}
+
+void NullCommunicator::allGather(std::vector<int> &svalues, std::vector<int> &rvalues)
+{
+}
+void NullCommunicator::allGather(std::vector<float> &svalues, std::vector<float> &rvalues)
+{
+}
+void NullCommunicator::allGather(std::vector<double> &svalues, std::vector<double> &rvalues)
+{
+}
+void NullCommunicator::allGather(std::vector<unsigned long long> &svalues, std::vector<unsigned long long> &rvalues)
+{
+}
+
+void NullCommunicator::broadcast(int &value)
+{
+}
+void NullCommunicator::broadcast(float &value)
+{
+}
+void NullCommunicator::broadcast(double &value)
+{
+}
+void NullCommunicator::broadcast(long int &value)
+{
+}
+void NullCommunicator::broadcast(std::vector<int> &values)
+{
+}
+void NullCommunicator::broadcast(std::vector<float> &values)
+{
+}
+void NullCommunicator::broadcast(std::vector<double> &values)
+{
+}
+void NullCommunicator::broadcast(std::vector<long int> &values)
+{
+}
+
+void NullCommunicator::receiveSend(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
+                                   int size_buffer_send, int neighbor_rank_send) const
+{
+}
+
+void NullCommunicator::send(real *sbuf, int count_s, int nb_rank) const {};
+double NullCommunicator::reduceSum(double /*quantityPerProcess*/) const
+{
+    return 0.0;
+};
+int NullCommunicator::mapCudaDevicesOnHosts(const std::vector<unsigned int> &devices, int numberOfDevices) const
+{
+    return 0;
+}
+
+void NullCommunicator::receiveSend(real *buffer_send, int size_buffer_send, real *buffer_receive, int size_buffer_recv,
+                                   int neighbor_rank) const
+{
+}
+
+void NullCommunicator::receiveNonBlocking(real *rbuf, int count_r, int sourceRank)
+{
+}
+void NullCommunicator::sendNonBlocking(real *sbuf, int count_s, int destinationRank)
+{
+}
+
+void NullCommunicator::send(real *sbuf, int count_s, int destinationRank)
+{
+}
+
+void NullCommunicator::waitAll()
+{
+}
+
+void NullCommunicator::resetRequests()
+{
+}
+} // namespace vf::parallel
diff --git a/src/mpi/NullCommunicator.h b/src/parallel/NullCommunicator.h
similarity index 53%
rename from src/mpi/NullCommunicator.h
rename to src/parallel/NullCommunicator.h
index 836f801ab6d15e377da8a34dfed8016b05f86e3a..295f946dbe8dd05c89ec57b733aa84867b5bea70 100644
--- a/src/mpi/NullCommunicator.h
+++ b/src/parallel/NullCommunicator.h
@@ -36,7 +36,7 @@
 
 #include "Communicator.h"
 
-namespace vf::mpi
+namespace vf::parallel
 {
 
 //! \brief A class implements Communicator for shared memory.
@@ -46,45 +46,62 @@ class NullCommunicator : public Communicator
 public:
     static std::shared_ptr<Communicator> getInstance();
 
-    int getBundleID();
-    int getNumberOfBundles();
-    int getProcessID();
-    int getProcessID(int bundle, int rank);
-    int getNumberOfProcesses();
-    bool isRoot();
-    void *getNativeCommunicator();
-
-    void sendSerializedObject(std::stringstream &ss, int target);
-    void receiveSerializedObject(std::stringstream &ss, int source);
-
-    int getRoot();
-    int getBundleRoot();
-    int getProcessRoot();
-    int getNumberOfProcessesInBundle(int bundle);
-    void barrier();
-    void abort(int errorcode);
-
-    std::vector<std::string> gather(const std::string &str);
-    std::vector<int> gather(std::vector<int> &values);
-    std::vector<float> gather(std::vector<float> &values);
-    std::vector<double> gather(std::vector<double> &values);
-    std::vector<unsigned long long> gather(std::vector<unsigned long long> &values);
-
-    void allGather(std::vector<int> &svalues, std::vector<int> &rvalues);
-    void allGather(std::vector<float> &svalues, std::vector<float> &rvalues);
-    void allGather(std::vector<double> &svalues, std::vector<double> &rvalues);
-    void allGather(std::vector<unsigned long long> &svalues, std::vector<unsigned long long> &rvalues);
-
-    void broadcast(int &value);
-    void broadcast(float &value);
-    void broadcast(double &value);
-    void broadcast(long int &value);
-    void broadcast(std::vector<int> &values);
-    void broadcast(std::vector<float> &values);
-    void broadcast(std::vector<double> &values);
-    void broadcast(std::vector<long int> &values);
+    int getBundleID() const override;
+    int getNumberOfBundles() const override;
+    int getProcessID() const override;
+    int getProcessID(int bundle, int rank) const override;
+    int getNumberOfProcesses() const override;
+    bool isRoot() const override;
+    void *getNativeCommunicator() override;
+
+    void sendSerializedObject(std::stringstream &stream, int target) override;
+    void receiveSerializedObject(std::stringstream &stream, int source) override;
+
+    int getRoot() const override;
+    int getBundleRoot() const override;
+    int getProcessRoot() const override;
+    int getNumberOfProcessesInBundle(int bundle) const override;
+    void barrier() override;
+    void abort(int errorcode) override;
+
+    std::vector<std::string> gather(const std::string &str) override;
+    std::vector<int> gather(std::vector<int> &values) override;
+    std::vector<float> gather(std::vector<float> &values) override;
+    std::vector<double> gather(std::vector<double> &values) override;
+    std::vector<unsigned long long> gather(std::vector<unsigned long long> &values) override;
+
+    void allGather(std::vector<int> &svalues, std::vector<int> &rvalues) override;
+    void allGather(std::vector<float> &svalues, std::vector<float> &rvalues) override;
+    void allGather(std::vector<double> &svalues, std::vector<double> &rvalues) override;
+    void allGather(std::vector<unsigned long long> &svalues, std::vector<unsigned long long> &rvalues) override;
+
+    void broadcast(int &value) override;
+    void broadcast(float &value) override;
+    void broadcast(double &value) override;
+    void broadcast(long int &value) override;
+    void broadcast(std::vector<int> &values) override;
+    void broadcast(std::vector<float> &values) override;
+    void broadcast(std::vector<double> &values) override;
+    void broadcast(std::vector<long int> &values) override;
+
+    void receiveSend(uint *buffer_receive, int size_buffer_recv, int neighbor_rank_recv, uint *buffer_send,
+                     int size_buffer_send, int neighbor_rank_send) const override;
+
+    void send(real *sbuf, int count_s, int nb_rank) const override;
+
+    double reduceSum(double quantityPerProcess) const override;
+    int mapCudaDevicesOnHosts(const std::vector<unsigned int> &devices, int numberOfDevices) const override;
+
+    void receiveSend(real *buffer_send, int size_buffer_send, real *buffer_receive, int size_buffer_recv,
+                     int neighbor_rank) const override;
+
+    void receiveNonBlocking(real *rbuf, int count_r, int sourceRank) override;
+    void sendNonBlocking(real *sbuf, int count_s, int destinationRank) override;
+    void send(real *sbuf, int count_s, int destinationRank) override;
+    void waitAll() override;
+    void resetRequests() override;
 };
 
-}
+} // namespace vf::parallel
 
 #endif