From c3b6da1d18eabadb42bda3a52dfd0130ec7bac3a Mon Sep 17 00:00:00 2001
From: Michael Kuron <mkuron@icp.uni-stuttgart.de>
Date: Mon, 28 Dec 2020 18:53:07 +0100
Subject: [PATCH] Remove Boost and switch to C++17

Some optional components use Boost MultiArray and PropertyTree, so we still include the headers if available.
We also still search std::experimental for any, filesystem and optional because some otherwise C++17-compliant compilers did not support them in std until recently.
---
 .clang-tidy                                 |   2 +
 .gitlab-ci.yml                              | 168 +-------------------
 CMakeLists.txt                              | 138 +++++-----------
 README.md                                   |   4 +-
 cmake/TestStdAny.cpp                        |  17 --
 cmake/TestStdOptional.cpp                   |  19 ---
 cmake/TestStdVariant.cpp                    |   7 -
 cmake/waLBerlaFunctions.cmake               |   4 +-
 doc/setup.dox                               |   6 -
 extern/pybind11                             |   2 +-
 src/blockforest/PhantomBlock.h              |   2 +-
 src/core/Any.h                              |  14 +-
 src/core/ConcatIterator.h                   |   8 +-
 src/core/Environment.cpp                    |   2 +-
 src/core/Filesystem.h                       |  13 +-
 src/core/Optional.h                         |  16 +-
 src/core/Variant.h                          |  20 ---
 src/core/grid_generator/HCPIterator.h       |   8 +-
 src/core/grid_generator/SCIterator.h        |   8 +-
 src/core/mpi/BufferDataTypeExtensions.h     |   4 +
 src/domain_decomposition/BlockStorage.h     |   7 +-
 src/field/iterators/FieldIterator.h         |   9 +-
 src/gather/CellGatherPackInfo.h             |   2 +-
 src/gather/CurveGatherPackInfo.h            |   2 +-
 src/mesa_pd/data/shape/ShapeTypes.cpp       |  39 -----
 src/pe/rigidbody/BodyIterators.h            |  24 ++-
 src/vtk/Initialization.cpp                  |   6 +-
 src/waLBerlaDefinitions.in.h                |   5 -
 tests/core/CMakeLists.txt                   |   2 +-
 tests/core/VariantTest.cpp                  |  13 +-
 tests/timeloop/TimeloopAndSweepRegister.cpp |   1 -
 utilities/conda/walberla/bld.bat            |   4 +-
 utilities/conda/walberla/meta.yaml          |   2 -
 33 files changed, 131 insertions(+), 447 deletions(-)
 delete mode 100644 cmake/TestStdAny.cpp
 delete mode 100644 cmake/TestStdOptional.cpp
 delete mode 100644 cmake/TestStdVariant.cpp
 delete mode 100644 src/mesa_pd/data/shape/ShapeTypes.cpp

diff --git a/.clang-tidy b/.clang-tidy
index ddebeb835..00ffd56f0 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -26,6 +26,8 @@ modernize-*,
 -modernize-redundant-void-arg,
 -modernize-use-trailing-return-type,
 -modernize-avoid-c-arrays,
+-modernize-concat-nested-namespaces,
+-modernize-use-nodiscard,
 
 mpi-*,
 -mpi-type-mismatch,
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 150f2086e..2248c4cdd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -77,170 +77,6 @@ stages:
 
 
 
-intel_18_serial:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   before_script:
-      - pip3 install lbmpy jinja2
-      - cd python
-      - python3 -m unittest discover pystencils_walberla/
-      - python3 -m unittest discover lbmpy_walberla/
-      - cd ..
-      - CC=gcc CXX=g++ pip3 install pycuda
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      WALBERLA_BUILD_WITH_MPI: "OFF"
-      WALBERLA_BUILD_WITH_OPENMP: "OFF"
-      WALBERLA_BUILD_WITH_PARMETIS: "OFF"
-      WALBERLA_BUILD_WITH_CODEGEN: "ON"
-      WALBERLA_BUILD_WITH_PYTHON: "ON"
-   only:
-      variables:
-         - $ENABLE_NIGHTLY_BUILDS
-   
-   tags:
-      - cuda
-      - docker
-      - intel
-
-intel_18_mpionly:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   before_script:
-      - pip3 install lbmpy jinja2
-      - cd python
-      - python3 -m unittest discover pystencils_walberla/
-      - python3 -m unittest discover lbmpy_walberla/
-      - cd ..
-      - CC=gcc CXX=g++ pip3 install pycuda
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      WALBERLA_BUILD_WITH_OPENMP: "OFF"
-      WALBERLA_BUILD_WITH_CODEGEN: "ON"
-      WALBERLA_BUILD_WITH_PYTHON: "ON"
-   only:
-      variables:
-         - $ENABLE_NIGHTLY_BUILDS
-   
-   tags:
-      - cuda
-      - docker
-      - intel
-
-intel_18_hybrid:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   before_script:
-      - pip3 install lbmpy jinja2
-      - cd python
-      - python3 -m unittest discover pystencils_walberla/
-      - python3 -m unittest discover lbmpy_walberla/
-      - cd ..
-      - CC=gcc CXX=g++ pip3 install pycuda
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      WALBERLA_ENABLE_GUI: "ON"
-      WALBERLA_BUILD_WITH_CODEGEN: "ON"
-      WALBERLA_BUILD_WITH_PYTHON: "ON"
-   only:
-      variables:
-         - $ENABLE_NIGHTLY_BUILDS
-   
-   tags:
-      - cuda
-      - docker
-      - intel
-
-intel_18_serial_dbg:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   before_script:
-      - pip3 install lbmpy jinja2
-      - cd python
-      - python3 -m unittest discover pystencils_walberla/
-      - python3 -m unittest discover lbmpy_walberla/
-      - cd ..
-      - CC=gcc CXX=g++ pip3 install pycuda
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      WALBERLA_BUILD_WITH_MPI: "OFF"
-      WALBERLA_BUILD_WITH_OPENMP: "OFF"
-      WALBERLA_BUILD_WITH_PARMETIS: "OFF"
-      CMAKE_BUILD_TYPE: "DebugOptimized"
-      WALBERLA_BUILD_WITH_CODEGEN: "ON"
-      WALBERLA_BUILD_WITH_PYTHON: "ON"
-   only:
-      variables:
-         - $ENABLE_NIGHTLY_BUILDS
-   
-   tags:
-      - cuda
-      - docker
-      - intel
-
-intel_18_mpionly_dbg:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   before_script:
-      - pip3 install lbmpy jinja2
-      - cd python
-      - python3 -m unittest discover pystencils_walberla/
-      - python3 -m unittest discover lbmpy_walberla/
-      - cd ..
-      - CC=gcc CXX=g++ pip3 install pycuda
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      CMAKE_BUILD_TYPE: "DebugOptimized"
-      WALBERLA_BUILD_WITH_OPENMP: "OFF"
-      WALBERLA_BUILD_WITH_CODEGEN: "ON"
-      WALBERLA_BUILD_WITH_PYTHON: "ON"
-   only:
-      variables:
-         - $ENABLE_NIGHTLY_BUILDS
-   
-   tags:
-      - cuda
-      - docker
-      - intel
-
-intel_18_hybrid_dbg:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   before_script:
-      - pip3 install lbmpy jinja2
-      - cd python
-      - python3 -m unittest discover pystencils_walberla/
-      - python3 -m unittest discover lbmpy_walberla/
-      - cd ..
-      - CC=gcc CXX=g++ pip3 install pycuda
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      CMAKE_BUILD_TYPE: "DebugOptimized"
-      WALBERLA_BUILD_WITH_CODEGEN: "ON"
-      WALBERLA_BUILD_WITH_PYTHON: "ON"
-   tags:
-      - cuda
-      - docker
-      - intel
-
-intel_18_hybrid_dbg_sp:
-   extends: .build_template
-   image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:18
-   variables:
-      WALBERLA_BUILD_WITH_CUDA: "ON"
-      CMAKE_BUILD_TYPE: "DebugOptimized"
-      WALBERLA_DOUBLE_ACCURACY: "OFF"
-      WALBERLA_BUILD_WITH_PARMETIS: "OFF"
-      WALBERLA_BUILD_WITH_METIS: "OFF"
-   only:
-      variables:
-         - $ENABLE_NIGHTLY_BUILDS
-   
-   tags:
-      - cuda
-      - docker
-      - intel
-
 intel_19_serial:
    extends: .build_template
    image: i10git.cs.fau.de:5005/walberla/buildenvs/intel:19
@@ -1858,7 +1694,7 @@ cppcheck:
    image: i10git.cs.fau.de:5005/walberla/buildenvs/cppcheck
    script:
       - cppcheck --version
-      - cppcheck . --max-configs=10 --enable=warning --enable=style --enable=performance --enable=portability -i src/gui/extern -i src/geometry/structured/extern -i sqlite3.c -i StackWalker.cpp -I src/ -I tests/ -I apps/ -D WALBERLA_BUILD_WITH_MPI -D WALBERLA_BUILD_WITH_METIS -D WALBERLA_BUILD_WITH_BOOST_THREAD -D WALBERLA_BUILD_WITH_PYTHON --xml 2> report.xml
+      - cppcheck . --max-configs=10 --enable=warning --enable=style --enable=performance --enable=portability -i src/gui/extern -i src/geometry/structured/extern -i sqlite3.c -i StackWalker.cpp -I src/ -I tests/ -I apps/ -D WALBERLA_BUILD_WITH_MPI -D WALBERLA_BUILD_WITH_METIS -D WALBERLA_BUILD_WITH_PYTHON --xml 2> report.xml
       - cppcheck-htmlreport --file=report.xml --report-dir=html_report --source-dir=.
    artifacts:
       untracked: true
@@ -1919,7 +1755,7 @@ coverage:
       - cmake --version
       - mkdir build
       - cd build
-      - cmake -LA -DWALBERLA_BUILD_TESTS=ON -DWALBERLA_BUILD_BENCHMARKS=ON -DWALBERLA_BUILD_TUTORIALS=ON -DWALBERLA_BUILD_WITH_MPI=$WALBERLA_BUILD_WITH_MPI -DWALBERLA_BUILD_WITH_OPENMP=$WALBERLA_BUILD_WITH_OPENMP -DWALBERLA_DOUBLE_ACCURACY=$WALBERLA_DOUBLE_ACCURACY -DWARNING_ERROR=ON -G "$CMAKE_GENERATOR" ..
+      - cmake -LA -DWALBERLA_BUILD_TESTS=ON -DWALBERLA_BUILD_BENCHMARKS=ON -DWALBERLA_BUILD_TUTORIALS=ON -DWALBERLA_BUILD_WITH_MPI=$WALBERLA_BUILD_WITH_MPI -DWALBERLA_BUILD_WITH_OPENMP=$WALBERLA_BUILD_WITH_OPENMP -DWALBERLA_DOUBLE_ACCURACY=$WALBERLA_DOUBLE_ACCURACY -DWARNING_ERROR=ON -G "$CMAKE_GENERATOR" -DCMAKE_DISABLE_FIND_PACKAGE_Boost=TRUE ..
       - MSBuild.exe walberla.sln /property:Configuration=$BUILD_CONFIGURATION /verbosity:minimal /maxcpucount:4
       - ctest -LE $CTEST_EXCLUDE_LABELS -C $BUILD_CONFIGURATION --output-on-failure -j 4
    variables:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d866ab63d..c62caabc3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@
 ## Contents:
 ##   - definition of build options
 ##   - compiler variables ( c++ standard, warnings etc. )
-##   - Finding of service libraries. Required: boost, Optional: MPI, PE, METIS
+##   - Finding of service libraries. Required: none, Optional: Boost, MPI, FFTW3, METIS, OpenMesh, Python
 ##     the include paths are set, and the libraries are added to variable SERVICE_LIBS
 ##   - Subdirectory cmake lists are called
 ##       -> src/   this folder contains all modules, each module (that contains c or cpp files) is linked to a
@@ -136,7 +136,7 @@ endif()
 
 ############################################################################################################################
 
-set( CMAKE_CXX_STANDARD 14 )
+set( CMAKE_CXX_STANDARD 17 )
 set( CMAKE_CXX_STANDARD_REQUIRED ON )
 set( CMAKE_CXX_EXTENSIONS OFF )
 
@@ -170,10 +170,16 @@ if( CMAKE_CXX_COMPILER MATCHES "icpc" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "icpc"
        SET(CMAKE_LINKER "${XILD}")
     ENDIF(XILD)
     MARK_AS_ADVANCED(XILD)
-    if( CMAKE_VERSION VERSION_LESS 3.6.0 )
-      set( CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14" )
+
+    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" )
+    endif()
 else()
     option ( WALBERLA_CXX_COMPILER_IS_INTEL "Use Intel compiler" OFF  )
 endif()
@@ -285,7 +291,8 @@ endif()
 
 # C++ language features for NEC compiler
 if( WALBERLA_CXX_COMPILER_IS_NEC )
-   set( CMAKE_CXX14_STANDARD_COMPILE_OPTION "-Kcpp14" )
+   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" )
@@ -314,7 +321,6 @@ endif()
 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=1540-0724" ) # 1540-0724 (W) The non-type template argument "2147483648" of type "T" has wrapped [coming from boost/integer_traits.hpp]
    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()
@@ -366,7 +372,6 @@ endif()
 
 if ( WALBERLA_CXX_COMPILER_IS_CLANG )
     add_flag ( CMAKE_CXX_FLAGS "-Wall -Wconversion -Wshadow -Wno-c++11-extensions -Qunused-arguments" )
-    add_flag ( CMAKE_CXX_FLAGS "-D'_LIBCPP_EXTERN_TEMPLATE(...)='")
 endif ( )
 
 if( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL OR WALBERLA_CXX_COMPILER_IS_CLANG )
@@ -433,25 +438,24 @@ endif()
 
 ############################################################################################################################
 ##
-##  Find optional C++ libraries
+##  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 ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
+             COMPILE_DEFINITIONS -DWALBERLA_USE_STD_FILESYSTEM )
 if( WALBERLA_USE_STD_FILESYSTEM )
    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 ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
+                COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
    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 ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION}
-                   LINK_LIBRARIES stdc++fs )
+                   COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM LINK_LIBRARIES stdc++fs )
       if( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
          message( STATUS "Found std::experimental::filesystem in libstdc++fs")
       list ( APPEND SERVICE_LIBS -lstdc++fs )
@@ -460,47 +464,23 @@ else()
    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 ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION}
-                   LINK_LIBRARIES c++experimental )
+                   COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM LINK_LIBRARIES c++experimental )
       if( WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
          message( STATUS "Found std::experimental::filesystem in libc++experimental")
          list ( APPEND SERVICE_LIBS -lc++experimental )
       endif()
    endif()
-endif()
-
-try_compile( WALBERLA_USE_STD_ANY "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdAny.cpp"
-             COMPILE_DEFINITIONS -DWALBERLA_USE_STD_ANY ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
-if( WALBERLA_USE_STD_ANY )
-   message( STATUS "Found std::any")
-else()
-   try_compile( WALBERLA_USE_STD_EXPERIMENTAL_ANY "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdAny.cpp"
-                COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_ANY ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
-   if( WALBERLA_USE_STD_EXPERIMENTAL_ANY )
-      message( STATUS "Found std::experimental::any")
-   endif()
-endif()
-
-try_compile( WALBERLA_USE_STD_OPTIONAL "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdOptional.cpp"
-             COMPILE_DEFINITIONS -DWALBERLA_USE_STD_OPTIONAL ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
-if( WALBERLA_USE_STD_OPTIONAL )
-   message( STATUS "Found std::optional")
-else()
-   try_compile( WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdOptional.cpp"
-                COMPILE_DEFINITIONS -DWALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
-   if( WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL )
-      message( STATUS "Found std::experimental::optional")
+   if( NOT WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM AND NOT WALBERLA_USE_STD_FILESYSTEM)
+       message(FATAL_ERROR "Neither std::filesystem nor std::experimental::filesystem are available")
    endif()
 endif()
 
-try_compile( WALBERLA_USE_STD_VARIANT "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestStdVariant.cpp"
-             COMPILE_DEFINITIONS -DWALBERLA_USE_STD_VARIANT ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} )
-if( WALBERLA_USE_STD_VARIANT )
-   message( STATUS "Found std::variant")
+if (WALBERLA_BUILD_WITH_CUDA AND CUDA_VERSION VERSION_LESS "11.0")
+   # CUDA < 11 does not support C++17. std::experimental::any works with C++14, unlike std::any.
+   set(WALBERLA_USE_STD_EXPERIMENTAL_ANY 1)
 endif()
 
 
-
 ############################################################################################################################
 ##
 ##  Visual Studio Setup
@@ -593,10 +573,17 @@ if ( WALBERLA_BUILD_WITH_PYTHON )
         message( FATAL_ERROR "Couldn't find any python library" )
     endif()
 
+    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()
+
     execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import pybind11; print(pybind11._version.__version__)"
                     OUTPUT_VARIABLE pybind11_VERSION ERROR_QUIET RESULT_VARIABLE pybind11_VERSION_RESULT)
     string(STRIP "${pybind11_VERSION}" pybind11_VERSION)
-    if(pybind11_VERSION_RESULT EQUAL "0" AND pybind11_VERSION VERSION_GREATER_EQUAL "2.6.0")
+    if(pybind11_VERSION_RESULT EQUAL "0" AND pybind11_VERSION VERSION_GREATER_EQUAL "${PYBIND11_MINIMUM_VERSION}")
         execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pybind11 --cmakedir
                         OUTPUT_VARIABLE PYBIND11_CMAKE_PATH)
         string(STRIP "${PYBIND11_CMAKE_PATH}" PYBIND11_CMAKE_PATH)
@@ -626,10 +613,12 @@ if ( WALBERLA_BUILD_WITH_PYTHON )
 
         add_subdirectory(extern/pybind11)
 
-        # if pybind11 was installed into ${PYTHON_INCLUDE_DIR} (e.g. by pip), that will have a higher priority than the Git submodule unless we reorder the search path
-        # introduced in 2.6.0 (https://github.com/pybind/pybind11/issues/2709), fixed in 2.6.2 (https://github.com/pybind/pybind11/pull/2716)
-        set_property( TARGET pybind11::pybind11
-                      PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/extern/pybind11/include" "${PYTHON_INCLUDE_DIR}")
+        if(pybind11_VERSION VERSION_LESS "2.6.2")
+            # if pybind11 was installed into ${PYTHON_INCLUDE_DIR} (e.g. by pip), that will have a higher priority than the Git submodule unless we reorder the search path
+            # introduced in 2.6.0 (https://github.com/pybind/pybind11/issues/2709), fixed in 2.6.2 (https://github.com/pybind/pybind11/pull/2716)
+            set_property( TARGET pybind11::pybind11
+                          PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/extern/pybind11/include" "${PYTHON_INCLUDE_DIR}")
+        endif()
     endif()
 
     # a python module is a shared library - so everything has to be compiled to position independent code
@@ -652,25 +641,14 @@ endif()
 ## BOOST Libraries
 ##
 #############################################################################################################################
-set ( waLBerla_REQUIRED_MIN_BOOST_VERSION "1.48")
 set ( Boost_NO_BOOST_CMAKE ON)
 
-if ( NOT WALBERLA_USE_STD_FILESYSTEM AND NOT WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM )
-  list ( APPEND waLBerla_REQUIRED_BOOST_COMPONENTS filesystem system )
-else()
-  list ( APPEND waLBerla_OPTIONAL_BOOST_COMPONENTS system )
-endif()
-
 # This variable is necessary, if the CMAKE version used is not aware of a more recent boost version (keep this up to date!)
 set ( Boost_ADDITIONAL_VERSIONS
       "1.45" "1.45.0" "1.46" "1.46.0" "1.46.1" "1.47" "1.47.0" "1.48" "1.48.0" "1.49" "1.49.0"
       "1.50" "1.50.0" "1.51" "1.51.0" "1.52" "1.52.0" "1.53" "1.53.0" "1.54" "1.54.0" "1.55" "1.55.0"
       "1.56" "1.56.0" "1.57" "1.57.0" "1.58" "1.58.0" "1.59" "1.59.0" "1.60" "1.60.0" "1.61" "1.61.0" "1.62" "1.62.0" "1.63" "1.63.0"
-      "1.64.0" "1.65.0" "1.65.1" "1.66.0" "1.67.0" "1.68.0" "1.69.0" "1.70.0" "1.71.0" "1.72.0" "1.73.0")
-
-set ( Boost_USE_STATIC_LIBS    OFF CACHE BOOL "Use boost static libraries" )
-set ( Boost_USE_MULTITHREADED  OFF CACHE BOOL "Use boost multithreaded libraries" )
-set ( Boost_USE_STATIC_RUNTIME OFF CACHE BOOL "Use boost libraries statically linked to runtime libs" )
+      "1.64.0" "1.65.0" "1.65.1" "1.66.0" "1.67.0" "1.68.0" "1.69.0" "1.70.0" "1.71.0" "1.72.0" "1.73.0" "1.74.0")
 
 # if you defined BOOST_ROOT or BOOST_BASE in your environment use it here to find boost too
 if ( NOT BOOST_ROOT )
@@ -683,28 +661,7 @@ if ( NOT BOOST_ROOT )
    endforeach ( )
 endif ( )
 
-find_package ( Boost ${waLBerla_REQUIRED_MIN_BOOST_VERSION} COMPONENTS ${waLBerla_REQUIRED_BOOST_COMPONENTS} OPTIONAL_COMPONENTS ${waLBerla_OPTIONAL_BOOST_COMPONENTS} QUIET )
-
-if( NOT Boost_FOUND )
-   message ( WARNING
-      "The specified configuration of the BOOST libraries was not found on your system! Now trying some other configuration..." )
-   foreach ( Boost_USE_STATIC_LIBS ON OFF )
-      foreach ( Boost_USE_MULTITHREADED ON OFF )
-         find_package ( Boost ${waLBerla_REQUIRED_MIN_BOOST_VERSION} COMPONENTS ${waLBerla_REQUIRED_BOOST_COMPONENTS} OPTIONAL_COMPONENTS ${waLBerla_OPTIONAL_BOOST_COMPONENTS} QUIET )
-         if ( Boost_FOUND )
-            set ( Boost_USE_STATIC_LIBS   ${Boost_USE_STATIC_LIBS}   CACHE BOOL "Use boost static libraries"        FORCE )
-            set ( Boost_USE_MULTITHREADED ${Boost_USE_MULTITHREADED} CACHE BOOL "Use boost multithreaded libraries" FORCE )
-            set ( Boost_USE_MULTITHREADED_LIBRARY ${Boost_USE_MULTITHREADED} )
-            message ( STATUS "Working configuration of the BOOST libraries was found :o)!" )
-            message ( STATUS "Boost_USE_STATIC_LIBS and Boost_USE_MULTITHREADED was adapted accordingly." )
-            BREAK ( )
-         endif ( Boost_FOUND )
-      endforeach ( Boost_USE_MULTITHREADED )
-      if ( Boost_FOUND )
-         BREAK ( )
-      endif ( Boost_FOUND )
-   endforeach ( Boost_USE_STATIC_LIBS )
-endif ( NOT Boost_FOUND )
+find_package ( Boost )
 
 if ( Boost_FOUND )
    if(CMAKE_GENERATOR STREQUAL "Xcode")
@@ -713,24 +670,11 @@ if ( Boost_FOUND )
    else()
       include_directories ( SYSTEM ${Boost_INCLUDE_DIRS} )
    endif()
-   if( waLBerla_REQUIRED_BOOST_COMPONENTS )
-      link_directories ( ${Boost_LIBRARY_DIRS} )
-      list ( APPEND SERVICE_LIBS ${Boost_LIBRARIES} )
-   endif()
    add_definitions ( -DBOOST_ALL_NO_LIB ) # Disable Boost auto-linking (CMAKE does that for us...)
 
    set( WALBERLA_BUILD_WITH_BOOST TRUE CACHE INTERNAL "Build with Boost" )
 else( Boost_FOUND )
-   if( (WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM OR WALBERLA_USE_STD_FILESYSTEM) AND (WALBERLA_USE_STD_EXPERIMENTAL_ANY OR WALBERLA_USE_STD_ANY) AND (WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL OR WALBERLA_USE_STD_OPTIONAL) AND NOT WALBERLA_BUILD_WITH_PYTHON)
-      # we don't really need Boost
-      set( WALBERLA_BUILD_WITH_BOOST FALSE CACHE INTERNAL "Build with Boost" )
-   else()
-      # Search again, this time with the REQUIRED option. This will give a CMAKE error and a detailed error message for the user
-      find_package ( Boost ${waLBerla_REQUIRED_MIN_BOOST_VERSION} REQUIRED ${waLBerla_REQUIRED_BOOST_COMPONENTS} OPTIONAL_COMPONENTS ${waLBerla_OPTIONAL_BOOST_COMPONENTS} )
-      if( (WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM OR WALBERLA_USE_STD_FILESYSTEM) AND (WALBERLA_USE_STD_EXPERIMENTAL_ANY OR WALBERLA_USE_STD_ANY) AND (WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL OR WALBERLA_USE_STD_OPTIONAL) )
-         message(WARNING "If you set WALBERLA_BUILD_WITH_PYTHON=OFF, you can build without the Boost library.")
-      endif()
-   endif()
+   set( WALBERLA_BUILD_WITH_BOOST FALSE CACHE INTERNAL "Build with Boost" )
 endif( Boost_FOUND )
 
 
@@ -864,10 +808,6 @@ if ( WALBERLA_ENABLE_GUI )
     INCLUDE( ${QT_USE_FILE} )
     list ( APPEND SERVICE_LIBS ${OPENGL_LIBRARIES} ${QT_LIBRARIES} )
 
-    # Workaround for Qt4 moc and newer boost versions - moc cannot parse BOOST_JOIN
-    # so additional defines are passed to the moc compiler that prevent the problematic header to be parsed
-    set( QT_MOC_EXECUTABLE ${QT_MOC_EXECUTABLE} -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED )
-
 endif(WALBERLA_ENABLE_GUI)
 
 ############################################################################################################################
diff --git a/README.md b/README.md
index 40e176fb8..9d87364cf 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,8 @@ is documented in [Sphinx](http://walberla.net/sphinx/index.html).
 
 ## Getting started
 
-The minimum requirements are a C++14-compliant compiler (e.g. GCC or Clang),
-the [Boost](http://www.boost.org) library and the [CMake](http://www.cmake.org)
+The minimum requirements are a C++17-compliant compiler (e.g. GCC or Clang)
+and the [CMake](http://www.cmake.org)
 build system. Furthermore, you need an MPI library (like
 [Open MPI](http://www.open-mpi.org)) if you want to make use of parallel
 processing capabilities. All of these dependencies are typically available in
diff --git a/cmake/TestStdAny.cpp b/cmake/TestStdAny.cpp
deleted file mode 100644
index 6bcc880a6..000000000
--- a/cmake/TestStdAny.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <iostream>
-#if defined(WALBERLA_USE_STD_ANY)
-#include <any>
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_ANY)
-#include <experimental/any>
-#endif
-
-int main() {
-#if defined(WALBERLA_USE_STD_ANY)
-   auto a = std::any(42);
-   std::cout << std::any_cast<int>(a) << std::endl;
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_ANY)
-   auto a = std::experimental::any(42);
-   std::cout << std::experimental::any_cast<int>(a) << std::endl;
-#endif
-   return 0;
-}
diff --git a/cmake/TestStdOptional.cpp b/cmake/TestStdOptional.cpp
deleted file mode 100644
index fc3a148c1..000000000
--- a/cmake/TestStdOptional.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <iostream>
-#if defined(WALBERLA_USE_STD_OPTIONAL)
-#include <optional>
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL)
-#include <experimental/optional>
-#endif
-
-int main() {
-#if defined(WALBERLA_USE_STD_OPTIONAL)
-   auto a = std::optional<int>();
-   auto b = std::optional<int>(42);
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL)
-   auto a = std::experimental::optional<int>();
-   auto b = std::experimental::optional<int>(42);
-#endif
-   if (b)
-      std::cout << a.value_or(b.value()) << std::endl;
-   return 0;
-}
diff --git a/cmake/TestStdVariant.cpp b/cmake/TestStdVariant.cpp
deleted file mode 100644
index be98d121f..000000000
--- a/cmake/TestStdVariant.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <iostream>
-#include <variant>
-
-int main() {
-   std::variant<int,float> a;
-   return 0;
-}
diff --git a/cmake/waLBerlaFunctions.cmake b/cmake/waLBerlaFunctions.cmake
index a5822aa84..f4c4b1f68 100644
--- a/cmake/waLBerlaFunctions.cmake
+++ b/cmake/waLBerlaFunctions.cmake
@@ -99,7 +99,7 @@ function ( waLBerla_add_module )
 
     waLBerla_register_dependency ( ${moduleName} ${ARG_DEPENDS} )
 
-    set_property( TARGET ${moduleName} PROPERTY CXX_STANDARD 14 )
+    set_property( TARGET ${moduleName} PROPERTY CXX_STANDARD ${CMAKE_CXX_STANDARD} )
 
     # This property is needed for visual studio to group modules together
     if( WALBERLA_GROUP_PROJECTS )
@@ -204,7 +204,7 @@ function ( waLBerla_add_executable )
 
     target_link_modules  ( ${ARG_NAME} ${ARG_DEPENDS}  )
     target_link_libraries( ${ARG_NAME} ${WALBERLA_LINK_LIBRARIES_KEYWORD} ${SERVICE_LIBS} )
-    set_property( TARGET ${ARG_NAME} PROPERTY CXX_STANDARD 14 )
+    set_property( TARGET ${ARG_NAME} PROPERTY CXX_STANDARD ${CMAKE_CXX_STANDARD} )
 
     if( WALBERLA_GROUP_PROJECTS )
         if( NOT ARG_GROUP )
diff --git a/doc/setup.dox b/doc/setup.dox
index e740b0e04..ab9ba0588 100644
--- a/doc/setup.dox
+++ b/doc/setup.dox
@@ -22,12 +22,6 @@ If you are not familiar with the git version control system, this
 To compile waLBerla with all modules and features a few third-party libraries
 are required. 
 
-\subsubsection libs_boost Boost
-The boost library is the only required third-party library. It is installed on
-most Linux system by default and should be detected by cmake. 
-If boost resides at a non-standard location, you have to set the environment variable
-`BOOST_ROOT` in order to have it detected by cmake.
-
 \subsubsection libs_mpi   MPI (optional)
 The message passing interface (MPI) library is required if you want to run waLBerla
 with distributed memory parallelization. If MPI is not installed on your system,
diff --git a/extern/pybind11 b/extern/pybind11
index 526a7733c..687c69625 160000
--- a/extern/pybind11
+++ b/extern/pybind11
@@ -1 +1 @@
-Subproject commit 526a7733c773016f2e552777612027954d0765fd
+Subproject commit 687c69625bd2b96ac0596d1a9cc0ab2101485d70
diff --git a/src/blockforest/PhantomBlock.h b/src/blockforest/PhantomBlock.h
index e5d95c6c9..0df698690 100644
--- a/src/blockforest/PhantomBlock.h
+++ b/src/blockforest/PhantomBlock.h
@@ -88,7 +88,7 @@ public:
    T getData() const { return walberla::any_cast<T>( data_ ); }
    
    bool hasData() const {
-#ifdef WALBERLA_USE_STD_ANY 
+#ifndef WALBERLA_USE_STD_EXPERIMENTAL_ANY
       return data_.has_value();
 #else
       return !(data_.empty());
diff --git a/src/core/Any.h b/src/core/Any.h
index ac2f9dbb3..a7bdfaea4 100644
--- a/src/core/Any.h
+++ b/src/core/Any.h
@@ -21,29 +21,25 @@
 
 #pragma once
 
+#include "waLBerlaDefinitions.h"
 
-#if defined(WALBERLA_USE_STD_ANY)
+#ifndef WALBERLA_USE_STD_EXPERIMENTAL_ANY
 #include <any>
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_ANY)
+#else
 #undef _LIBCPP_WARN_ON_DEPRECATED_EXPERIMENTAL_HEADER
 #include <experimental/any>
-#else
-#include <boost/any.hpp>
 #endif
 
 
 
 namespace walberla {
 
-#if defined(WALBERLA_USE_STD_ANY)
+#ifndef WALBERLA_USE_STD_EXPERIMENTAL_ANY
 using std::any;
 using std::any_cast;
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_ANY)
+#else
 using std::experimental::any;
 using std::experimental::any_cast;
-#else
-using boost::any;
-using boost::any_cast;
 #endif
 
 }
diff --git a/src/core/ConcatIterator.h b/src/core/ConcatIterator.h
index b21ce3705..f76c79f62 100644
--- a/src/core/ConcatIterator.h
+++ b/src/core/ConcatIterator.h
@@ -27,9 +27,15 @@
 namespace walberla {
 
 template< typename T >
-class ConcatIterator : public std::iterator< std::input_iterator_tag, typename T::value_type, typename T::difference_type, typename T::pointer, typename T::reference >
+class ConcatIterator
 {
 public:
+    using iterator_category = std::input_iterator_tag;
+    using value_type = typename T::value_type;
+    using difference_type = typename T::difference_type;
+    using pointer = typename T::pointer;
+    using reference = typename T::reference;
+
     /// default constructed iterator points to end()
     ConcatIterator( )
         : ended_( true )
diff --git a/src/core/Environment.cpp b/src/core/Environment.cpp
index 015687ce3..684f6f8e2 100644
--- a/src/core/Environment.cpp
+++ b/src/core/Environment.cpp
@@ -82,7 +82,7 @@ void configureGlobalState( const shared_ptr<Config> & config ) {
       std::string suids = config->getParameter< std::string >( "GlobalState" );
 
       std::vector< std::string > states = string_split( suids, ", \t" );
-      states.erase( std::remove_if( states.begin(), states.end(), std::bind( &std::string::empty, std::placeholders::_1 ) ), states.end() );
+      states.erase( std::remove_if( states.begin(), states.end(), [](auto &s){ return s.empty(); } ), states.end() );
 
       Set<SUID> state;
       for( auto it = states.begin(); it != states.end(); ++it )
diff --git a/src/core/Filesystem.h b/src/core/Filesystem.h
index 24e14a868..beaf77ad0 100644
--- a/src/core/Filesystem.h
+++ b/src/core/Filesystem.h
@@ -21,14 +21,13 @@
 
 #pragma once
 
+#include "waLBerlaDefinitions.h"
 
-#if defined(WALBERLA_USE_STD_FILESYSTEM)
+#ifndef WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM
 #include <filesystem>
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM)
+#else
 #define _LIBCPP_NO_EXPERIMENTAL_DEPRECATION_WARNING_FILESYSTEM
 #include <experimental/filesystem>
-#else
-#include <boost/filesystem.hpp>
 #endif
 
 
@@ -36,12 +35,10 @@
 namespace walberla {
 namespace filesystem {
 
-#if defined(WALBERLA_USE_STD_FILESYSTEM)
+#ifndef WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM
 using namespace std::filesystem;
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM)
-using namespace std::experimental::filesystem;
 #else
-using namespace boost::filesystem;
+using namespace std::experimental::filesystem;
 #endif
 
 }
diff --git a/src/core/Optional.h b/src/core/Optional.h
index 60883fd3d..5c31a1ec0 100644
--- a/src/core/Optional.h
+++ b/src/core/Optional.h
@@ -21,29 +21,15 @@
 
 #pragma once
 
+#include "waLBerlaDefinitions.h"
 
-#if defined(WALBERLA_USE_STD_OPTIONAL)
 #include <optional>
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL)
-#undef _LIBCPP_WARN_ON_DEPRECATED_EXPERIMENTAL_HEADER
-#include <experimental/optional>
-#else
-#include <boost/optional.hpp>
-#endif
 
 
 
 namespace walberla {
 
-#if defined(WALBERLA_USE_STD_OPTIONAL)
 using std::optional;
 using std::nullopt;
-#elif defined(WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL)
-using std::experimental::optional;
-using std::experimental::nullopt;
-#else
-using boost::optional;
-const boost::none_t nullopt = boost::none;
-#endif
 
 }
diff --git a/src/core/Variant.h b/src/core/Variant.h
index 7fe6d195a..2be3f0a6c 100644
--- a/src/core/Variant.h
+++ b/src/core/Variant.h
@@ -22,37 +22,17 @@
 #pragma once
 
 
-#if defined(WALBERLA_USE_STD_VARIANT)
 #include <variant>
-#else
-#include <boost/variant.hpp>
-#endif
 
 
 
 namespace walberla
 {
 
-#if defined(WALBERLA_USE_STD_VARIANT)
 using std::variant;
 using std::visit;
 using std::get;
 using std::holds_alternative;
 using std::bad_variant_access;
-#else
-using boost::variant;
-using boost::get;
-template <class T, class... Types>
-constexpr bool holds_alternative( const boost::variant<Types...>& v ) noexcept
-{
-   return v.type() == typeid( T );
-}
-using bad_variant_access = boost::bad_get;
-template<typename Visitor, typename... Variant>
-decltype( auto ) visit( Visitor&& visitor, Variant&& ... variant )
-{
-   return boost::apply_visitor( visitor, variant... );
-}
-#endif
 
 }
diff --git a/src/core/grid_generator/HCPIterator.h b/src/core/grid_generator/HCPIterator.h
index dc84a29c6..dfc806d11 100644
--- a/src/core/grid_generator/HCPIterator.h
+++ b/src/core/grid_generator/HCPIterator.h
@@ -33,9 +33,15 @@ namespace grid_generator {
 ///
 /// Usage:
 /// \code for (auto it = HCPIterator::begin(...); it != HCPIterator::end(); ++it) \endcode
-class HCPIterator : public std::iterator< std::forward_iterator_tag, Vector3<real_t> >
+class HCPIterator
 {
 public:
+    using iterator_category = std::forward_iterator_tag;
+    using value_type = Vector3<real_t>;
+    using difference_type = std::ptrdiff_t;
+    using pointer = Vector3<real_t>*;
+    using reference = Vector3<real_t>&;
+
    /**
     * @brief begin iterator
     * @param domain volume were lattice points will be returned
diff --git a/src/core/grid_generator/SCIterator.h b/src/core/grid_generator/SCIterator.h
index 4946f8dbd..7068bd3de 100644
--- a/src/core/grid_generator/SCIterator.h
+++ b/src/core/grid_generator/SCIterator.h
@@ -46,9 +46,15 @@ namespace grid_generator {
 /// \endcode
 /// Usage:
 /// \code for (auto it = SCIterator::begin(...); it != SCIterator::end(); ++it) \endcode
-class SCIterator : public std::iterator< std::forward_iterator_tag, Vector3<real_t> >
+class SCIterator
 {
 public:
+    using iterator_category = std::forward_iterator_tag;
+    using value_type = Vector3<real_t>;
+    using difference_type = std::ptrdiff_t;
+    using pointer = Vector3<real_t>*;
+    using reference = Vector3<real_t>&;
+
    /**
     * @brief begin iterator
     * @param domain volume were lattice points will be returned
diff --git a/src/core/mpi/BufferDataTypeExtensions.h b/src/core/mpi/BufferDataTypeExtensions.h
index 9685d6ac2..3196b5362 100644
--- a/src/core/mpi/BufferDataTypeExtensions.h
+++ b/src/core/mpi/BufferDataTypeExtensions.h
@@ -28,7 +28,9 @@
 #include "core/Conversion.h"
 #include "core/DataTypes.h"
 #include "core/math/Uint.h"
+#if __cplusplus >= 201703L || defined(_MSC_VER)
 #include "core/Optional.h"
+#endif
 #include "core/RandomUUID.h"
 
 #include <array>
@@ -564,6 +566,7 @@ template<typename T, typename K, typename C, typename A>
 struct BufferSizeTrait< std::multimap<K,T,C,A> > { static const bool constantSize = false;  };
 
 
+#if __cplusplus >= 201703L || defined(_MSC_VER)
 // ---------------------------------------------------------------------------------------------------------------------
 // ------------------------------------------- optional Support --------------------------------------------------------
 // ---------------------------------------------------------------------------------------------------------------------
@@ -614,6 +617,7 @@ GenericRecvBuffer<T>& operator>>( GenericRecvBuffer<T> & buf, walberla::optional
 
    return buf;
 }
+#endif
 
 // ---------------------------------------------------------------------------------------------------------------------
 // --------------------------------------- RandomUUID Support ----------------------------------------------------------
diff --git a/src/domain_decomposition/BlockStorage.h b/src/domain_decomposition/BlockStorage.h
index 34789a47b..e00f3ee86 100644
--- a/src/domain_decomposition/BlockStorage.h
+++ b/src/domain_decomposition/BlockStorage.h
@@ -77,10 +77,15 @@ public:
 
    class const_iterator;
 
-   class iterator : public std::iterator <std::forward_iterator_tag, IBlock > {
+   class iterator {
       friend class const_iterator;
       friend class BlockStorage;
    public:
+      using iterator_category = std::forward_iterator_tag;
+      using value_type = IBlock;
+      using difference_type = std::ptrdiff_t;
+      using pointer = IBlock*;
+      using reference = IBlock&;
 
       iterator( const iterator & it ) :
          it_( it.it_ ), end_( it.end_ ), requiredSelectors_( it.requiredSelectors_ ), incompatibleSelectors_( it.incompatibleSelectors_ ) {}
diff --git a/src/field/iterators/FieldIterator.h b/src/field/iterators/FieldIterator.h
index 0136ce727..faecf9822 100644
--- a/src/field/iterators/FieldIterator.h
+++ b/src/field/iterators/FieldIterator.h
@@ -66,11 +66,16 @@ namespace field {
     */
    //*******************************************************************************************************************
    template <typename T, uint_t fieldFSize>
-   class FieldIterator : public std::iterator <std::forward_iterator_tag,T>
+   class FieldIterator
    {
    public:
+      using iterator_category = std::forward_iterator_tag;
+      using value_type = T;
+      using difference_type = std::ptrdiff_t;
+      using pointer = T*;
+      using reference = T&;
+
       typedef Field<typename std::remove_const<T>::type, fieldFSize> FieldType;
-      typedef T value_type;
 
       static const uint_t F_SIZE = fieldFSize;
 
diff --git a/src/gather/CellGatherPackInfo.h b/src/gather/CellGatherPackInfo.h
index d4cee6c5d..0055a2ba0 100644
--- a/src/gather/CellGatherPackInfo.h
+++ b/src/gather/CellGatherPackInfo.h
@@ -124,7 +124,7 @@ protected:
    shared_ptr<DataProcessor> dataProcessor_;
 
    /// Helper class for sorting the receivedData array according to t-value
-   struct Compare : public std::binary_function<std::vector<real_t> , std::vector<real_t> ,bool>
+   struct Compare : public std::function<bool(std::vector<real_t> , std::vector<real_t>)>
    {
       inline bool operator()(const std::vector<real_t> & v1, const std::vector<real_t> & v2) const {
          return v1[0] < v2[0];
diff --git a/src/gather/CurveGatherPackInfo.h b/src/gather/CurveGatherPackInfo.h
index f23b18ae6..112f018b3 100644
--- a/src/gather/CurveGatherPackInfo.h
+++ b/src/gather/CurveGatherPackInfo.h
@@ -193,7 +193,7 @@ class CurveGatherPackInfo : public GatherPackInfo
 
 
       /// Helper class for sorting the receivedData array according to t-value
-      struct Compare : public std::binary_function<std::vector<real_t> , std::vector<real_t> ,bool>
+      struct Compare : public std::function<bool(std::vector<real_t> , std::vector<real_t>)>
       {
          inline bool operator()(const std::vector<real_t> & v1, const std::vector<real_t> & v2) const {
             return v1[0] < v2[0];
diff --git a/src/mesa_pd/data/shape/ShapeTypes.cpp b/src/mesa_pd/data/shape/ShapeTypes.cpp
deleted file mode 100644
index 4eb52cd05..000000000
--- a/src/mesa_pd/data/shape/ShapeTypes.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-//======================================================================================================================
-//
-//  This file is part of waLBerla. waLBerla is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  waLBerla is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file
-//! \author Sebastian Eibl <sebastian.eibl@fau.de>
-//
-//======================================================================================================================
-
-#include <mesa_pd/data/shape/Box.h>
-#include <mesa_pd/data/shape/CylindricalBoundary.h>
-#include <mesa_pd/data/shape/HalfSpace.h>
-#include <mesa_pd/data/shape/Ellipsoid.h>
-#include <mesa_pd/data/shape/Sphere.h>
-
-namespace walberla {
-namespace mesa_pd {
-namespace data {
-
-const int Box::SHAPE_TYPE                ;
-const int CylindricalBoundary::SHAPE_TYPE;
-const int HalfSpace::SHAPE_TYPE          ;
-const int Ellipsoid::SHAPE_TYPE          ;
-const int Sphere::SHAPE_TYPE             ;
-
-} //namespace data
-} //namespace mesa_pd
-} //namespace walberla
diff --git a/src/pe/rigidbody/BodyIterators.h b/src/pe/rigidbody/BodyIterators.h
index 5f4ef40fc..903a1195b 100644
--- a/src/pe/rigidbody/BodyIterators.h
+++ b/src/pe/rigidbody/BodyIterators.h
@@ -34,10 +34,16 @@ class BodyIterator
 public:
 
    template< typename T >
-   class iterator : public std::iterator< std::input_iterator_tag, typename T::value_type, typename T::difference_type, typename T::pointer, typename T::reference >
+   class iterator
    {
       friend class BodyIterator;
    public:
+      using iterator_category = std::input_iterator_tag;
+      using value_type = typename T::value_type;
+      using difference_type = typename T::difference_type;
+      using pointer = typename T::pointer;
+      using reference = typename T::reference;
+
       iterator & operator++()    { ++it_; checkStateAndAdapt(); return *this; }      // prefix ++X
       iterator   operator++(int) { iterator it( *this ); operator++(); return it; }; // postfix X++
 
@@ -146,10 +152,16 @@ class LocalBodyIterator
 public:
 
    template< typename T >
-   class iterator : public std::iterator< std::input_iterator_tag, typename T::value_type, typename T::difference_type, typename T::pointer, typename T::reference >
+   class iterator
    {
       friend class LocalBodyIterator;
    public:
+      using iterator_category = std::input_iterator_tag;
+      using value_type = typename T::value_type;
+      using difference_type = typename T::difference_type;
+      using pointer = typename T::pointer;
+      using reference = typename T::reference;
+
       iterator & operator++()    { ++it_; checkStateAndAdapt(); return *this; }      // prefix ++X
       iterator   operator++(int) { iterator it( *this ); operator++(); return it; }; // postfix X++
 
@@ -236,10 +248,16 @@ class ShadowBodyIterator
 public:
 
    template< typename T >
-   class iterator : public std::iterator< std::input_iterator_tag, typename T::value_type, typename T::difference_type, typename T::pointer, typename T::reference >
+   class iterator
    {
       friend class ShadowBodyIterator;
    public:
+      using iterator_category = std::input_iterator_tag;
+      using value_type = typename T::value_type;
+      using difference_type = typename T::difference_type;
+      using pointer = typename T::pointer;
+      using reference = typename T::reference;
+
       iterator & operator++()    { ++it_; checkStateAndAdapt(); return *this; }      // prefix ++X
       iterator   operator++(int) { iterator it( *this ); operator++(); return it; }; // postfix X++
 
diff --git a/src/vtk/Initialization.cpp b/src/vtk/Initialization.cpp
index 0b4fa4567..4d88f1b21 100644
--- a/src/vtk/Initialization.cpp
+++ b/src/vtk/Initialization.cpp
@@ -42,7 +42,7 @@ static void splitVector( T& x, T& y, T& z, const Config::BlockHandle& bb, const
    std::string vector = bb.getParameter< std::string >( vertex );
    coordinates = string_split( vector, "<,> \t" );
 
-   coordinates.erase( std::remove_if( coordinates.begin(), coordinates.end(), std::bind( &std::string::empty,  std::placeholders::_1 ) ), coordinates.end() );
+   coordinates.erase( std::remove_if( coordinates.begin(), coordinates.end(), [](auto &s){ return s.empty(); } ), coordinates.end() );
 
    if( coordinates.size() != 3 )
       WALBERLA_ABORT( errorMsg );
@@ -59,7 +59,7 @@ static std::vector< std::string > splitList( const std::string& string )
    std::vector< std::string > list;
 
    list = string_split( string, ", \t" );
-   list.erase( std::remove_if( list.begin(), list.end(), std::bind( &std::string::empty,  std::placeholders::_1 ) ), list.end() );
+   list.erase( std::remove_if( list.begin(), list.end(), [](auto &s){ return s.empty(); } ), list.end() );
 
    return list;
 }
@@ -70,7 +70,7 @@ static void addStates( Set<SUID>& set, const std::string& string )
 {
    std::vector< std::string > states;
    states = string_split( string, ", \t" );
-   states.erase( std::remove_if( states.begin(), states.end(), std::bind( &std::string::empty,  std::placeholders::_1 ) ), states.end() );
+   states.erase( std::remove_if( states.begin(), states.end(), [](auto &s){ return s.empty(); } ), states.end() );
 
    for( auto it = states.begin(); it != states.end(); ++it )
       set += SUID( *it );
diff --git a/src/waLBerlaDefinitions.in.h b/src/waLBerlaDefinitions.in.h
index 21d1dd6d3..c729cd2af 100644
--- a/src/waLBerlaDefinitions.in.h
+++ b/src/waLBerlaDefinitions.in.h
@@ -51,12 +51,7 @@
 #cmakedefine WALBERLA_CXX_COMPILER_IS_CLANG
 
 #cmakedefine WALBERLA_USE_STD_EXPERIMENTAL_FILESYSTEM
-#cmakedefine WALBERLA_USE_STD_FILESYSTEM
 #cmakedefine WALBERLA_USE_STD_EXPERIMENTAL_ANY
-#cmakedefine WALBERLA_USE_STD_ANY
-#cmakedefine WALBERLA_USE_STD_EXPERIMENTAL_OPTIONAL
-#cmakedefine WALBERLA_USE_STD_OPTIONAL
-#cmakedefine WALBERLA_USE_STD_VARIANT
 #cmakedefine WALBERLA_BUILD_WITH_BACKTRACE
 #ifdef WALBERLA_BUILD_WITH_BACKTRACE
 #define WALBERLA_BACKTRACE_HEADER "${Backtrace_HEADER}"
diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt
index 89583aadb..df07f5c8f 100644
--- a/tests/core/CMakeLists.txt
+++ b/tests/core/CMakeLists.txt
@@ -220,7 +220,7 @@ waLBerla_execute_test( NAME UNIQUEID PROCESSES 4)
 waLBerla_compile_test( FILES VersionTest.cpp )
 waLBerla_execute_test( NAME VersionTest )
 
-if( WALBERLA_BUILD_WITH_BOOST OR WALBERLA_USE_STD_VARIANT )
+if ( WALBERLA_CXX_COMPILER_IS_INTEL AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "20.0" )
   waLBerla_compile_test( FILES VariantTest )
   waLBerla_execute_test( NAME VariantTest )
 endif()
diff --git a/tests/core/VariantTest.cpp b/tests/core/VariantTest.cpp
index a879b5b98..89eaf99ea 100644
--- a/tests/core/VariantTest.cpp
+++ b/tests/core/VariantTest.cpp
@@ -41,36 +41,31 @@ int main( int /*argc*/, char** /*argv*/ )
    walberla::variant<int, float> v, w;
    v = 12; // v contains int
    int i = walberla::get<int>( v );
-#ifdef WALBERLA_USE_STD_VARIANT
-   WALBERLA_CHECK( i == 12 ); // boost::variant cannot use == with variant and type
-#endif
    WALBERLA_CHECK( 0 == 12 - i );
    w = walberla::get<int>( v );
    w = v;
-#ifdef WALBERLA_USE_STD_VARIANT
-   WALBERLA_CHECK( w == 12 ); // boost::variant cannot use == with variant and type
-#endif
    WALBERLA_CHECK( 0 == 12 - i );
 
    //  walberla::get<double>(v); // error: no double in [int, float]
    //  walberla::get<3>(v);      // error: valid index values are 0 and 1
 
    try {
-      walberla::get<float>( w ); // w contains int, not float: will throw
+      float f = walberla::get<float>( w ); // w contains int, not float: will throw
+      std::cout << f << std::endl;
    } catch ( const walberla::bad_variant_access& ) {}
 
    walberla::variant<std::string> x( "abc" ); // converting constructors work when unambiguous
    x = "def"; // converting assignment also works when unambiguous
 
    std::cout << "hallo" << std::endl;
-   walberla::variant<std::string, bool> y( "abc" ); // casts to bool when passed a char const *
+   walberla::variant<std::string, bool> y( true );
    std::cout << "eoo" << std::endl;
    WALBERLA_CHECK( walberla::holds_alternative<bool>( y ) ); // succeeds
    y = "xyz"s;
    WALBERLA_CHECK( walberla::holds_alternative<std::string>( y ) ); //succeeds
 
    std::cout << "bye" << std::endl;
-   std::vector<var_t> vec {10, 15l, 1.5, "hello"};
+   std::vector<var_t> vec = {10, 15l, 1.5, "hello"};
 
    for ( auto& z : vec ) {
       // 1. void visitor, only called for side-effects (here, for I/O)
diff --git a/tests/timeloop/TimeloopAndSweepRegister.cpp b/tests/timeloop/TimeloopAndSweepRegister.cpp
index 9e0a2d39b..028e5fad7 100644
--- a/tests/timeloop/TimeloopAndSweepRegister.cpp
+++ b/tests/timeloop/TimeloopAndSweepRegister.cpp
@@ -30,7 +30,6 @@
 
 
 using namespace std;
-using namespace boost;
 using namespace walberla;
 
 
diff --git a/utilities/conda/walberla/bld.bat b/utilities/conda/walberla/bld.bat
index 2b90c35b5..64c851061 100644
--- a/utilities/conda/walberla/bld.bat
+++ b/utilities/conda/walberla/bld.bat
@@ -6,9 +6,7 @@ cmake -LAH -G"Visual Studio 15 2017 Win64"                   ^
   -DWALBERLA_BUILD_WITH_PYTHON=ON                            ^
   -DWALBERLA_BUILD_WITH_MPI=OFF                              ^
   -DWALBERLA_BUILD_WITH_OPENMP=ON                            ^
-  -DPYTHON_EXECUTABLE="%PYTHON%"                             ^
-  -DBoost_USE_STATIC_LIBS=OFF                                ^
-  -DBoost_USE_MULTITHREADED=ON ..
+  -DPYTHON_EXECUTABLE="%PYTHON%"  ..
 if errorlevel 1 exit 1
 
 cmake --build . --config Release --target pythonModuleInstall
diff --git a/utilities/conda/walberla/meta.yaml b/utilities/conda/walberla/meta.yaml
index 2148479bb..80a1cefc0 100644
--- a/utilities/conda/walberla/meta.yaml
+++ b/utilities/conda/walberla/meta.yaml
@@ -14,12 +14,10 @@ requirements:
   - make
   host:
   - python
-  - boost
   - mpich [linux]
   - openmesh
   run:
   - python
-  - boost
   - numpy
   - mpich [linux]
   - openmesh
-- 
GitLab