diff --git a/CMakeLists.txt b/CMakeLists.txt
index b7ae62b8bfaaf8928ef294ad46b80d58cc6ee31c..6dc1f16be759678b27714296f51eb3adc57bbd27 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,12 +25,12 @@
 ##
 ############################################################################################################################
 
-CMAKE_MINIMUM_REQUIRED (VERSION 3.14)
+CMAKE_MINIMUM_REQUIRED (VERSION 3.24)
 
 
 PROJECT ( walberla )
 
-set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${walberla_SOURCE_DIR}/cmake )
+set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${walberla_SOURCE_DIR}/cmake ${walberla_SOURCE_DIR}/cmake/compileroptions )
 
 include ( waLBerlaFunctions )
 
@@ -176,11 +176,6 @@ if( CMAKE_CXX_COMPILER MATCHES "icpc" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "icpc"
     ENDIF(XILD)
     MARK_AS_ADVANCED(XILD)
 
-    if( CMAKE_VERSION VERSION_LESS 3.11.0 )
-      set( CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17" )
-      set( CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_CXX17_STANDARD_COMPILE_OPTION )
-      add_flag ( CMAKE_CXX_FLAGS ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
-    endif()
     if( CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.0.5" )
       # std::filesystem uses ABI tags, which don't work 19.0.2 but do in 19.0.5
       add_flag ( CMAKE_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" )
@@ -193,6 +188,7 @@ mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_INTEL )
 # Check for Gnu compiler
 if ( CMAKE_COMPILER_IS_GNUCXX  AND NOT WALBERLA_CXX_COMPILER_IS_INTEL )
      option ( WALBERLA_CXX_COMPILER_IS_GNU "Use gnu compiler" ON  )
+     include(GNU)
 else()
      option ( WALBERLA_CXX_COMPILER_IS_GNU "Use gnu compiler" OFF  )
 endif()
@@ -201,6 +197,7 @@ mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_GNU )
 # Check for Visual Studio
 if ( MSVC )
      option ( WALBERLA_CXX_COMPILER_IS_MSVC "Use Visual Studio compiler" ON  )
+     include( MSVC )
 else()
      option ( WALBERLA_CXX_COMPILER_IS_MSVC "Use Visual Studio compiler" OFF  )
 endif()
@@ -209,21 +206,15 @@ mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_MSVC )
 # Check for IBM compiler
 if( CMAKE_CXX_COMPILER MATCHES "xlc" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "xlc" )
     option ( WALBERLA_CXX_COMPILER_IS_IBM "Use IBM compiler" ON  )
+    include(IBM)
 else()
     option ( WALBERLA_CXX_COMPILER_IS_IBM "Use IBM compiler" OFF  )
 endif()
 mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_IBM )
 
-# Check for NEC SX compiler
-if( CMAKE_CXX_COMPILER MATCHES "/sxc" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "/sxc" OR CMAKE_CXX_COMPILER MATCHES "/sxmpic" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "/sxmpic" )
-    option ( WALBERLA_CXX_COMPILER_IS_NEC "Use NEC compiler" ON  )
-else()
-    option ( WALBERLA_CXX_COMPILER_IS_NEC "Use NEC compiler" OFF  )
-endif()
-mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_NEC )
-
 if( CMAKE_CXX_COMPILER MATCHES "clang" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "clang" OR CMAKE_CXX_COMPILER MATCHES "hipcc" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" )
     option ( WALBERLA_CXX_COMPILER_IS_CLANG "Use clang compiler" ON  )
+    include(Clang)
 else()
     option ( WALBERLA_CXX_COMPILER_IS_CLANG "Use clang compiler" OFF  )
 endif()
@@ -232,21 +223,16 @@ mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_CLANG )
 # Check for Cray compiler
 if( CMAKE_CXX_COMPILER_ID MATCHES Cray )
     option ( WALBERLA_CXX_COMPILER_IS_CRAY "Use Cray compiler" ON   )
+    include(Cray)
 else()
     option ( WALBERLA_CXX_COMPILER_IS_CRAY "Use Cray compiler" OFF  )
 endif()
 mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_CRAY )
 
-if( CMAKE_CXX_COMPILER MATCHES "pgc\\+\\+" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "pgc\\+\\+" )
-    option ( WALBERLA_CXX_COMPILER_IS_PGI "Use PGI compiler" ON  )
-else()
-    option ( WALBERLA_CXX_COMPILER_IS_PGI "Use PGI compiler" OFF  )
-endif()
-mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_PGI )
-
 # Check for Fujitsu compiler
 if( CMAKE_CXX_COMPILER_ID MATCHES FujitsuClang )
     option ( WALBERLA_CXX_COMPILER_IS_FUJITSUCLANG "Use FujitsuClang compiler" ON  )
+    include(FujitsuClang)
 else()
     option ( WALBERLA_CXX_COMPILER_IS_FUJITSUCLANG "Use FujitsuClang compiler" OFF  )
 endif()
@@ -264,6 +250,7 @@ mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_MPI_WRAPPER )
 # Check for intel llvm compiler
 if( CMAKE_CXX_COMPILER MATCHES "icpx" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "icpx" )
    option ( WALBERLA_CXX_COMPILER_IS_INTELLLVM "Use Intel LLVM compiler" ON  )
+   include(IntelLLVM)
 else()
    option ( WALBERLA_CXX_COMPILER_IS_INTELLLVM "Use Intel LLVM compiler" OFF  )
 endif()
@@ -279,194 +266,7 @@ mark_as_advanced ( WALBERLA_CXX_COMPILER_IS_INTELLLVM )
 ##
 ############################################################################################################################
 
-# Profile guided optimization
-if ( WALBERLA_PROFILE_GENERATE )
-    if( WALBERLA_CXX_COMPILER_IS_INTEL )
-        add_flag( CMAKE_CXX_FLAGS "-prof-gen" )
-        file( MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/profile" )
-        add_flag( CMAKE_CXX_FLAGS "-prof-dir${CMAKE_BINARY_DIR}/profile" )
-    elseif( WALBERLA_CXX_COMPILER_IS_GNU )
-        add_flag( CMAKE_CXX_FLAGS "-fprofile-generate" )
-    elseif( WALBERLA_CXX_COMPILER_IS_MSVC )
-      add_flag ( CMAKE_CXX_FLAGS           "/GL"                )
-      add_flag ( CMAKE_MODULE_LINKER_FLAGS "/LTCG:PGINSTRUMENT" )
-      add_flag ( CMAKE_SHARED_LINKER_FLAGS "/LTCG:PGINSTRUMENT" )
-      add_flag ( CMAKE_EXE_LINKER_FLAGS    "/LTCG:PGINSTRUMENT" )
-    endif()
-endif()
-
-if ( WALBERLA_PROFILE_USE )
-    if( WALBERLA_CXX_COMPILER_IS_INTEL )
-       add_flag( CMAKE_CXX_FLAGS "-prof-use" )
-       add_flag( CMAKE_CXX_FLAGS "-prof-dir${CMAKE_BINARY_DIR}/profile" )
-    elseif( WALBERLA_CXX_COMPILER_IS_GNU )
-       add_flag( CMAKE_CXX_FLAGS "-fprofile-use" )
-    elseif( WALBERLA_CXX_COMPILER_IS_MSVC )
-      add_flag ( CMAKE_CXX_FLAGS           "/GL"              )
-      add_flag ( CMAKE_MODULE_LINKER_FLAGS "/LTCG:PGOPTIMIZE" )
-      add_flag ( CMAKE_SHARED_LINKER_FLAGS "/LTCG:PGOPTIMIZE" )
-      add_flag ( CMAKE_EXE_LINKER_FLAGS    "/LTCG:PGOPTIMIZE" )
-    endif()
-endif()
-
-# common flags for intel and g++
-if ( NOT WARNING_DISABLE AND ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL ) )
-   add_flag ( CMAKE_CXX_FLAGS "-Wall -Wconversion -Wshadow" )
-endif()
-
-# C++ language features for NEC compiler
-if( WALBERLA_CXX_COMPILER_IS_NEC )
-   set( CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION "-Kcpp${CMAKE_CXX_STANDARD}" )
-   set( CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION )
-   add_flag ( CMAKE_CXX_FLAGS "${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} -Krtti -Kexceptions -size_t64 -Kgcc" )
-   add_flag ( CMAKE_CXX_FLAGS "-D__BIG_ENDIAN -D__BYTE_ORDER=__BIG_ENDIAN" )
-   add_flag ( CMAKE_CXX_FLAGS "-Tnoauto,used" )
-   add_flag ( CMAKE_EXE_LINKER_FLAGS "-Wl,-h,muldefs" )
-   add_flag ( CMAKE_C_FLAGS "-size_t64 -Kgcc" )
-   add_flag ( CMAKE_C_FLAGS "-D__BIG_ENDIAN -D__BYTE_ORDER=__BIG_ENDIAN" )
-   add_flag ( CMAKE_C_FLAGS "-DSQLITE_OMIT_WAL -DHAVE_UTIME -DTHREADSAFE=0" )
-   set( CMAKE_RANLIB /bin/true )
-   set( CMAKE_SKIP_BUILD_RPATH TRUE )
-   set( CMAKE_C_FLAGS_DEBUGOPTIMIZED    "-Chopt -g"                               )
-   set( CMAKE_C_FLAGS_DEBUG             "-Cdebug -g"                              )
-   set( CMAKE_CXX_FLAGS_DEBUGOPTIMIZED  "-Chopt -g"                               )
-   set( CMAKE_CXX_FLAGS_DEBUG           "-Cdebug -g"                              )
-endif()
-
-# Fixes linker errors with IBM compiler
-if( WALBERLA_CXX_COMPILER_IS_IBM )
-   add_flag ( CMAKE_CXX_FLAGS "-qpic=large" )
-endif()
-# Fixes linker errors with Cray compiler
-if( WALBERLA_CXX_COMPILER_IS_CRAY )
-   add_flag ( CMAKE_EXE_LINKER_FLAGS  "-dynamic -L/opt/gcc/4.9.3/snos/lib64" )
-endif()
-
-# Silences compiler and linker warnings and information with the IBM compiler
-if( WALBERLA_CXX_COMPILER_IS_IBM )
-   add_flag ( CMAKE_CXX_FLAGS "-qsuppress=1586-267" )  # 1586-267 (I) Inlining of specified subprogram failed due to the presence of a C++ exception handler
-   add_flag ( CMAKE_CXX_FLAGS "-qsuppress=1586-266" )  # 1586-266 (I) Inlining of specified subprogram failed due to the presence of a global label
-   add_flag ( CMAKE_CXX_FLAGS "-qsuppress=1500-030" )  # 1500-030: (I) INFORMATION: [...] Additional optimization may be attained by recompiling and specifying MAXMEM option with a value greater than 8192.
-   add_flag ( CMAKE_C_FLAGS "-qsuppress=1500-030" )    # 1500-030: (I) INFORMATION: [...] Additional optimization may be attained by recompiling and specifying MAXMEM option with a value greater than 8192.
-endif()
-
-# Silences compiler and linker warnings and information with the Cray compiler
-if( WALBERLA_CXX_COMPILER_IS_CRAY )
-   set( CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem " )
-   add_flag ( CMAKE_CXX_FLAGS "-h nomessage=1" )      # CC-1    The source file does not end with a new-line character.
-   add_flag ( CMAKE_C_FLAGS   "-DSQLITE_HAVE_ISNAN" ) # SQLite will not work correctly with the -ffast-math option of GCC.
-   add_flag ( CMAKE_CXX_FLAGS "-DSQLITE_HAVE_ISNAN" ) # SQLite will not work correctly with the -ffast-math option of GCC.
-endif()
-
-# Silences compiler and linker warnings and information with the PGI compiler
-if( WALBERLA_CXX_COMPILER_IS_PGI )
-   add_flag ( CMAKE_CXX_FLAGS "--display_error_number" )
-   add_flag ( CMAKE_C_FLAGS "--display_error_number" )
-   if( CMAKE_VERSION VERSION_LESS "3.19" )
-      #  https://github.com/Kitware/CMake/commit/52eee1938919deb59cc2b51d44f365f0d9a418e5
-      set( CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION "--c++${CMAKE_CXX_STANDARD}" )
-   endif()
-   add_flag ( CMAKE_CXX_FLAGS "--diag_suppress=1" )   # last line of file ends without a newline
-   add_flag ( CMAKE_CXX_FLAGS "--diag_suppress=111" ) # statement is unreachable
-   add_flag ( CMAKE_C_FLAGS "--diag_suppress=111" )   # statement is unreachable
-   add_flag ( CMAKE_C_FLAGS "--diag_suppress=550" )   # variable [...] was set but never used
-   add_flag ( CMAKE_C_FLAGS "--diag_suppress=191" )   # type qualifier is meaningless on cast type
-endif()
-
-# architecture optimization
-if( WALBERLA_OPTIMIZE_FOR_LOCALHOST )
-   if( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL OR WALBERLA_CXX_COMPILER_IS_CLANG )
-      if(( CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) AND CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" )
-        # no -march=native available on this compiler, but there is currently only one such processor
-      else()
-        add_flag ( CMAKE_CXX_FLAGS "-march=native" )
-        add_flag ( CMAKE_C_FLAGS   "-march=native" )
-      endif()
-
-      if( WALBERLA_CXX_COMPILER_IS_INTEL )
-        add_flag ( CMAKE_CXX_FLAGS "-xhost" )
-        add_flag ( CMAKE_C_FLAGS   "-xhost" )
-      endif()
-
-      if( EXISTS "/proc/sys/abi/sve_default_vector_length" )
-        file( READ "/proc/sys/abi/sve_default_vector_length" SVE_LENGTH_BYTES )
-        string(STRIP "${SVE_LENGTH_BYTES}" SVE_LENGTH_BYTES)
-        math(EXPR SVE_LENGTH "${SVE_LENGTH_BYTES} * 8")
-        add_flag ( CMAKE_CXX_FLAGS "-msve-vector-bits=${SVE_LENGTH}" )
-        add_flag ( CMAKE_C_FLAGS   "-msve-vector-bits=${SVE_LENGTH}" )
-      endif()
-   endif()
-endif()
-
-# warning flags
-if( WALBERLA_CXX_COMPILER_IS_INTEL )
-   # system headers are also supported by intel, but cmake does not recognize that
-   set( CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem " )
-   add_flag ( CMAKE_CXX_FLAGS "-wd2928,2504,2259,1682,597" )
-   # disable icc/icpc deprecation warning
-   add_flag ( CMAKE_CXX_FLAGS "-diag-disable=10441" )
-elseif( WALBERLA_CXX_COMPILER_IS_GNU )
-   add_flag ( CMAKE_CXX_FLAGS "-Wfloat-equal -Wextra" )
-elseif( WALBERLA_CXX_COMPILER_IS_NEC )
-   add_flag ( CMAKE_CXX_FLAGS "-wall" )
-endif()
-
-if ( WARNING_PEDANTIC AND WALBERLA_CXX_COMPILER_IS_GNU )
-   add_flag ( CMAKE_CXX_FLAGS "-pedantic" )
-endif ( )
-
- # omit deprecated warnings
-if( NOT WARNING_DEPRECATED)
-   if( WALBERLA_CXX_COMPILER_IS_INTEL )
-       add_flag( CMAKE_CXX_FLAGS "-wd1478" )  # Disable compiler warning # 1478: "declared as deprecated"
-   elseif( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
-       add_flag ( CMAKE_CXX_FLAGS "-Wno-deprecated-declarations")
-   endif()
-endif()
-
-
-if ( WALBERLA_CXX_COMPILER_IS_CLANG OR WALBERLA_CXX_COMPILER_IS_FUJITSUCLANG )
-    add_flag ( CMAKE_CXX_FLAGS "-Wall -Wconversion -Wshadow -Wno-c++11-extensions -Qunused-arguments" )
-endif ( )
-
 
-if( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL OR WALBERLA_CXX_COMPILER_IS_CLANG )
-    if ( WALBERLA_STL_BOUNDS_CHECKS )
-        add_definitions ( "-D_GLIBCXX_DEBUG" )
-        add_definitions ( "-D_LIBCPP_DEBUG=1" )
-    endif()
-endif()
-
-# Omit maybe-uninitialized for gcc 12 for now. Check if it is a bug or a real problem:
-if( WALBERLA_CXX_COMPILER_IS_GNU AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0" )
-   add_flag( CMAKE_CXX_FLAGS "-Wno-maybe-uninitialized" )
-endif()
-
-# GCC 12 reports a "array bounds" warning at UniformBufferedScheme.h:297 (error: array subscript 26 is above array bounds of)
-# when e.g. compiling the GhostLayerCommTest.
-# Since this is most probably a bug in GCC disable the warning for now
-if( WALBERLA_CXX_COMPILER_IS_GNU AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0" )
-   add_flag( CMAKE_CXX_FLAGS "-Wno-array-bounds" )
-endif()
-
-#fastmath
-if ( WALBERLA_BUILD_WITH_FASTMATH )
-    if ( WALBERLA_CXX_COMPILER_IS_INTEL )
-        add_flag( CMAKE_CXX_FLAGS "-fp-model fast=2 -no-prec-sqrt -no-prec-div" )
-    endif()
-
-    if ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
-        add_flag( CMAKE_CXX_FLAGS "-ffast-math")
-    endif()
-
-    if( WALBERLA_CXX_COMPILER_IS_MSVC )
-        add_flag( CMAKE_CXX_FLAGS "/fp:fast" )
-    endif()
-else()
-   if( WALBERLA_CXX_COMPILER_IS_INTELLLVM )
-      add_flag( CMAKE_CXX_FLAGS "-fp-model=precise")
-   endif()
-endif()
 
 # Xcode generator disables -isystem flag, even though current versions of Xcode support it
 if(CMAKE_GENERATOR STREQUAL "Xcode")
@@ -475,19 +275,6 @@ if(CMAKE_GENERATOR STREQUAL "Xcode")
 endif()
 
 
-#GCC 5+ ABI selection
-if( WALBERLA_CXX_COMPILER_IS_GNU )
-   if( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0.0 )
-      option ( WALBERLA_USE_CPP11_ABI "On GCC 5+ use the C++11 ABI" ON )
-      if( WALBERLA_USE_CPP11_ABI )
-         add_flag( CMAKE_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1" )
-      else()
-         add_flag( CMAKE_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" )
-      endif()
-   endif()
-endif()
-
-
 # disable Xcode 7.3+ linker deduplication pass to speed up linking in debug mode
 #if ( APPLE )
 #   execute_process( COMMAND ${CMAKE_LINKER} -v OUTPUT_VARIABLE LINKER_VERSION ERROR_VARIABLE LINKER_VERSION )
@@ -506,97 +293,6 @@ endif()
 ############################################################################################################################
 
 
-
-############################################################################################################################
-##
-##  Find newer C++ libraries, which may only be available in std::experimental on some compilers
-##
-############################################################################################################################
-
-try_compile( WALBERLA_USE_STD_FILESYSTEM "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdFilesystem.cpp"
-      COMPILE_DEFINITIONS -DWALBERLA_USE_STD_FILESYSTEM COPY_FILE "${CMAKE_CURRENT_BINARY_DIR}/TestStdFilesystem" OUTPUT_VARIABLE TRY_COMPILE_OUTPUT)
-if( WALBERLA_USE_STD_FILESYSTEM )
-  # detect https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90050 by checking whether it segfaults
-  execute_process( COMMAND "${CMAKE_CURRENT_BINARY_DIR}/TestStdFilesystem" OUTPUT_QUIET RESULT_VARIABLE WALBERLA_STD_FILESYSTEM_WORKS )
-endif()
-if( WALBERLA_USE_STD_FILESYSTEM AND WALBERLA_STD_FILESYSTEM_WORKS EQUAL 0 )
-   message( STATUS "Found std::filesystem")
-else()
-   try_compile( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdFilesystem.cpp"
-         COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM OUTPUT_VARIABLE TRY_COMPILE_OUTPUT)
-   if( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
-      message( STATUS "Found std::experimental::filesystem")
-   endif()
-   if( NOT WALBERLA_CXX_COMPILER_IS_MSVC AND NOT WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
-      unset( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM CACHE )
-      try_compile( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdFilesystem.cpp"
-            COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM LINK_LIBRARIES stdc++fs OUTPUT_VARIABLE TRY_COMPILE_OUTPUT)
-      if( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
-         message( STATUS "Found std::experimental::filesystem in libstdc++fs")
-      list ( APPEND SERVICE_LIBS -lstdc++fs )
-      endif()
-   endif()
-   if( NOT WALBERLA_CXX_COMPILER_IS_MSVC AND NOT WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
-      unset( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM CACHE )
-      try_compile( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdFilesystem.cpp"
-            COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM LINK_LIBRARIES c++experimental OUTPUT_VARIABLE TRY_COMPILE_OUTPUT)
-      if( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
-         message( STATUS "Found std::experimental::filesystem in libc++experimental")
-         list ( APPEND SERVICE_LIBS -lc++experimental )
-      endif()
-   endif()
-   if( NOT WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM AND NOT WALBERLA_USE_STD_FILESYSTEM)
-      message( WARNING ${TRY_COMPILE_OUTPUT} )
-      message( FATAL_ERROR "Neither std::filesystem nor std::experimental::filesystem are available" )
-   endif()
-endif()
-
-############################################################################################################################
-##
-##  Visual Studio Setup
-##
-############################################################################################################################
-if ( WALBERLA_CXX_COMPILER_IS_MSVC )
-   string( REGEX REPLACE "[/-]W[0-4]" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ) # remove default warning flags
-
-   option ( WALBERLA_GROUP_PROJECTS   "Flag if the projects are grouped or in a flat hierarchy"    ON )
-   option ( WALBERLA_GROUP_FILES      "Flag if the files are grouped or in a flat hierarchy"       ON )
-   set_property ( GLOBAL PROPERTY USE_FOLDERS ${WALBERLA_GROUP_PROJECTS} )
-
-   option ( WALBERLA_VS_MULTI_PROCESS_BUILD "Use the /mp option for VS builds" ON )
-   if( WALBERLA_VS_MULTI_PROCESS_BUILD )
-      add_flag ( CMAKE_CXX_FLAGS "-MP" ) # enable multi-threaded compiling
-   endif()
-
-   add_definitions ( "-DNOMINMAX" )                # Disable Min/Max-Macros
-   add_definitions ( "-D_WIN32_WINNT=0x501" )      # Minimum Windows versions is Windows XP
-   add_definitions ( "-DWINVER=0x501" )            # Minimum Windows versions is Windows XP
-   add_definitions ( "-D_CRT_SECURE_NO_WARNINGS" ) # disable warnings promoting Microsoft's security enhanced CRT
-   add_definitions ( "-D_SCL_SECURE_NO_WARNINGS" ) # disable warnings triggered by Microsoft's checked iterators
-   add_flag ( CMAKE_CXX_FLAGS "-W4" )              # set warning level to maximum
-   add_flag ( CMAKE_CXX_FLAGS "-bigobj" )          # enable big object files
-   add_flag ( CMAKE_CXX_FLAGS "-wd4127" )          # disable compiler warning C4127: "conditional expression is constant"
-   add_flag ( CMAKE_CXX_FLAGS "-wd4512" )          # disable compiler warning C4512: "assignment operator could not be generated"
-   add_flag ( CMAKE_CXX_FLAGS "-wd4913" )          # disable compiler warning C4512: "user defined binary operator ',' exists but
-                                                   # no overload could convert all operands, default built-in binary operator ','
-                                                   # used"
-   add_flag ( CMAKE_CXX_FLAGS "-wd4702" )          # disable compiler warning C4702: "unreachable code"
-   add_flag ( CMAKE_CXX_FLAGS "-wd4505" )          # disable compiler warning C4505: "unreferenced local function has been removed"
-   add_flag ( CMAKE_CXX_FLAGS "-wd4503" )          # disable compiler warning C4503: "'identifier' : decorated name length exceeded, name was truncated"
-
-   if ( WARNING_ERROR )
-      add_flag ( CMAKE_CXX_FLAGS "-WX" )           # Treat warnings as errors
-   endif ( )
-
-   if( NOT WARNING_DEPRECATED)
-      add_definitions( "-D_CRT_SECURE_NO_DEPRECATE" )
-      add_definitions( "-D_SCL_SECURE_NO_DEPRECATE" )
-      add_flag       ( CMAKE_CXX_FLAGS "-wd4996"    ) # Disable compiler warning C4996: "declared as deprecated"
-   endif()
-
-endif ( )
-############################################################################################################################
-
 ############################################################################################################################
 ##
 ## Python
@@ -649,12 +345,9 @@ endif()
 ##
 #############################################################################################################################
 if ( WALBERLA_BUILD_WITH_PYTHON )
-    if(WALBERLA_CXX_COMPILER_IS_INTEL)
-        # Intel C++17 support introduced in 2.6.2 (https://github.com/pybind/pybind11/pull/2729)
-        set(PYBIND11_MINIMUM_VERSION "2.6.2")
-    else()
-        set(PYBIND11_MINIMUM_VERSION "2.6.0")
-    endif()
+   if (NOT DEFINED PYBIND11_MINIMUM_VERSION)
+           set(PYBIND11_MINIMUM_VERSION "2.6.0")
+   endif()
 
     execute_process(COMMAND ${Python_EXECUTABLE} -c "import pybind11; print(pybind11._version.__version__)"
                     OUTPUT_VARIABLE pybind11_VERSION ERROR_QUIET RESULT_VARIABLE pybind11_VERSION_RESULT)
@@ -730,24 +423,6 @@ if ( Threads_FOUND )
 endif()
 
 
-
-############################################################################################################################
-##
-## backtrace may be in a separate library
-##
-############################################################################################################################
-
-if ( NOT WIN32 AND (WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL OR WALBERLA_CXX_COMPILER_IS_CLANG))
-   find_package ( Backtrace QUIET )
-   if ( Backtrace_FOUND )
-      list ( APPEND SERVICE_LIBS ${Backtrace_LIBRARIES} )
-      set ( WALBERLA_BUILD_WITH_BACKTRACE ON )
-      set ( WALBERLA_BACKTRACE_HEADER ${Backtrace_HEADER} )
-   endif ( Backtrace_FOUND )
-endif()
-
-
-
 ############################################################################################################################
 ##
 ## MPI
@@ -920,22 +595,6 @@ set( CMAKE_MODULE_LINKER_FLAGS_DEBUGOPTIMIZED ${CMAKE_MODULE_LINKER_FLAGS_DEBUG}
 
 set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS Debug DebugOptimized)
 
-if ( WALBERLA_CXX_COMPILER_IS_MSVC )
-    string(REPLACE "/Od" "/O2"   CMAKE_C_FLAGS_DEBUGOPTIMIZED   ${CMAKE_C_FLAGS_DEBUGOPTIMIZED})
-    string(REPLACE "/Ob0" "/Ob2" CMAKE_C_FLAGS_DEBUGOPTIMIZED   ${CMAKE_C_FLAGS_DEBUGOPTIMIZED})
-    string(REPLACE "/RTC1" ""    CMAKE_C_FLAGS_DEBUGOPTIMIZED   ${CMAKE_C_FLAGS_DEBUGOPTIMIZED})
-    string(REPLACE "/Od" "/O2"   CMAKE_CXX_FLAGS_DEBUGOPTIMIZED ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED})
-    string(REPLACE "/Ob0" "/Ob2" CMAKE_CXX_FLAGS_DEBUGOPTIMIZED ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED})
-    string(REPLACE "/RTC1" ""    CMAKE_CXX_FLAGS_DEBUGOPTIMIZED ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED})
-elseif(    WALBERLA_CXX_COMPILER_IS_GNU
-        OR WALBERLA_CXX_COMPILER_IS_INTEL
-        OR WALBERLA_CXX_COMPILER_IS_CLANG
-        OR WALBERLA_CXX_COMPILER_IS_INTELLLVM
-        OR WALBERLA_CXX_COMPILER_IS_FUJITSUCLANG )
-   set( CMAKE_C_FLAGS_DEBUGOPTIMIZED   "${CMAKE_C_FLAGS_DEBUGOPTIMIZED} -O3" )
-   set( CMAKE_CXX_FLAGS_DEBUGOPTIMIZED "${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED} -O3" )
-endif()
-
 set(CMAKE_C_FLAGS_DEBUGOPTIMIZED ${CMAKE_C_FLAGS_DEBUGOPTIMIZED} CACHE STRING
     "Flags used by the compiler during DebugOptimized builds")
 set(CMAKE_CXX_FLAGS_DEBUGOPTIMIZED ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED}  CACHE STRING
@@ -977,7 +636,7 @@ endif()
 
 option ( WALBERLA_THREAD_SAFE_LOGGING "Enables/Disables thread-safe logging" ON )
 
-if ( WALBERLA_BUILD_WITH_OPENMP )
+if ( WALBERLA_BUILD_WITH_OPENMP AND NOT OpenMP_FOUND )
     if( APPLE AND EXISTS /opt/local/lib/libomp AND EXISTS /opt/local/include/libomp ) # find libomp from MacPorts
         set( CMAKE_FRAMEWORK_PATH /opt/local/lib/libomp )
         set( CMAKE_INCLUDE_PATH /opt/local/include/libomp )
@@ -991,30 +650,7 @@ if ( WALBERLA_BUILD_WITH_OPENMP )
             include_directories( ${OpenMP_CXX_INCLUDE_DIRS} )
         endif()
     else()
-        #workarounds
-        if ( WALBERLA_CXX_COMPILER_IS_NEC )
-            message( STATUS "Enabling OpenMP workaround for NEC")
-            add_flag ( CMAKE_C_FLAGS   "-Popenmp" )
-            add_flag ( CMAKE_CXX_FLAGS "-Popenmp" )
-        else()
-            message(FATAL_ERROR "Could NOT enable OpenMP")
-        endif()
-    endif()
-
-    if( WALBERLA_CXX_COMPILER_IS_CLANG OR WALBERLA_CXX_COMPILER_IS_INTELLLVM )
-       # check for bug in combination with OpenMP and sign conversion https://bugs.llvm.org/show_bug.cgi?id=48387
-       try_compile( WALBERLA_CLANG_OPENMP_BUG "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestClangOpenMPBug.cpp"
-             COMPILE_DEFINITIONS -Werror )
-       if( NOT ${WALBERLA_CLANG_OPENMP_BUG} )
-          message( WARNING "Setting -Wno-sign-conversion due to a compiler bug in LLVM (https://bugs.llvm.org/show_bug.cgi?id=48387)" )
-          add_flag( CMAKE_CXX_FLAGS "-Wno-sign-conversion" )
-       endif()
-    endif()
-
-else()
-    if ( WALBERLA_CXX_COMPILER_IS_CRAY )
-        add_flag ( CMAKE_C_FLAGS   "-h noomp" )
-        add_flag ( CMAKE_CXX_FLAGS "-h noomp" )
+         message(FATAL_ERROR "Could NOT enable OpenMP")
     endif()
 endif()
 ############################################################################################################################
@@ -1059,11 +695,6 @@ if ( WALBERLA_BUILD_WITH_CUDA )
     endif ( )
 endif ( )
 
-# old nvcc compilers and newer stdlibc++ are incompatible. This needs to be checked!
-if (WALBERLA_STL_BOUNDS_CHECKS AND WALBERLA_BUILD_WITH_CODEGEN AND WALBERLA_BUILD_WITH_CUDA AND CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "11.0" AND WALBERLA_CXX_COMPILER_IS_GNU AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0")
-    message(FATAL_ERROR "WALBERLA_STL_BOUNDS_CHECKS is not compatible with your CUDA compiler")
-endif()
-
 if (WALBERLA_BUILD_WITH_CUDA AND (CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "11.0" OR CMAKE_VERSION VERSION_LESS 3.18.0))
     # CUDA < 11 does not support C++17. std::experimental::any works with C++14, unlike std::any.
     set(CMAKE_CUDA_STANDARD 14)
@@ -1112,35 +743,6 @@ endif ( )
 
 
 
-############################################################################################################################
-##
-##  Testing Coverage
-##
-############################################################################################################################
-if (WALBERLA_BUILD_WITH_GCOV AND CMAKE_COMPILER_IS_GNUCXX  )
-    add_flag ( CMAKE_CXX_FLAGS "--coverage" )
-endif()
-############################################################################################################################
-
-
-
-############################################################################################################################
-##
-##  Profiling with gprof
-##
-############################################################################################################################
-
-if ( WALBERLA_BUILD_WITH_GPROF )
-    if ( WALBERLA_CXX_COMPILER_IS_INTEL )
-        add_flag ( CMAKE_CXX_FLAGS        "-pg" )
-        add_flag ( CMAKE_EXE_LINKER_FLAGS "-pg" )
-    elseif ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
-        add_flag ( CMAKE_CXX_FLAGS        "-pg" )
-    endif()
-endif()
-############################################################################################################################
-
-
 ############################################################################################################################
 ##
 ##  Likwid Marker API
@@ -1148,24 +750,15 @@ endif()
 ############################################################################################################################
 
 
-if ( WALBERLA_BUILD_WITH_LIKWID_MARKERS )
+if ( WALBERLA_BUILD_WITH_LIKWID_MARKERS AND NOT LIKWID_FOUND )
     find_library( LIKWID_LIB likwid HINTS $ENV{LIKWID_LIBDIR} $ENV{LIKWID_ROOT}/lib )
     find_path( LIKWID_INCLUDE_DIR likwid.h HINTS $ENV{LIKWID_INCDIR} $ENV{LIKWID_ROOT}/include )
 
-    # For some reason, these turned out to be necessary when building with likwid on Fugaku
-    if ( WALBERLA_CXX_COMPILER_IS_FUJITSUCLANG )
-        find_library( LIKWIDLUA_LIB NAMES likwid-lua HINTS $ENV{LIKWID_LIBDIR} $ENV{LIKWID_ROOT}/lib )
-        find_library( LIKWIDHWLOC_LIB NAMES likwid-hwloc HINTS $ENV{LIKWID_LIBDIR} $ENV{LIKWID_ROOT}/lib )
-    endif()
-
     if ( LIKWID_LIB AND LIKWID_INCLUDE_DIR)
         set( LIKWID_FOUND 1)
         include_directories( ${LIKWID_INCLUDE_DIR})
         add_definitions ( "-DLIKWID_PERFMON" )
         list ( APPEND SERVICE_LIBS ${LIKWID_LIB} )
-        if( WALBERLA_CXX_COMPILER_IS_FUJITSUCLANG )
-            list ( APPEND SERVICE_LIBS ${LIKWIDLUA_LIB} ${LIKWIDHWLOC_LIB} )
-        endif()
     else()
         message(WARNING "likwid marker library not found. Set environment variable LIKWID_ROOT")
         set ( WALBERLA_BUILD_WITH_LIKWID_MARKERS OFF CACHE BOOL "Compile in markers for likwid-perfctr" FORCE )
@@ -1192,38 +785,15 @@ endif ( )
 
 ############################################################################################################################
 ##
-##  Some more compiler flags that need to happen after any try_compile (e.g. inside FindMPI)
+##  Some more compiler flags that need to happen after any try_compile (e.g. inside FindMPI) (not sure if still true)
 ##
 ############################################################################################################################
 
 # Treat warnings as errors
 if ( WARNING_ERROR )
-   if( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL OR WALBERLA_CXX_COMPILER_IS_CLANG )
-      add_flag ( CMAKE_CXX_FLAGS "-pedantic-errors -Werror" )
-   elseif( WALBERLA_CXX_COMPILER_IS_MSVC )
-      add_flag ( CMAKE_CXX_FLAGS "/WX" )
-   elseif ( WALBERLA_CXX_COMPILER_IS_CRAY )
-      add_flag ( CMAKE_CXX_FLAGS "-h error_on_warning" )
-   endif()
+   set (CMAKE_COMPILE_WARNING_AS_ERROR ON)
 endif ( )
 
-############################################################################################################################
-##
-##  Sanitizer
-##
-############################################################################################################################
-if ( WALBERLA_SANITIZE_ADDRESS )
-    if ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
-        add_flag( CMAKE_CXX_FLAGS "-fsanitize=address")
-    endif()
-endif()
-
-if ( WALBERLA_SANITIZE_UNDEFINED )
-    if ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
-        add_flag( CMAKE_CXX_FLAGS "-fsanitize=undefined")
-    endif()
-endif()
-
 ############################################################################################################################
 ##
 ##  Half precision
@@ -1285,33 +855,6 @@ endif()
 
 
 
-
-############################################################################################################################
-#
-# Fix compiler bugs
-#
-############################################################################################################################
-
-# The NEC SX has a few issues in its standard library headers
-if( WALBERLA_CXX_COMPILER_IS_NEC )
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/math.h         "#include_next <math.h>\n#undef fpclassify\n#undef signbit\n#undef isfinite\n#undef isinf\n#undef isnan\n#undef isnormal\n#undef isgreater\n#undef isgreaterequal\n#undef isless\n#undef islessequal\n#undef islessgreater\n#undef isunordered\n")
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/types.h    "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/types.h\"   \n#undef uint_t\n")
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/acl.h      "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/acl.h\"     \n#undef uint_t\n")
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/if_ehcpl.h "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/if_ehcpl.h\"\n#undef uint_t\n")
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/ptms.h     "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/ptms.h\"    \n#undef uint_t\n")
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/stream.h   "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/stream.h\"  \n#undef uint_t\n")
-   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/strsubr.h  "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/strsubr.h\" \n#undef uint_t\n")
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/math.h         ${walberla_BINARY_DIR}/src/math.h COPYONLY )
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/types.h    ${walberla_BINARY_DIR}/src/sys/types.h    COPYONLY )
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/acl.h      ${walberla_BINARY_DIR}/src/sys/acl.h      COPYONLY )
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/if_ehcpl.h ${walberla_BINARY_DIR}/src/sys/if_ehcpl.h COPYONLY )
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/ptms.h     ${walberla_BINARY_DIR}/src/sys/ptms.h     COPYONLY )
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/stream.h   ${walberla_BINARY_DIR}/src/sys/stream.h   COPYONLY )
-   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/strsubr.h  ${walberla_BINARY_DIR}/src/sys/strsubr.h  COPYONLY )
-endif()
-
-
-
 ############################################################################################################################
 #
 # Subdirectories
@@ -1355,4 +898,4 @@ waLBerla_export()
 ############################################################################################################################
 
 waLBerla_link_files_to_builddir( .clang-tidy )
-add_subdirectory( utilities )
+add_subdirectory( utilities )
\ No newline at end of file
diff --git a/cmake/TestStdFilesystem.cpp b/cmake/TestStdFilesystem.cpp
deleted file mode 100644
index 1caf5057db6c1253635b8810e2a7792bd56d249f..0000000000000000000000000000000000000000
--- a/cmake/TestStdFilesystem.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <iostream>
-#if defined(WALBERLA_USE_STD_FILESYSTEM)
-#include <filesystem>
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM)
-#include <experimental/filesystem>
-#endif
-
-int main() {
-#if defined(WALBERLA_USE_STD_FILESYSTEM)
-   std::filesystem::path p("/tmp/test.txt");
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM)
-   std::experimental::filesystem::path p("/tmp/test.txt");
-#endif
-   std::cout << p.extension().string() << std::endl;
-   return 0;
-}
diff --git a/cmake/compileroptions/Clang.cmake b/cmake/compileroptions/Clang.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..d45f2c0353f1ac0f8a42de0363f31f539c8cdf7c
--- /dev/null
+++ b/cmake/compileroptions/Clang.cmake
@@ -0,0 +1,108 @@
+message(STATUS "Setting Clang specific compiler options")
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
+   set(_apple_clang_minimal_version 11.0.0)
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_apple_clang_minimal_version})
+    message(FATAL_ERROR "Clang version must be at least ${_apple_clang_minimal_version}!")
+  endif()
+else()
+  set(_clang_minimal_version 7)
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_clang_minimal_version})
+    message(FATAL_ERROR "Clang version must be at least ${_clang_minimal_version}!")
+  endif()
+endif()
+
+if(WALBERLA_OPTIMIZE_FOR_LOCALHOST)
+
+  if((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID
+                                                     STREQUAL "Clang")
+     AND CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64")
+    # no -march=native available on this compiler, but there is currently only
+    # one such processor
+  else()
+    add_flag(CMAKE_CXX_FLAGS "-march=native")
+    add_flag(CMAKE_C_FLAGS "-march=native")
+  endif()
+
+  if(EXISTS "/proc/sys/abi/sve_default_vector_length")
+    file(READ "/proc/sys/abi/sve_default_vector_length" SVE_LENGTH_BYTES)
+    string(STRIP "${SVE_LENGTH_BYTES}" SVE_LENGTH_BYTES)
+    math(EXPR SVE_LENGTH "${SVE_LENGTH_BYTES} * 8")
+    add_flag(CMAKE_CXX_FLAGS "-msve-vector-bits=${SVE_LENGTH}")
+    add_flag(CMAKE_C_FLAGS "-msve-vector-bits=${SVE_LENGTH}")
+  endif()
+endif()
+
+if(NOT WARNING_DEPRECATED)
+  add_flag(CMAKE_CXX_FLAGS "-Wno-deprecated-declarations")
+endif()
+
+add_flag(CMAKE_CXX_FLAGS
+         "-Wall -Wconversion -Wshadow -Wno-c++11-extensions -Qunused-arguments")
+
+if(WALBERLA_STL_BOUNDS_CHECKS)
+  add_definitions("-D_GLIBCXX_DEBUG")
+  add_definitions("-D_LIBCPP_DEBUG=1")
+endif()
+
+if(WALBERLA_BUILD_WITH_FASTMATH)
+  add_flag(CMAKE_CXX_FLAGS "-ffast-math")
+endif()
+
+if(NOT WIN32)
+  find_package(Backtrace QUIET)
+  if(Backtrace_FOUND)
+    list(APPEND SERVICE_LIBS ${Backtrace_LIBRARIES})
+    set(WALBERLA_BUILD_WITH_BACKTRACE ON)
+    set(WALBERLA_BACKTRACE_HEADER ${Backtrace_HEADER})
+  endif(Backtrace_FOUND)
+endif()
+
+set(CMAKE_C_FLAGS_DEBUGOPTIMIZED "${CMAKE_C_FLAGS_DEBUGOPTIMIZED} -O3")
+set(CMAKE_CXX_FLAGS_DEBUGOPTIMIZED "${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED} -O3")
+
+if(WALBERLA_BUILD_WITH_GPROF)
+  add_flag(CMAKE_CXX_FLAGS "-pg")
+endif()
+
+if(WALBERLA_SANITIZE_ADDRESS)
+  add_flag(CMAKE_CXX_FLAGS "-fsanitize=address")
+endif()
+
+if(WALBERLA_SANITIZE_UNDEFINED)
+  add_flag(CMAKE_CXX_FLAGS "-fsanitize=undefined")
+endif()
+
+if(WALBERLA_BUILD_WITH_OPENMP)
+  if(APPLE
+     AND EXISTS /opt/local/lib/libomp
+     AND EXISTS /opt/local/include/libomp) # find libomp from MacPorts
+    set(CMAKE_FRAMEWORK_PATH /opt/local/lib/libomp)
+    set(CMAKE_INCLUDE_PATH /opt/local/include/libomp)
+  endif()
+  find_package(OpenMP)
+  if(OpenMP_FOUND)
+    add_flag(CMAKE_C_FLAGS "${OpenMP_C_FLAGS}")
+    add_flag(CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS}")
+    list(APPEND SERVICE_LIBS ${OpenMP_CXX_LIBRARIES})
+    if(OpenMP_CXX_INCLUDE_DIRS)
+      include_directories(${OpenMP_CXX_INCLUDE_DIRS})
+    endif()
+  else()
+    message(FATAL_ERROR "Could NOT enable OpenMP")
+  endif()
+
+  # check for bug in combination with OpenMP and sign conversion
+  # https://bugs.llvm.org/show_bug.cgi?id=48387
+  try_compile(
+    WALBERLA_CLANG_OPENMP_BUG "${CMAKE_CURRENT_BINARY_DIR}"
+    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestClangOpenMPBug.cpp"
+    COMPILE_DEFINITIONS -Werror)
+  if(NOT ${WALBERLA_CLANG_OPENMP_BUG})
+    message(
+      WARNING
+        "Setting -Wno-sign-conversion due to a compiler bug in LLVM (https://bugs.llvm.org/show_bug.cgi?id=48387)"
+    )
+    add_flag(CMAKE_CXX_FLAGS "-Wno-sign-conversion")
+  endif()
+endif()
\ No newline at end of file
diff --git a/cmake/compileroptions/Cray.cmake b/cmake/compileroptions/Cray.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..c8476f64d8f254b9342341d3b1e60a964c873c95
--- /dev/null
+++ b/cmake/compileroptions/Cray.cmake
@@ -0,0 +1,31 @@
+message(STATUS "Setting Cray specific compiler options")
+
+set(_cray_minimal_version 9)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_cray_minimal_version})
+   message(FATAL_ERROR "Cray version must be at least ${_cray_minimal_version}!")
+endif()
+
+# Fixes linker errors with Cray compiler
+add_flag(CMAKE_EXE_LINKER_FLAGS "-dynamic -L/opt/gcc/4.9.3/snos/lib64")
+
+# Silences compiler and linker warnings and information with the Cray compiler
+set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
+add_flag(CMAKE_CXX_FLAGS "-h nomessage=1") # CC-1    The source file does not
+                                           # end with a new-line character.
+add_flag(CMAKE_C_FLAGS "-DSQLITE_HAVE_ISNAN") # SQLite will not work correctly
+                                              # with the -ffast-math option of
+                                              # GCC.
+add_flag(CMAKE_CXX_FLAGS "-DSQLITE_HAVE_ISNAN") # SQLite will not work correctly
+                                                # with the -ffast-math option of
+                                                # GCC.
+
+if(NOT WALBERLA_BUILD_WITH_OPENMP)
+  add_flag(CMAKE_C_FLAGS "-h noomp")
+  add_flag(CMAKE_CXX_FLAGS "-h noomp")
+endif()
+
+# Treat warnings as errors leaving it since it is not supported by
+# COMPILE_WARNING_AS_ERROR (cmake 3.24)
+if(WARNING_ERROR)
+  add_flag(CMAKE_CXX_FLAGS "-h error_on_warning")
+endif()
diff --git a/cmake/compileroptions/FujitsuClang.cmake b/cmake/compileroptions/FujitsuClang.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..feb790871d52fa317c87e59a174beff9d39d4bc5
--- /dev/null
+++ b/cmake/compileroptions/FujitsuClang.cmake
@@ -0,0 +1,45 @@
+message(STATUS "Setting FujitsuClang specific compiler options")
+
+set(_clang_minimal_version 7)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_clang_minimal_version})
+ message(FATAL_ERROR "Clang version must be at least ${_clang_minimal_version}!")
+endif()
+
+add_flag(CMAKE_CXX_FLAGS
+         "-Wall -Wconversion -Wshadow -Wno-c++11-extensions -Qunused-arguments")
+
+set(CMAKE_C_FLAGS_DEBUGOPTIMIZED "${CMAKE_C_FLAGS_DEBUGOPTIMIZED} -O3")
+set(CMAKE_CXX_FLAGS_DEBUGOPTIMIZED "${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED} -O3")
+
+if(WALBERLA_BUILD_WITH_LIKWID_MARKERS)
+  find_library(LIKWID_LIB likwid HINTS $ENV{LIKWID_LIBDIR}
+                                       $ENV{LIKWID_ROOT}/lib)
+  find_path(LIKWID_INCLUDE_DIR likwid.h HINTS $ENV{LIKWID_INCDIR}
+                                              $ENV{LIKWID_ROOT}/include)
+
+  # For some reason, these turned out to be necessary when building with likwid
+  # on Fugaku
+  find_library(
+    LIKWIDLUA_LIB
+    NAMES likwid-lua
+    HINTS $ENV{LIKWID_LIBDIR} $ENV{LIKWID_ROOT}/lib)
+  find_library(
+    LIKWIDHWLOC_LIB
+    NAMES likwid-hwloc
+    HINTS $ENV{LIKWID_LIBDIR} $ENV{LIKWID_ROOT}/lib)
+
+  if(LIKWID_LIB AND LIKWID_INCLUDE_DIR)
+    set(LIKWID_FOUND 1)
+    include_directories(${LIKWID_INCLUDE_DIR})
+    add_definitions("-DLIKWID_PERFMON")
+    list(APPEND SERVICE_LIBS ${LIKWID_LIB})
+    list(APPEND SERVICE_LIBS ${LIKWIDLUA_LIB} ${LIKWIDHWLOC_LIB})
+  else()
+    message(
+      WARNING
+        "likwid marker library not found. Set environment variable LIKWID_ROOT")
+    set(WALBERLA_BUILD_WITH_LIKWID_MARKERS
+        OFF
+        CACHE BOOL "Compile in markers for likwid-perfctr" FORCE)
+  endif()
+endif()
\ No newline at end of file
diff --git a/cmake/compileroptions/GNU.cmake b/cmake/compileroptions/GNU.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..1e1e81b690f7fb4508b3770cb17aec7dbe2b3faf
--- /dev/null
+++ b/cmake/compileroptions/GNU.cmake
@@ -0,0 +1,110 @@
+message(STATUS "Setting GNU specific compiler options")
+
+set(_gcc_minimal_version 8)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_gcc_minimal_version})
+  message(FATAL_ERROR "GCC version must be at least ${_gcc_minimal_version}!")
+endif()
+
+# Profile guided optimization
+if(WALBERLA_PROFILE_GENERATE)
+  add_flag(CMAKE_CXX_FLAGS "-fprofile-generate")
+endif()
+if(WALBERLA_PROFILE_USE)
+  add_flag(CMAKE_CXX_FLAGS "-fprofile-use")
+endif()
+
+# common flags for g++
+if(NOT WARNING_DISABLE)
+  add_flag(CMAKE_CXX_FLAGS "-Wall -Wconversion -Wshadow")
+endif()
+
+# architecture optimization
+if(WALBERLA_OPTIMIZE_FOR_LOCALHOST)
+  add_flag(CMAKE_CXX_FLAGS "-march=native")
+endif()
+
+if(EXISTS "/proc/sys/abi/sve_default_vector_length")
+  file(READ "/proc/sys/abi/sve_default_vector_length" SVE_LENGTH_BYTES)
+  string(STRIP "${SVE_LENGTH_BYTES}" SVE_LENGTH_BYTES)
+  math(EXPR SVE_LENGTH "${SVE_LENGTH_BYTES} * 8")
+  add_flag(CMAKE_CXX_FLAGS "-msve-vector-bits=${SVE_LENGTH}")
+  add_flag(CMAKE_C_FLAGS "-msve-vector-bits=${SVE_LENGTH}")
+endif()
+
+# Warning flags
+add_flag(CMAKE_CXX_FLAGS "-Wfloat-equal -Wextra")
+
+if(WARNING_PEDANTIC)
+  add_flag(CMAKE_CXX_FLAGS "-pedantic")
+endif()
+
+# omit deprecated warnings
+if(NOT WARNING_DEPRECATED)
+  add_flag(CMAKE_CXX_FLAGS "-Wno-deprecated-declarations")
+endif()
+
+if(WALBERLA_STL_BOUNDS_CHECKS)
+  add_definitions("-D_GLIBCXX_DEBUG")
+  add_definitions("-D_LIBCPP_DEBUG=1")
+endif()
+
+if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0")
+  # Omit maybe-uninitialized for gcc 12 for now. Check if it is a bug or a real
+  # problem:
+  add_flag(CMAKE_CXX_FLAGS "-Wno-maybe-uninitialized")
+  # GCC 12 reports a "array bounds" warning at UniformBufferedScheme.h:297
+  # (error: array subscript 26 is above array bounds of) when e.g. compiling the
+  # GhostLayerCommTest. Since this is most probably a bug in GCC disable the
+  # warning for now
+  add_flag(CMAKE_CXX_FLAGS "-Wno-array-bounds")
+endif()
+
+if(WALBERLA_BUILD_WITH_FASTMATH)
+  add_flag(CMAKE_CXX_FLAGS "-ffast-math")
+endif()
+
+if(NOT WIN32)
+  find_package(Backtrace QUIET)
+  if(Backtrace_FOUND)
+    list(APPEND SERVICE_LIBS ${Backtrace_LIBRARIES})
+    set(WALBERLA_BUILD_WITH_BACKTRACE ON)
+    set(WALBERLA_BACKTRACE_HEADER ${Backtrace_HEADER})
+  endif(Backtrace_FOUND)
+endif()
+
+set(CMAKE_C_FLAGS_DEBUGOPTIMIZED "${CMAKE_C_FLAGS_DEBUGOPTIMIZED} -O3")
+set(CMAKE_CXX_FLAGS_DEBUGOPTIMIZED "${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED} -O3")
+
+# old nvcc compilers and newer stdlibc++ are incompatible. This needs to be
+# checked!
+if(WALBERLA_STL_BOUNDS_CHECKS
+   AND WALBERLA_BUILD_WITH_CODEGEN
+   AND WALBERLA_BUILD_WITH_CUDA
+   AND CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "11.0"
+   AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0")
+  message(
+    FATAL_ERROR
+      "WALBERLA_STL_BOUNDS_CHECKS is not compatible with your CUDA compiler")
+endif()
+
+if(WALBERLA_BUILD_WITH_GPROF)
+  add_flag(CMAKE_CXX_FLAGS "-pg")
+endif()
+
+if(WALBERLA_SANITIZE_ADDRESS)
+  add_flag(CMAKE_CXX_FLAGS "-fsanitize=address")
+endif()
+
+if(WALBERLA_SANITIZE_UNDEFINED)
+  add_flag(CMAKE_CXX_FLAGS "-fsanitize=undefined")
+endif()
+
+# ##############################################################################
+#
+# Testing Coverage
+#
+# ##############################################################################
+if(WALBERLA_BUILD_WITH_GCOV AND CMAKE_COMPILER_IS_GNUCXX)
+  add_flag(CMAKE_CXX_FLAGS "--coverage")
+endif()
+# ##############################################################################
\ No newline at end of file
diff --git a/cmake/compileroptions/IBM.cmake b/cmake/compileroptions/IBM.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6c475c84f9cf1e453b3d6767c5ee660d56cd9a9c
--- /dev/null
+++ b/cmake/compileroptions/IBM.cmake
@@ -0,0 +1,30 @@
+message(STATUS "Setting IBM specific compiler options")
+
+set(_ibm_minimal_version 17.1.1)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_ibm_minimal_version})
+  message(FATAL_ERROR "IBM compiler version must be at least ${_ibm_minimal_version}!")
+endif()
+
+# Fixes linker errors with IBM compiler
+add_flag(CMAKE_CXX_FLAGS "-qpic=large")
+
+# Silences compiler and linker warnings and information with the IBM compiler
+add_flag(CMAKE_CXX_FLAGS "-qsuppress=1586-267") # 1586-267 (I) Inlining of
+                                                # specified subprogram failed
+                                                # due to the presence of a C++
+                                                # exception handler
+add_flag(CMAKE_CXX_FLAGS "-qsuppress=1586-266") # 1586-266 (I) Inlining of
+                                                # specified subprogram failed
+                                                # due to the presence of a
+                                                # global label
+add_flag(CMAKE_CXX_FLAGS "-qsuppress=1500-030") # 1500-030: (I) INFORMATION:
+                                                # [...] Additional optimization
+                                                # may be attained by recompiling
+                                                # and specifying MAXMEM option
+                                                # with a value greater than
+                                                # 8192.
+add_flag(CMAKE_C_FLAGS "-qsuppress=1500-030") # 1500-030: (I) INFORMATION: [...]
+                                              # Additional optimization may be
+                                              # attained by recompiling and
+                                              # specifying MAXMEM option with a
+                                              # value greater than 8192.
\ No newline at end of file
diff --git a/cmake/compileroptions/Intel.cmake b/cmake/compileroptions/Intel.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b70664a0521b03484ad4267f85b22022873e7b3f
--- /dev/null
+++ b/cmake/compileroptions/Intel.cmake
@@ -0,0 +1,80 @@
+message(STATUS "Setting Intel specific compiler options")
+
+set(_intel_minimal_version 19.0.0)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_intel_minimal_version})
+  message(FATAL_ERROR "IBM compiler version must be at least ${_intel_minimal_version}!")
+endif()
+
+if(WALBERLA_PROFILE_GENERATE)
+  add_flag(CMAKE_CXX_FLAGS "-prof-gen")
+  file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/profile")
+  add_flag(CMAKE_CXX_FLAGS "-prof-dir${CMAKE_BINARY_DIR}/profile")
+endif()
+
+if(WALBERLA_PROFILE_USE)
+  add_flag(CMAKE_CXX_FLAGS "-prof-use")
+  add_flag(CMAKE_CXX_FLAGS "-prof-dir${CMAKE_BINARY_DIR}/profile")
+endif()
+
+# common flags for intel and g++
+if(NOT WARNING_DISABLE)
+  add_flag(CMAKE_CXX_FLAGS "-Wall -Wconversion -Wshadow")
+endif()
+
+# architecture optimization
+if(WALBERLA_OPTIMIZE_FOR_LOCALHOST)
+  add_flag(CMAKE_CXX_FLAGS "-march=native")
+  add_flag(CMAKE_C_FLAGS "-march=native")
+
+  add_flag(CMAKE_CXX_FLAGS "-xhost")
+  add_flag(CMAKE_C_FLAGS "-xhost")
+
+  if(EXISTS "/proc/sys/abi/sve_default_vector_length")
+    file(READ "/proc/sys/abi/sve_default_vector_length" SVE_LENGTH_BYTES)
+    string(STRIP "${SVE_LENGTH_BYTES}" SVE_LENGTH_BYTES)
+    math(EXPR SVE_LENGTH "${SVE_LENGTH_BYTES} * 8")
+    add_flag(CMAKE_CXX_FLAGS "-msve-vector-bits=${SVE_LENGTH}")
+    add_flag(CMAKE_C_FLAGS "-msve-vector-bits=${SVE_LENGTH}")
+  endif()
+endif()
+
+# system headers are also supported by intel, but cmake does not recognize that
+set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
+add_flag(CMAKE_CXX_FLAGS "-wd2928,2504,2259,1682,597")
+# disable icc/icpc deprecation warning
+add_flag(CMAKE_CXX_FLAGS "-diag-disable=10441")
+
+# omit deprecated warnings
+if(NOT WARNING_DEPRECATED)
+  add_flag(CMAKE_CXX_FLAGS "-wd1478") # Disable compiler warning # 1478:
+                                      # "declared as deprecated"
+endif()
+
+if(WALBERLA_STL_BOUNDS_CHECKS)
+  add_definitions("-D_GLIBCXX_DEBUG")
+  add_definitions("-D_LIBCPP_DEBUG=1")
+endif()
+
+if(WALBERLA_BUILD_WITH_FASTMATH)
+  add_flag(CMAKE_CXX_FLAGS "-fp-model fast=2 -no-prec-sqrt -no-prec-div")
+endif()
+
+if(NOT WIN32)
+  find_package(Backtrace QUIET)
+  if(Backtrace_FOUND)
+    list(APPEND SERVICE_LIBS ${Backtrace_LIBRARIES})
+    set(WALBERLA_BUILD_WITH_BACKTRACE ON)
+    set(WALBERLA_BACKTRACE_HEADER ${Backtrace_HEADER})
+  endif(Backtrace_FOUND)
+endif()
+
+set(CMAKE_C_FLAGS_DEBUGOPTIMIZED "${CMAKE_C_FLAGS_DEBUGOPTIMIZED} -O3")
+set(CMAKE_CXX_FLAGS_DEBUGOPTIMIZED "${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED} -O3")
+
+if(WALBERLA_BUILD_WITH_GPROF)
+  add_flag(CMAKE_CXX_FLAGS "-pg")
+  add_flag(CMAKE_EXE_LINKER_FLAGS "-pg")
+endif()
+
+# Intel C++17 support introduced in 2.6.2 (https://github.com/pybind/pybind11/pull/2729)
+set(PYBIND11_MINIMUM_VERSION "2.6.2")
\ No newline at end of file
diff --git a/cmake/compileroptions/IntelLLVM.cmake b/cmake/compileroptions/IntelLLVM.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..03d41f83dd8811f86143b7ff50912ef9d1d2cc8f
--- /dev/null
+++ b/cmake/compileroptions/IntelLLVM.cmake
@@ -0,0 +1,48 @@
+message(STATUS "Setting IntelLLVM specific compiler options")
+
+set(_intel_llvm_minimal_version 2021.0)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_intel_llvm_minimal_version})
+  message(FATAL_ERROR "IBM compiler version must be at least ${_intel_llvm_minimal_version}!")
+endif()
+
+# fastmath
+if(NOT WALBERLA_BUILD_WITH_FASTMATH)
+  add_flag(CMAKE_CXX_FLAGS "-fp-model=precise")
+endif()
+
+set(CMAKE_C_FLAGS_DEBUGOPTIMIZED "${CMAKE_C_FLAGS_DEBUGOPTIMIZED} -O3")
+set(CMAKE_CXX_FLAGS_DEBUGOPTIMIZED "${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED} -O3")
+
+if(WALBERLA_BUILD_WITH_OPENMP)
+  if(APPLE
+     AND EXISTS /opt/local/lib/libomp
+     AND EXISTS /opt/local/include/libomp) # find libomp from MacPorts
+    set(CMAKE_FRAMEWORK_PATH /opt/local/lib/libomp)
+    set(CMAKE_INCLUDE_PATH /opt/local/include/libomp)
+  endif()
+  find_package(OpenMP)
+  if(OpenMP_FOUND)
+    add_flag(CMAKE_C_FLAGS "${OpenMP_C_FLAGS}")
+    add_flag(CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS}")
+    list(APPEND SERVICE_LIBS ${OpenMP_CXX_LIBRARIES})
+    if(OpenMP_CXX_INCLUDE_DIRS)
+      include_directories(${OpenMP_CXX_INCLUDE_DIRS})
+    endif()
+  else()
+    message(FATAL_ERROR "Could NOT enable OpenMP")
+  endif()
+
+  # check for bug in combination with OpenMP and sign conversion
+  # https://bugs.llvm.org/show_bug.cgi?id=48387
+  try_compile(
+    WALBERLA_CLANG_OPENMP_BUG "${CMAKE_CURRENT_BINARY_DIR}"
+    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestClangOpenMPBug.cpp"
+    COMPILE_DEFINITIONS -Werror)
+  if(NOT ${WALBERLA_CLANG_OPENMP_BUG})
+    message(
+      WARNING
+        "Setting -Wno-sign-conversion due to a compiler bug in LLVM (https://bugs.llvm.org/show_bug.cgi?id=48387)"
+    )
+    add_flag(CMAKE_CXX_FLAGS "-Wno-sign-conversion")
+  endif()
+endif()
\ No newline at end of file
diff --git a/cmake/compileroptions/MSVC.cmake b/cmake/compileroptions/MSVC.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..bbf7de29598edbb63e7e7aa6894230bc8487e033
--- /dev/null
+++ b/cmake/compileroptions/MSVC.cmake
@@ -0,0 +1,85 @@
+message(STATUS "Setting MSVC specific compiler options")
+
+set(_msvc_minimal_version 19.11)
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_msvc_minimal_version})
+  message(FATAL_ERROR "MSVC version must be at least ${_msvc_minimal_version}!")
+endif()
+
+if(WALBERLA_PROFILE_GENERATE)
+  add_flag(CMAKE_CXX_FLAGS "/GL")
+  add_flag(CMAKE_MODULE_LINKER_FLAGS "/LTCG:PGINSTRUMENT")
+  add_flag(CMAKE_SHARED_LINKER_FLAGS "/LTCG:PGINSTRUMENT")
+  add_flag(CMAKE_EXE_LINKER_FLAGS "/LTCG:PGINSTRUMENT")
+endif()
+
+if(WALBERLA_PROFILE_USE)
+  add_flag(CMAKE_CXX_FLAGS "/GL")
+  add_flag(CMAKE_MODULE_LINKER_FLAGS "/LTCG:PGOPTIMIZE")
+  add_flag(CMAKE_SHARED_LINKER_FLAGS "/LTCG:PGOPTIMIZE")
+  add_flag(CMAKE_EXE_LINKER_FLAGS "/LTCG:PGOPTIMIZE")
+endif()
+
+if(WALBERLA_BUILD_WITH_FASTMATH)
+  add_flag(CMAKE_CXX_FLAGS "/fp:fast")
+endif()
+
+string(REGEX REPLACE "[/-]W[0-4]" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}
+)# remove default warning flags
+
+option(WALBERLA_GROUP_PROJECTS
+       "Flag if the projects are grouped or in a flat hierarchy" ON)
+option(WALBERLA_GROUP_FILES
+       "Flag if the files are grouped or in a flat hierarchy" ON)
+set_property(GLOBAL PROPERTY USE_FOLDERS ${WALBERLA_GROUP_PROJECTS})
+
+option(WALBERLA_VS_MULTI_PROCESS_BUILD "Use the /mp option for VS builds" ON)
+if(WALBERLA_VS_MULTI_PROCESS_BUILD)
+  add_flag(CMAKE_CXX_FLAGS "-MP") # enable multi-threaded compiling
+endif()
+
+add_definitions("-DNOMINMAX") # Disable Min/Max-Macros
+add_definitions("-D_WIN32_WINNT=0x501") # Minimum Windows versions is Windows XP
+add_definitions("-DWINVER=0x501") # Minimum Windows versions is Windows XP
+add_definitions("-D_CRT_SECURE_NO_WARNINGS") # disable warnings promoting
+                                             # Microsoft's security enhanced CRT
+add_definitions("-D_SCL_SECURE_NO_WARNINGS") # disable warnings triggered by
+                                             # Microsoft's checked iterators
+add_flag(CMAKE_CXX_FLAGS "-W4") # set warning level to maximum
+add_flag(CMAKE_CXX_FLAGS "-bigobj") # enable big object files
+add_flag(CMAKE_CXX_FLAGS "-wd4127") # disable compiler warning C4127:
+                                    # "conditional expression is constant"
+add_flag(CMAKE_CXX_FLAGS "-wd4512") # disable compiler warning C4512:
+                                    # "assignment operator could not be
+                                    # generated"
+add_flag(CMAKE_CXX_FLAGS "-wd4913") # disable compiler warning C4512: "user
+                                    # defined binary operator ',' exists but
+# no overload could convert all operands, default built-in binary operator ','
+# used"
+add_flag(CMAKE_CXX_FLAGS "-wd4702") # disable compiler warning C4702:
+                                    # "unreachable code"
+add_flag(CMAKE_CXX_FLAGS "-wd4505") # disable compiler warning C4505:
+                                    # "unreferenced local function has been
+                                    # removed"
+add_flag(CMAKE_CXX_FLAGS "-wd4503") # disable compiler warning C4503:
+                                    # "'identifier' : decorated name length
+                                    # exceeded, name was truncated"
+
+if(NOT WARNING_DEPRECATED)
+  add_definitions("-D_CRT_SECURE_NO_DEPRECATE")
+  add_definitions("-D_SCL_SECURE_NO_DEPRECATE")
+  add_flag(CMAKE_CXX_FLAGS "-wd4996") # Disable compiler warning C4996:
+                                      # "declared as deprecated"
+endif()
+
+string(REPLACE "/Od" "/O2" CMAKE_C_FLAGS_DEBUGOPTIMIZED
+               ${CMAKE_C_FLAGS_DEBUGOPTIMIZED})
+string(REPLACE "/Ob0" "/Ob2" CMAKE_C_FLAGS_DEBUGOPTIMIZED
+               ${CMAKE_C_FLAGS_DEBUGOPTIMIZED})
+string(REPLACE "/RTC1" "" CMAKE_C_FLAGS_DEBUGOPTIMIZED
+               ${CMAKE_C_FLAGS_DEBUGOPTIMIZED})
+string(REPLACE "/Od" "/O2" CMAKE_CXX_FLAGS_DEBUGOPTIMIZED
+               ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED})
+string(REPLACE "/Ob0" "/Ob2" CMAKE_CXX_FLAGS_DEBUGOPTIMIZED
+               ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED})
+string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUGOPTIMIZED
+               ${CMAKE_CXX_FLAGS_DEBUGOPTIMIZED})
\ No newline at end of file
diff --git a/src/core/Filesystem.h b/src/core/Filesystem.h
index beaf77ad00e28335681dff0a85df599709a0f59d..bd3537242266d5747c6554fa89dc85bd6b187d54 100644
--- a/src/core/Filesystem.h
+++ b/src/core/Filesystem.h
@@ -23,23 +23,13 @@
 
 #include "waLBerlaDefinitions.h"
 
-#ifndef WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM
 #include <filesystem>
-#else
-#define _LIBCPP_NO_EXPERIMENTAL_DEPRECATION_WARNING_FILESYSTEM
-#include <experimental/filesystem>
-#endif
-
 
 
 namespace walberla {
 namespace filesystem {
 
-#ifndef WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM
 using namespace std::filesystem;
-#else
-using namespace std::experimental::filesystem;
-#endif
 
 }
-}
+}
\ No newline at end of file
diff --git a/src/lbm_mesapd_coupling/partially_saturated_cells_method/codegen/PSMWrapperKernels.cu b/src/lbm_mesapd_coupling/partially_saturated_cells_method/codegen/PSMWrapperKernels.cu
index 9aacf68d450bc8a6dbd2f8c5288f6116eaed2e0b..880eebf128f36fc21918f19ad32eea27565452af 100644
--- a/src/lbm_mesapd_coupling/partially_saturated_cells_method/codegen/PSMWrapperKernels.cu
+++ b/src/lbm_mesapd_coupling/partially_saturated_cells_method/codegen/PSMWrapperKernels.cu
@@ -47,13 +47,14 @@ __global__ void SetParticleVelocities(walberla::gpu::FieldAccessor< uint_t > nOv
    particleVelocitiesField.set(blockIdx_uint3, threadIdx_uint3);
 
    // Cell center is needed in order to compute the particle velocity at this WF point
-   const real_t cellCenter[] = { (blockStart.x + (threadIdx.x + 0.5) * dx), (blockStart.y + (blockIdx.x + 0.5) * dx),
-                                 (blockStart.z + (blockIdx.y + 0.5) * dx) };
+   const real_t cellCenter[] = { real_t(blockStart.x + (threadIdx.x + real_t(0.5)) * dx),
+                                 real_t(blockStart.y + (blockIdx.x + real_t(0.5)) * dx),
+                                 real_t(blockStart.z + (blockIdx.y + real_t(0.5)) * dx) };
 
    // Compute the particle velocity at the cell center for all overlapping particles
    for (uint_t p = 0; p < nOverlappingParticlesField.get(); p++)
    {
-      real_t particleVelocityAtWFPoint[] = { 0.0, 0.0, 0.0 };
+      real_t particleVelocityAtWFPoint[] = { real_t(0.0), real_t(0.0), real_t(0.0) };
       getVelocityAtWFPoint(particleVelocityAtWFPoint, &linearVelocities[idxField.get(p) * 3],
                            &angularVelocities[idxField.get(p) * 3], &positions[idxField.get(p) * 3], cellCenter);
       particleVelocitiesField.get(p * 3 + 0) = particleVelocityAtWFPoint[0];
@@ -78,8 +79,9 @@ __global__ void ReduceParticleForces(walberla::gpu::FieldAccessor< uint_t > nOve
    particleForcesField.set(blockIdx_uint3, threadIdx_uint3);
 
    // Cell center is needed in order to compute the particle velocity at this WF point
-   const real_t cellCenter[] = { (blockStart.x + (threadIdx.x + 0.5) * dx), (blockStart.y + (blockIdx.x + 0.5) * dx),
-                                 (blockStart.z + (blockIdx.y + 0.5) * dx) };
+   const real_t cellCenter[] = { real_t(blockStart.x + (threadIdx.x + real_t(0.5)) * dx),
+                                 real_t(blockStart.y + (blockIdx.x + real_t(0.5)) * dx),
+                                 real_t(blockStart.z + (blockIdx.y + real_t(0.5)) * dx) };
 
    // Reduce the forces for all overlapping particles
    for (uint_t p = 0; p < nOverlappingParticlesField.get(); p++)
@@ -98,4 +100,4 @@ __global__ void ReduceParticleForces(walberla::gpu::FieldAccessor< uint_t > nOve
 } // namespace gpu
 } // namespace psm
 } // namespace lbm_mesapd_coupling
-} // namespace walberla
+} // namespace walberla
\ No newline at end of file
diff --git a/src/waLBerlaDefinitions.in.h b/src/waLBerlaDefinitions.in.h
index 2eb38e021025c9767b9d6ea39e1961d5322f0731..eddebea1d7206c381977d276f76fe4295e6ede6a 100644
--- a/src/waLBerlaDefinitions.in.h
+++ b/src/waLBerlaDefinitions.in.h
@@ -53,7 +53,6 @@
 #cmakedefine WALBERLA_CXX_COMPILER_IS_MSVC
 #cmakedefine WALBERLA_CXX_COMPILER_IS_CLANG
 
-#cmakedefine WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM
 #cmakedefine WALBERLA_USE_STD_EXPERIMENTAL_ANY
 #cmakedefine WALBERLA_BUILD_WITH_BACKTRACE
 #ifdef WALBERLA_BUILD_WITH_BACKTRACE
@@ -112,4 +111,4 @@
    #define WALBERLA_PUBLIC
    #define WALBERLA_PRIVATE
 #endif
-#define WALBERLA_PROTECTED WALBERLA_PUBLIC
+#define WALBERLA_PROTECTED WALBERLA_PUBLIC
\ No newline at end of file