diff --git a/CMakeLists.txt b/CMakeLists.txt
index b7ae62b8bfaaf8928ef294ad46b80d58cc6ee31c..41bca41534aacb4901cee9cdfd4da411bce00c4f 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 )
 
@@ -193,6 +193,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 +202,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,6 +211,7 @@ 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()
@@ -217,6 +220,7 @@ 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  )
+    include(NEC)
 else()
     option ( WALBERLA_CXX_COMPILER_IS_NEC "Use NEC compiler" OFF  )
 endif()
@@ -224,6 +228,7 @@ 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,6 +237,7 @@ 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()
@@ -239,6 +245,7 @@ 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  )
+    include(PGI)
 else()
     option ( WALBERLA_CXX_COMPILER_IS_PGI "Use PGI compiler" OFF  )
 endif()
@@ -247,6 +254,7 @@ 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 +272,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 +288,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 +297,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 )
@@ -551,51 +360,6 @@ else()
    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 ( )
-############################################################################################################################
 
 ############################################################################################################################
 ##
@@ -730,24 +494,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 +666,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
@@ -1010,12 +740,6 @@ if ( WALBERLA_BUILD_WITH_OPENMP )
           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" )
-    endif()
 endif()
 ############################################################################################################################
 
@@ -1059,11 +783,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 +831,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
@@ -1192,38 +882,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 +952,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
diff --git a/cmake/compileroptions/Clang.cmake b/cmake/compileroptions/Clang.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..317ffe9c50377dd2afed350141cf7f51cc5c621a
--- /dev/null
+++ b/cmake/compileroptions/Clang.cmake
@@ -0,0 +1,57 @@
+message(STATUS "Setting Clang specific compiler options")
+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()
\ No newline at end of file
diff --git a/cmake/compileroptions/Cray.cmake b/cmake/compileroptions/Cray.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..54613d141710ca95e84b0dd5405a4dff44030020
--- /dev/null
+++ b/cmake/compileroptions/Cray.cmake
@@ -0,0 +1,27 @@
+message(STATUS "Setting Cray specific compiler options")
+
+# 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 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()
+
+
+if ( NOT WALBERLA_BUILD_WITH_OPENMP )
+    if ( WALBERLA_CXX_COMPILER_IS_CRAY )
+        add_flag ( CMAKE_C_FLAGS   "-h noomp" )
+        add_flag ( CMAKE_CXX_FLAGS "-h noomp" )
+    endif()
+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 ( )
\ No newline at end of file
diff --git a/cmake/compileroptions/FujitsuClang.cmake b/cmake/compileroptions/FujitsuClang.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..330fa0b5dea08932fa0d43dfbd4082b641c4cf4c
--- /dev/null
+++ b/cmake/compileroptions/FujitsuClang.cmake
@@ -0,0 +1,17 @@
+message(STATUS "Setting FujitsuClang specific compiler options")
+
+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 )
+
+   # 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)
+      list ( APPEND SERVICE_LIBS ${LIKWIDLUA_LIB} ${LIKWIDHWLOC_LIB} )
+   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..ff56c8826a095d2d5f0b219d086180ea687d4381
--- /dev/null
+++ b/cmake/compileroptions/GNU.cmake
@@ -0,0 +1,107 @@
+message(STATUS "Setting GNU specific compiler options")
+
+# 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()
+
+#GCC 5+ ABI selection
+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()
+
+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..1a1d1b64d54b2d4de9fb349dab6135e56633a11c
--- /dev/null
+++ b/cmake/compileroptions/IBM.cmake
@@ -0,0 +1,14 @@
+message(STATUS "Setting IBM specific compiler options")
+
+# Fixes linker errors with IBM compiler
+if( WALBERLA_CXX_COMPILER_IS_IBM )
+   add_flag ( CMAKE_CXX_FLAGS "-qpic=large" )
+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()
\ No newline at end of file
diff --git a/cmake/compileroptions/Intel.cmake b/cmake/compileroptions/Intel.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b47d31b49eb91dacea1224e17c048f1bb47f4fd0
--- /dev/null
+++ b/cmake/compileroptions/Intel.cmake
@@ -0,0 +1,72 @@
+message(STATUS "Setting Intel specific compiler options")
+
+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()
\ No newline at end of file
diff --git a/cmake/compileroptions/IntelLLVM.cmake b/cmake/compileroptions/IntelLLVM.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..32cec3b97719a1800080023dd61fdc5f08193271
--- /dev/null
+++ b/cmake/compileroptions/IntelLLVM.cmake
@@ -0,0 +1,9 @@
+message(STATUS "Setting IntelLLVM specific compiler options")
+
+#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" )
\ No newline at end of file
diff --git a/cmake/compileroptions/MSVC.cmake b/cmake/compileroptions/MSVC.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b6cdf4cab7fd86da397cd969a3ad292aef02c7a1
--- /dev/null
+++ b/cmake/compileroptions/MSVC.cmake
@@ -0,0 +1,62 @@
+message(STATUS "Setting MSVC specific compiler options")
+
+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()
+
+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( 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 ( )
+
+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})
diff --git a/cmake/compileroptions/NEC.cmake b/cmake/compileroptions/NEC.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..05ae8cccb5b00e4fcb71e9a08b8ef2af37cb1217
--- /dev/null
+++ b/cmake/compileroptions/NEC.cmake
@@ -0,0 +1,49 @@
+message(STATUS "Setting NEC specific compiler options")
+
+# 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()
+
+if( WALBERLA_CXX_COMPILER_IS_NEC )
+   add_flag ( CMAKE_CXX_FLAGS "-wall" )
+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()
diff --git a/cmake/compileroptions/PGI.cmake b/cmake/compileroptions/PGI.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..10e444da374de5fd4fb5c9e3dcfd43d3ab15051b
--- /dev/null
+++ b/cmake/compileroptions/PGI.cmake
@@ -0,0 +1,16 @@
+message(STATUS "Setting Cray specific compiler options")
+
+# 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()
\ No newline at end of file