From 26ac8bb59479829584fab3cc54676b79f8307c42 Mon Sep 17 00:00:00 2001
From: Christian Godenschwager <christian.godenschwager@fau.de>
Date: Wed, 30 May 2018 15:53:51 +0200
Subject: [PATCH] Replace boost::bind with std::bind

Part of issue #48
---
 apps/benchmarks/CouetteFlow/CouetteFlow.cpp   |  8 +--
 .../ForcesOnSphereNearPlaneInShearFlow.cpp    |  6 +-
 .../MotionSingleHeavySphere.cpp               |  5 +-
 .../NonUniformGrid/NonUniformGrid.cpp         |  3 +-
 .../PoiseuilleChannel/PoiseuilleChannel.cpp   | 11 ++--
 .../SchaeferTurek/SchaeferTurek.cpp           |  9 +--
 .../BidisperseFluidizedBedDPM.cpp             | 40 ++++++------
 apps/tutorials/basics/02_Sweeps.cpp           |  4 +-
 apps/tutorials/pe/02_ConfinedGasExtended.cpp  | 10 +--
 src/blockforest/Initialization.cpp            |  4 +-
 src/blockforest/StructuredBlockForest.h       |  3 +-
 .../communication/NonUniformBufferedScheme.h  | 61 +++++++++----------
 .../communication/UniformBufferedScheme.h     | 26 ++++----
 .../communication/UniformDirectScheme.h       |  6 +-
 .../python/CommunicationExport.impl.h         |  4 +-
 src/core/DataTypes.h                          |  4 --
 src/core/Environment.cpp                      |  4 +-
 src/core/debug/Debug.h                        |  3 +-
 src/cuda/AddGPUFieldToStorage.impl.h          |  4 +-
 src/cuda/FieldCopy.h                          |  4 +-
 .../MakeBlockDataInitFunction.h               | 21 +++----
 .../StructuredBlockStorage.h                  |  6 +-
 src/field/StabilityChecker.h                  |  2 +-
 src/field/adaptors/AdaptorCreators.h          |  4 +-
 src/field/python/FieldExport.impl.h           |  8 +--
 src/lbm/BlockForestEvaluation.h               |  2 +-
 .../DefaultBoundaryHandlingCollection.h       |  4 +-
 .../DefaultDiffusionBoundaryHandling.h        |  4 +-
 src/lbm/python/ExportBasic.impl.h             |  4 +-
 src/lbm/python/ExportBoundary.impl.h          |  2 +-
 src/lbm/python/ExportSweeps.impl.h            |  2 +-
 src/pde/sweeps/RBGS.h                         |  6 +-
 src/pde/sweeps/RBGSFixedStencil.h             |  6 +-
 src/pde/sweeps/SOR.h                          |  6 +-
 src/pde/sweeps/SORFixedStencil.h              |  6 +-
 src/python_coupling/DictWrapper.h             |  4 +-
 src/python_coupling/DictWrapper.impl.h        |  4 +-
 src/python_coupling/Manager.h                 |  2 +-
 .../basic_exports/BasicExports.cpp            |  4 +-
 src/python_coupling/helper/MplHelpers.h       |  4 +-
 src/timeloop/PerformanceMeter.cpp             |  4 +-
 src/timeloop/PerformanceMeter.h               |  4 +-
 src/timeloop/SelectableFunctionCreators.h     |  3 +-
 src/vtk/Initialization.cpp                    |  9 +--
 tests/lbm/DiffusionTest.cpp                   | 12 ++--
 .../lbm/boundary/SimpleDiffusionDirichlet.cpp |  4 +-
 .../refinement/CommunicationEquivalence.cpp   |  5 +-
 tests/lbm/refinement/NonConstantDiffusion.cpp |  3 +-
 tests/lbm/refinement/Uniformity.cpp           |  5 +-
 tests/mesh/PeVTKMeshWriterTest.cpp            |  3 +-
 tests/pe/DeleteBody.cpp                       |  6 +-
 tests/pe/ShadowCopy.cpp                       |  6 +-
 .../HinderedSettlingDynamicsDPM.cpp           | 45 +++++++-------
 .../SphereWallCollisionBehaviorDPM.cpp        | 43 ++++++-------
 .../BodyAtBlockBoarderCheck.cpp               |  5 +-
 .../DragForceSphereMEMRefinement.cpp          |  3 +-
 ...lobalBodyAsBoundaryMEMStaticRefinement.cpp |  4 +-
 .../LubricationCorrectionMEM.cpp              |  4 +-
 .../PeriodicParticleChannelMEM.cpp            |  3 +-
 .../SegreSilberbergMEM.cpp                    | 10 +--
 .../SettlingSphereMEM.cpp                     | 10 +--
 .../SettlingSphereMEMDynamicRefinement.cpp    | 14 +++--
 .../SettlingSphereMEMStaticRefinement.cpp     | 12 ++--
 .../momentum_exchange_method/SquirmerTest.cpp |  5 +-
 .../TaylorCouetteFlowMEM.cpp                  |  4 +-
 .../DragForceSpherePSMRefinement.cpp          |  3 +-
 .../SegreSilberbergPSM.cpp                    |  4 +-
 67 files changed, 297 insertions(+), 256 deletions(-)

diff --git a/apps/benchmarks/CouetteFlow/CouetteFlow.cpp b/apps/benchmarks/CouetteFlow/CouetteFlow.cpp
index 815e6cdf1..fb9f383b9 100644
--- a/apps/benchmarks/CouetteFlow/CouetteFlow.cpp
+++ b/apps/benchmarks/CouetteFlow/CouetteFlow.cpp
@@ -91,7 +91,6 @@
 #include "vtk/Initialization.h"
 #include "vtk/VTKOutput.h"
 
-#include <boost/bind.hpp>
 #include <boost/mpl/or.hpp>
 #include <boost/type_traits/is_same.hpp>
 
@@ -99,6 +98,7 @@
 #include <cmath>
 #include <cstdlib>
 #include <cstring>
+#include <functional>
 #include <iostream>
 #include <utility>
 #include <vector>
@@ -294,7 +294,7 @@ static shared_ptr< SetupBlockForest > createSetupBlockForest( const blockforest:
                                                              ( setup.zCells + uint_t(2) * FieldGhostLayers ) ) * memoryPerCell;
 
    forest->addRefinementSelectionFunction( refinementSelectionFunctions );
-   forest->addWorkloadMemorySUIDAssignmentFunction( boost::bind( workloadAndMemoryAssignment, _1, memoryPerBlock ) );
+   forest->addWorkloadMemorySUIDAssignmentFunction( std::bind( workloadAndMemoryAssignment, std::placeholders::_1, memoryPerBlock ) );
 
    forest->init( AABB( real_c(0), real_c(0), real_c(0), real_c( setup.xBlocks * setup.xCells ),
                                                         real_c( setup.yBlocks * setup.yCells ),
@@ -736,11 +736,11 @@ void run( const shared_ptr< Config > & config, const LatticeModel_T & latticeMod
 
    // evaluation
 
-   const auto exactSolutionFunction = boost::bind( exactVelocity, _1, blocks->getDomain(), setup.maxVelocity_L );
+   const auto exactSolutionFunction = std::bind( exactVelocity, std::placeholders::_1, blocks->getDomain(), setup.maxVelocity_L );
 
    auto volumetricFlowRate = field::makeVolumetricFlowRateEvaluation< VelocityAdaptor_T, FlagField_T >( configBlock, blocks, velocityAdaptorId,
                                                                                                         flagFieldId, Fluid_Flag,
-                                                                                                        boost::bind( exactFlowRate, setup.flowRate_L ),
+                                                                                                        std::bind( exactFlowRate, setup.flowRate_L ),
                                                                                                         exactSolutionFunction );
    volumetricFlowRate->setNormalizationFactor( real_t(1) / setup.maxVelocity_L );
    volumetricFlowRate->setDomainNormalization( Vector3<real_t>( real_t(1) ) );
diff --git a/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp b/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
index 62cd5258d..64bc16481 100644
--- a/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
+++ b/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
@@ -62,6 +62,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace forces_on_sphere_near_plane_in_shear_flow
 {
 
@@ -177,7 +179,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const AABB & do
 
    WALBERLA_LOG_INFO_ON_ROOT(" - refinement box: " << refinementBox);
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, numberOfLevels, refinementBox ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, numberOfLevels, refinementBox ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( domainAABB, numberOfCoarseBlocksPerDirection[0], numberOfCoarseBlocksPerDirection[1], numberOfCoarseBlocksPerDirection[2], true, true, false );
@@ -576,7 +578,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
 
diff --git a/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp b/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
index fc6a084ff..825af2b2d 100644
--- a/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
+++ b/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
@@ -58,6 +58,7 @@
 #include "vtk/Initialization.h"
 #include "vtk/VTKOutput.h"
 
+#include <functional>
 #include <memory>
 
 
@@ -811,9 +812,9 @@ int main( int argc, char **argv )
    const real_t overlap = real_t( 1.5 ) * dx;
    std::function<void(void)> syncCall;
    if( XBlocks <= uint_t(4) )
-      syncCall = boost::bind( pe::syncNextNeighbors<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+      syncCall = std::bind( pe::syncNextNeighbors<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
    else
-      syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+      syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
 
    real_t xParticle = real_t(0);
diff --git a/apps/benchmarks/NonUniformGrid/NonUniformGrid.cpp b/apps/benchmarks/NonUniformGrid/NonUniformGrid.cpp
index 38057f0f3..0602976bc 100644
--- a/apps/benchmarks/NonUniformGrid/NonUniformGrid.cpp
+++ b/apps/benchmarks/NonUniformGrid/NonUniformGrid.cpp
@@ -76,6 +76,7 @@
 #include "vtk/VTKOutput.h"
 
 #include <cstdlib>
+#include <functional>
 #include <iostream>
 
 
@@ -279,7 +280,7 @@ void createSetupBlockForest( blockforest::SetupBlockForest & sforest, const Conf
                                                              uint_c( 19 * sizeof(real_t) ) ) / numeric_cast< memory_t >( 1024 * 1024 );
 
    sforest.addRefinementSelectionFunction( refinementSelection );
-   sforest.addWorkloadMemorySUIDAssignmentFunction( boost::bind( workloadAndMemoryAssignment, _1, memoryPerBlock ) );
+   sforest.addWorkloadMemorySUIDAssignmentFunction( std::bind( workloadAndMemoryAssignment, std::placeholders::_1, memoryPerBlock ) );
 
    sforest.init( AABB( real_t(0), real_t(0), real_t(0), real_c( numberOfXBlocks * numberOfXCellsPerBlock ),
                                                         real_c( numberOfYBlocks * numberOfYCellsPerBlock ),
diff --git a/apps/benchmarks/PoiseuilleChannel/PoiseuilleChannel.cpp b/apps/benchmarks/PoiseuilleChannel/PoiseuilleChannel.cpp
index d19c5f3c8..bba9184c5 100644
--- a/apps/benchmarks/PoiseuilleChannel/PoiseuilleChannel.cpp
+++ b/apps/benchmarks/PoiseuilleChannel/PoiseuilleChannel.cpp
@@ -88,12 +88,11 @@
 #include "vtk/Initialization.h"
 #include "vtk/VTKOutput.h"
 
-#include <boost/bind.hpp>
-
 #include <algorithm>
 #include <cmath>
 #include <cstdlib>
 #include <cstring>
+#include <functional>
 #include <iostream>
 #include <utility>
 #include <vector>
@@ -303,7 +302,7 @@ static shared_ptr< SetupBlockForest > createSetupBlockForest( const blockforest:
                                                              ( setup.zCells + uint_t(2) * FieldGhostLayers ) ) * memoryPerCell;
 
    forest->addRefinementSelectionFunction( refinementSelectionFunctions );
-   forest->addWorkloadMemorySUIDAssignmentFunction( boost::bind( workloadAndMemoryAssignment, _1, memoryPerBlock ) );
+   forest->addWorkloadMemorySUIDAssignmentFunction( std::bind( workloadAndMemoryAssignment, std::placeholders::_1, memoryPerBlock ) );
 
    forest->init( AABB( real_c(0), real_c(0), real_c(0), real_c( setup.xBlocks * setup.xCells ),
                                                         real_c( setup.yBlocks * setup.yCells ),
@@ -847,12 +846,12 @@ void run( const shared_ptr< Config > & config, const LatticeModel_T & latticeMod
                                                  
    // evaluation 
    
-   const auto exactSolutionFunction = setup.circularProfile ? boost::bind( exactPipeVelocity, _1, blocks, setup ) :
-                                                              boost::bind( exactPlatesVelocity, _1, blocks, setup );
+   const auto exactSolutionFunction = setup.circularProfile ? std::bind( exactPipeVelocity, std::placeholders::_1, blocks, setup ) :
+                                                              std::bind( exactPlatesVelocity, std::placeholders::_1, blocks, setup );
 
    auto volumetricFlowRate = field::makeVolumetricFlowRateEvaluation< VelocityAdaptor_T, FlagField_T >( configBlock, blocks, velocityAdaptorId,
                                                                                                         flagFieldId, Fluid_Flag,
-                                                                                                        boost::bind( exactFlowRate, setup.flowRate_L ),
+                                                                                                        std::bind( exactFlowRate, setup.flowRate_L ),
                                                                                                         exactSolutionFunction );
    volumetricFlowRate->setNormalizationFactor( real_t(1) / setup.maxVelocity_L );
    volumetricFlowRate->setDomainNormalization( Vector3<real_t>( real_t(1) ) );
diff --git a/apps/benchmarks/SchaeferTurek/SchaeferTurek.cpp b/apps/benchmarks/SchaeferTurek/SchaeferTurek.cpp
index ed907fc37..b7f9d2997 100644
--- a/apps/benchmarks/SchaeferTurek/SchaeferTurek.cpp
+++ b/apps/benchmarks/SchaeferTurek/SchaeferTurek.cpp
@@ -106,12 +106,12 @@
 #include <boost/mpl/equal_to.hpp>
 #include <boost/mpl/int.hpp>
 #include <boost/mpl/or.hpp>
-#include <boost/bind.hpp>
 
 #include <algorithm>
 #include <cmath>
 #include <cstdlib>
 #include <cstring>
+#include <functional>
 #include <iostream>
 #include <utility>
 #include <vector>
@@ -656,7 +656,7 @@ static shared_ptr< SetupBlockForest > createSetupBlockForest( const blockforest:
                                                              ( setup.xCells + uint_t(2) * FieldGhostLayers ) ) * memoryPerCell;
 
    forest->addRefinementSelectionFunction( refinementSelectionFunctions );
-   forest->addWorkloadMemorySUIDAssignmentFunction( boost::bind( workloadMemoryAndSUIDAssignment, _1, memoryPerBlock, boost::cref( setup ) ) );
+   forest->addWorkloadMemorySUIDAssignmentFunction( std::bind( workloadMemoryAndSUIDAssignment, std::placeholders::_1, memoryPerBlock, std::cref( setup ) ) );
 
    forest->init( AABB( real_c(0), real_c(0), real_c(0),
                        setup.H * ( real_c(setup.xBlocks) * real_c(setup.xCells) ) / ( real_c(setup.yzBlocks) * real_c(setup.yzCells) ), setup.H, setup.H ),
@@ -2602,7 +2602,8 @@ void run( const shared_ptr< Config > & config, const LatticeModel_T & latticeMod
          adaptiveRefinementLog = oss.str();
       }
 
-      minTargetLevelDeterminationFunctions.add( boost::bind( keepInflowOutflowAtTheSameLevel, _1, _2, _3, boost::cref(setup) ) );
+      minTargetLevelDeterminationFunctions.add( std::bind( keepInflowOutflowAtTheSameLevel, std::placeholders::_1, std::placeholders::_2, 
+                                                           std::placeholders::_3, std::cref(setup) ) );
 
       if( Is2D< LatticeModel_T >::value )
          minTargetLevelDeterminationFunctions.add( pseudo2DTargetLevelCorrection );
@@ -3171,7 +3172,7 @@ int main( int argc, char **argv )
       refinementSelectionFunctions.add( cylinderRefinementSelection );
    }
 
-   refinementSelectionFunctions.add( boost::bind( setInflowOutflowToSameLevel, _1, setup ) );
+   refinementSelectionFunctions.add( std::bind( setInflowOutflowToSameLevel, std::placeholders::_1, setup ) );
 
    if( setup.pseudo2D )
       refinementSelectionFunctions.add( Pseudo2DRefinementSelectionCorrection );
diff --git a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
index de0512d8d..b175c7c1d 100644
--- a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
+++ b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
@@ -889,7 +889,7 @@ int main( int argc, char **argv ) {
 
    // connect to pe
    const real_t overlap = real_t(1.5) * dx;
-   auto syncCall = boost::bind(pe::syncNextNeighbors<BodyTypeTuple>, boost::ref(blocks->getBlockForest()),
+   auto syncCall = std::bind(pe::syncNextNeighbors<BodyTypeTuple>, std::ref(blocks->getBlockForest()),
                                bodyStorageID, static_cast<WcTimingTree *>(NULL), overlap, false);
    shared_ptr<CollisionPropertiesEvaluator> collisionPropertiesEvaluator = walberla::make_shared<CollisionPropertiesEvaluator>(*cr);
 
@@ -1196,7 +1196,7 @@ int main( int argc, char **argv ) {
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::NearestNeighborFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -1204,7 +1204,7 @@ int main( int argc, char **argv ) {
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       } else if (interpol == Interpolation::IKernel) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -1214,7 +1214,7 @@ int main( int argc, char **argv ) {
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::KernelFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -1222,7 +1222,7 @@ int main( int argc, char **argv ) {
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       } else if (interpol == Interpolation::ITrilinear) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -1232,7 +1232,7 @@ int main( int argc, char **argv ) {
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::TrilinearFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -1240,7 +1240,7 @@ int main( int argc, char **argv ) {
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       }
    }
@@ -1260,7 +1260,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1268,7 +1268,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::IKernel )
@@ -1279,7 +1279,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1287,7 +1287,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::ITrilinear )
@@ -1298,7 +1298,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1306,7 +1306,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
 
@@ -1320,7 +1320,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1328,7 +1328,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::IKernel )
@@ -1339,7 +1339,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1347,7 +1347,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::ITrilinear )
@@ -1358,7 +1358,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1366,7 +1366,7 @@ int main( int argc, char **argv ) {
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
 
@@ -1376,7 +1376,7 @@ int main( int argc, char **argv ) {
    {
       typedef pe_coupling::discrete_particle_methods::LubricationForceEvaluator LE_T;
       shared_ptr<LE_T> lubEval = make_shared<LE_T>( blocks, globalBodyStorage, bodyStorageID, viscosity, lubricationCutOffDistance );
-      lubricationEvaluationFunction = boost::bind(&LE_T::operator(), lubEval);
+      lubricationEvaluationFunction = std::bind(&LE_T::operator(), lubEval);
    }
    else
    {
diff --git a/apps/tutorials/basics/02_Sweeps.cpp b/apps/tutorials/basics/02_Sweeps.cpp
index 03ef87b5e..95c0cf1ab 100644
--- a/apps/tutorials/basics/02_Sweeps.cpp
+++ b/apps/tutorials/basics/02_Sweeps.cpp
@@ -24,7 +24,7 @@
 #include "gui/Gui.h"
 #include "timeloop/SweepTimeloop.h"
 
-#include <boost/bind.hpp>
+#include <functional>
 
 
 using namespace walberla;
@@ -125,7 +125,7 @@ int main( int argc, char ** argv )
 
    // registering the function sweep
    auto pointerToTwoArgFunction = & simpleSweep;
-   auto pointerToOneArgFunction = boost::bind( pointerToTwoArgFunction, _1, fieldID );
+   auto pointerToOneArgFunction = std::bind( pointerToTwoArgFunction, std::placeholders::_1, fieldID );
    timeloop.add() << Sweep( pointerToOneArgFunction, "BogusAlgorithm" );
 
    // registering the class sweep
diff --git a/apps/tutorials/pe/02_ConfinedGasExtended.cpp b/apps/tutorials/pe/02_ConfinedGasExtended.cpp
index b1ac3e4a3..da217ac17 100644
--- a/apps/tutorials/pe/02_ConfinedGasExtended.cpp
+++ b/apps/tutorials/pe/02_ConfinedGasExtended.cpp
@@ -32,6 +32,8 @@
 #include <postprocessing/sqlite/SQLite.h>
 #include <vtk/VTKOutput.h>
 
+#include <functional>
+
 using namespace walberla;
 using namespace walberla::pe;
 using namespace walberla::timing;
@@ -150,20 +152,20 @@ int main( int argc, char ** argv )
    std::function<void(void)> syncCall;
    if (!syncShadowOwners)
    {
-      syncCall = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(*forest), storageID, &tt, real_c(0.0), false );
+      syncCall = std::bind( pe::syncNextNeighbors<BodyTuple>, std::ref(*forest), storageID, &tt, real_c(0.0), false );
    } else
    {
-      syncCall = boost::bind( pe::syncShadowOwners<BodyTuple>, boost::ref(*forest), storageID, &tt, real_c(0.0), false );
+      syncCall = std::bind( pe::syncShadowOwners<BodyTuple>, std::ref(*forest), storageID, &tt, real_c(0.0), false );
    }
 
    //! [Bind Sync Call]
    std::function<void(void)> syncCallWithoutTT;
    if (!syncShadowOwners)
    {
-      syncCallWithoutTT = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(*forest), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+      syncCallWithoutTT = std::bind( pe::syncNextNeighbors<BodyTuple>, std::ref(*forest), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
    } else
    {
-      syncCallWithoutTT = boost::bind( pe::syncShadowOwners<BodyTuple>, boost::ref(*forest), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+      syncCallWithoutTT = std::bind( pe::syncShadowOwners<BodyTuple>, std::ref(*forest), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
    }
    //! [Bind Sync Call]
 
diff --git a/src/blockforest/Initialization.cpp b/src/blockforest/Initialization.cpp
index 8704ae5f0..dea96fed6 100644
--- a/src/blockforest/Initialization.cpp
+++ b/src/blockforest/Initialization.cpp
@@ -31,6 +31,8 @@
 
 #include "stencil/D3Q19.h"
 
+#include <functional>
+
 namespace walberla {
 namespace blockforest {
 
@@ -500,7 +502,7 @@ createUniformBlockGrid( const AABB& domainAABB,
                                                                numeric_cast< memory_t >( maxBlocksPerProcess );
 
    GlobalLoadBalancing::MetisConfiguration< SetupBlock > metisConfig( includeMetis, forceMetis,
-                                                                      boost::bind( cellWeightedCommunicationCost,_1,_2,
+                                                                      std::bind( cellWeightedCommunicationCost, std::placeholders::_1, std::placeholders::_2,
                                                                                    numberOfXCellsPerBlock,
                                                                                    numberOfYCellsPerBlock,
                                                                                    numberOfZCellsPerBlock ) );
diff --git a/src/blockforest/StructuredBlockForest.h b/src/blockforest/StructuredBlockForest.h
index 82f4e810d..ac021fe66 100644
--- a/src/blockforest/StructuredBlockForest.h
+++ b/src/blockforest/StructuredBlockForest.h
@@ -24,6 +24,7 @@
 #include "BlockForest.h"
 #include "domain_decomposition/StructuredBlockStorage.h"
 
+#include <functional>
 
 namespace walberla {
 namespace blockforest {
@@ -205,7 +206,7 @@ inline StructuredBlockForest::StructuredBlockForest( const shared_ptr< BlockFore
    blockForest_( blockForest ) {
 
    blockForest_->addRefreshCallbackFunctionBeforeBlockDataIsUnpacked(
-            BlockForest::RefreshCallbackWrappper( boost::bind( resetCellDecompositionInStorage, boost::ref(*this) ) ) );
+            BlockForest::RefreshCallbackWrappper( std::bind( resetCellDecompositionInStorage, std::ref(*this) ) ) );
 
    blockCells_[0] = blockXCells;
    blockCells_[1] = blockYCells;
diff --git a/src/blockforest/communication/NonUniformBufferedScheme.h b/src/blockforest/communication/NonUniformBufferedScheme.h
index e2eca543d..3e206f36d 100644
--- a/src/blockforest/communication/NonUniformBufferedScheme.h
+++ b/src/blockforest/communication/NonUniformBufferedScheme.h
@@ -36,10 +36,9 @@
 #include "core/selectable/IsSetSelected.h"
 #include "core/uid/SUID.h"
 
-#include <boost/bind.hpp>
-#include <functional>
 
 #include <map>
+#include <functional>
 #include <set>
 #include <vector>
 
@@ -110,7 +109,7 @@ public:
    //@{
 
    void startCommunication() { startCommunicateEqualLevel(); startCommunicateCoarseToFine(); startCommunicateFineToCoarse(); }
-   std::function<void()>  getStartCommunicateFunctor() { return boost::bind( &NonUniformBufferedScheme::startCommunication, this ); }
+   std::function<void()>  getStartCommunicateFunctor() { return std::bind( &NonUniformBufferedScheme::startCommunication, this ); }
 
    inline void startCommunicateEqualLevel();
    inline void startCommunicateCoarseToFine();
@@ -121,7 +120,7 @@ public:
    inline void startCommunicateFineToCoarse( const uint_t fineLevel );
    
    void wait() { waitCommunicateEqualLevel(); waitCommunicateCoarseToFine(); waitCommunicateFineToCoarse(); }
-   std::function<void() >  getWaitFunctor() { return boost::bind( &NonUniformBufferedScheme::wait, this ); }
+   std::function<void() >  getWaitFunctor() { return std::bind( &NonUniformBufferedScheme::wait, this ); }
 
    inline void waitCommunicateEqualLevel();
    inline void waitCommunicateCoarseToFine();
@@ -659,13 +658,13 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationEqualLevel( const uint
                      localBuffers.push_back( buffer );
                      const uint_t bufferIndex = uint_c( localBuffers.size() ) - uint_t(1);
 
-                     VoidFunction pack = boost::bind( &NonUniformBufferedScheme<Stencil>::localBufferPacking, this,
-                                                      EQUAL_LEVEL, index, bufferIndex, boost::cref( *packInfo ), block, neighbor, *dir );
+                     VoidFunction pack = std::bind( &NonUniformBufferedScheme<Stencil>::localBufferPacking, this,
+                                                      EQUAL_LEVEL, index, bufferIndex, std::cref( *packInfo ), block, neighbor, *dir );
 
                      threadsafeLocalCommunication.push_back( pack );
 
-                     VoidFunction unpack = boost::bind( &NonUniformBufferedScheme<Stencil>::localBufferUnpacking, this,
-                                                        EQUAL_LEVEL, index, bufferIndex, boost::cref( *packInfo ), neighbor, block, *dir  );
+                     VoidFunction unpack = std::bind( &NonUniformBufferedScheme<Stencil>::localBufferUnpacking, this,
+                                                        EQUAL_LEVEL, index, bufferIndex, std::cref( *packInfo ), neighbor, block, *dir  );
 
                      if( (*packInfo)->threadsafeReceiving() )
                         threadsafeLocalCommunicationUnpack.push_back( unpack );
@@ -674,7 +673,7 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationEqualLevel( const uint
                   }
                   else
                   {
-                     VoidFunction localCommunicationFunction = boost::bind( &blockforest::communication::NonUniformPackInfo::communicateLocalEqualLevel,
+                     VoidFunction localCommunicationFunction = std::bind( &blockforest::communication::NonUniformPackInfo::communicateLocalEqualLevel,
                                                                             *packInfo, block, neighbor, *dir );
                      if( (*packInfo)->threadsafeReceiving() )
                         threadsafeLocalCommunication.push_back( localCommunicationFunction );
@@ -688,10 +687,10 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationEqualLevel( const uint
                auto nProcess = block->getNeighborProcess( neighborIdx, uint_t(0) );
 
                if( !packInfos_.empty() )
-                  sendFunctions[ nProcess ].push_back( boost::bind( NonUniformBufferedScheme<Stencil>::writeHeader, _1, block->getId(), receiverId, *dir ) );
+                  sendFunctions[ nProcess ].push_back( std::bind( NonUniformBufferedScheme<Stencil>::writeHeader, std::placeholders::_1, block->getId(), receiverId, *dir ) );
 
                for( auto packInfo = packInfos_.begin(); packInfo != packInfos_.end(); ++packInfo )
-                  sendFunctions[ nProcess ].push_back( boost::bind( &blockforest::communication::NonUniformPackInfo::packDataEqualLevel, *packInfo, block, *dir, _1 ) );
+                  sendFunctions[ nProcess ].push_back( std::bind( &blockforest::communication::NonUniformPackInfo::packDataEqualLevel, *packInfo, block, *dir, std::placeholders::_1 ) );
             }
          }
       }
@@ -700,8 +699,8 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationEqualLevel( const uint
 
       for( auto sender = sendFunctions.begin(); sender != sendFunctions.end(); ++sender )
       {
-         bufferSystem->addSendingFunction  ( int_c(sender->first), boost::bind(  NonUniformBufferedScheme<Stencil>::send, _1, sender->second ) );
-         bufferSystem->addReceivingFunction( int_c(sender->first), boost::bind( &NonUniformBufferedScheme<Stencil>::receive, this, _1 ) );
+         bufferSystem->addSendingFunction  ( int_c(sender->first), std::bind(  NonUniformBufferedScheme<Stencil>::send, std::placeholders::_1, sender->second ) );
+         bufferSystem->addReceivingFunction( int_c(sender->first), std::bind( &NonUniformBufferedScheme<Stencil>::receive, this, std::placeholders::_1 ) );
       }
 
       setupBeforeNextCommunication = char(0);
@@ -785,13 +784,13 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationCoarseToFine( const ui
                            localBuffers.push_back( buffer );
                            const uint_t bufferIndex = uint_c( localBuffers.size() ) - uint_t(1);
 
-                           VoidFunction pack = boost::bind( &NonUniformBufferedScheme<Stencil>::localBufferPacking, this,
-                                                            COARSE_TO_FINE, index, bufferIndex, boost::cref( *packInfo ), block, neighbor, *dir );
+                           VoidFunction pack = std::bind( &NonUniformBufferedScheme<Stencil>::localBufferPacking, this,
+                                                            COARSE_TO_FINE, index, bufferIndex, std::cref( *packInfo ), block, neighbor, *dir );
 
                            threadsafeLocalCommunication.push_back( pack );
 
-                           VoidFunction unpack = boost::bind( &NonUniformBufferedScheme<Stencil>::localBufferUnpacking, this,
-                                                              COARSE_TO_FINE, index, bufferIndex, boost::cref( *packInfo ), neighbor, block, *dir  );
+                           VoidFunction unpack = std::bind( &NonUniformBufferedScheme<Stencil>::localBufferUnpacking, this,
+                                                              COARSE_TO_FINE, index, bufferIndex, std::cref( *packInfo ), neighbor, block, *dir  );
 
                            if( (*packInfo)->threadsafeReceiving() )
                               threadsafeLocalCommunicationUnpack.push_back( unpack );
@@ -800,7 +799,7 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationCoarseToFine( const ui
                         }
                         else
                         {
-                           VoidFunction localCommunicationFunction = boost::bind( &blockforest::communication::NonUniformPackInfo::communicateLocalCoarseToFine,
+                           VoidFunction localCommunicationFunction = std::bind( &blockforest::communication::NonUniformPackInfo::communicateLocalCoarseToFine,
                                                                                   *packInfo, block, neighbor, *dir );
                            if( (*packInfo)->threadsafeReceiving() )
                               threadsafeLocalCommunication.push_back( localCommunicationFunction );
@@ -814,10 +813,10 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationCoarseToFine( const ui
                      auto nProcess = block->getNeighborProcess( neighborIdx, n );
 
                      if( !packInfos_.empty() )
-                        sendFunctions[ nProcess ].push_back( boost::bind( NonUniformBufferedScheme<Stencil>::writeHeader, _1, block->getId(), receiverId, *dir ) );
+                        sendFunctions[ nProcess ].push_back( std::bind( NonUniformBufferedScheme<Stencil>::writeHeader, std::placeholders::_1, block->getId(), receiverId, *dir ) );
 
                      for( auto packInfo = packInfos_.begin(); packInfo != packInfos_.end(); ++packInfo )
-                        sendFunctions[ nProcess ].push_back( boost::bind( &blockforest::communication::NonUniformPackInfo::packDataCoarseToFine, *packInfo, block, receiverId, *dir, _1 ) );
+                        sendFunctions[ nProcess ].push_back( std::bind( &blockforest::communication::NonUniformPackInfo::packDataCoarseToFine, *packInfo, block, receiverId, *dir, std::placeholders::_1 ) );
                   }
                }
             }
@@ -844,10 +843,10 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationCoarseToFine( const ui
       resetBufferSystem( bufferSystem );
 
       for( auto sender = sendFunctions.begin(); sender != sendFunctions.end(); ++sender )
-         bufferSystem->addSendingFunction( int_c(sender->first), boost::bind(  NonUniformBufferedScheme<Stencil>::send, _1, sender->second ) );
+         bufferSystem->addSendingFunction( int_c(sender->first), std::bind(  NonUniformBufferedScheme<Stencil>::send, std::placeholders::_1, sender->second ) );
 
       for( auto receiver = ranksToReceiveFrom.begin(); receiver != ranksToReceiveFrom.end(); ++receiver )
-         bufferSystem->addReceivingFunction( int_c(*receiver), boost::bind( &NonUniformBufferedScheme<Stencil>::receive, this, _1 ) );
+         bufferSystem->addReceivingFunction( int_c(*receiver), std::bind( &NonUniformBufferedScheme<Stencil>::receive, this, std::placeholders::_1 ) );
 
       setupBeforeNextCommunication = char(0);
    }
@@ -931,13 +930,13 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationFineToCoarse( const ui
                         localBuffers.push_back( buffer );
                         const uint_t bufferIndex = uint_c( localBuffers.size() ) - uint_t(1);
 
-                        VoidFunction pack = boost::bind( &NonUniformBufferedScheme<Stencil>::localBufferPacking, this,
-                                                         FINE_TO_COARSE, index, bufferIndex, boost::cref( *packInfo ), block, neighbor, *dir );
+                        VoidFunction pack = std::bind( &NonUniformBufferedScheme<Stencil>::localBufferPacking, this,
+                                                         FINE_TO_COARSE, index, bufferIndex, std::cref( *packInfo ), block, neighbor, *dir );
 
                         threadsafeLocalCommunication.push_back( pack );
 
-                        VoidFunction unpack = boost::bind( &NonUniformBufferedScheme<Stencil>::localBufferUnpacking, this,
-                                                           FINE_TO_COARSE, index, bufferIndex, boost::cref( *packInfo ), neighbor, block, *dir  );
+                        VoidFunction unpack = std::bind( &NonUniformBufferedScheme<Stencil>::localBufferUnpacking, this,
+                                                           FINE_TO_COARSE, index, bufferIndex, std::cref( *packInfo ), neighbor, block, *dir  );
 
                         if( (*packInfo)->threadsafeReceiving() )
                            threadsafeLocalCommunicationUnpack.push_back( unpack );
@@ -946,7 +945,7 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationFineToCoarse( const ui
                      }
                      else
                      {
-                        VoidFunction localCommunicationFunction = boost::bind( &blockforest::communication::NonUniformPackInfo::communicateLocalFineToCoarse,
+                        VoidFunction localCommunicationFunction = std::bind( &blockforest::communication::NonUniformPackInfo::communicateLocalFineToCoarse,
                                                                                *packInfo, block, neighbor, *dir );
                         if( (*packInfo)->threadsafeReceiving() )
                            threadsafeLocalCommunication.push_back( localCommunicationFunction );
@@ -960,10 +959,10 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationFineToCoarse( const ui
                   auto nProcess = block->getNeighborProcess( neighborIdx, uint_t(0) );
 
                   if( !packInfos_.empty() )
-                     sendFunctions[ nProcess ].push_back( boost::bind( NonUniformBufferedScheme<Stencil>::writeHeader, _1, block->getId(), receiverId, *dir ) );
+                     sendFunctions[ nProcess ].push_back( std::bind( NonUniformBufferedScheme<Stencil>::writeHeader, std::placeholders::_1, block->getId(), receiverId, *dir ) );
 
                   for( auto packInfo = packInfos_.begin(); packInfo != packInfos_.end(); ++packInfo )
-                     sendFunctions[ nProcess ].push_back( boost::bind( &blockforest::communication::NonUniformPackInfo::packDataFineToCoarse, *packInfo, block, receiverId, *dir, _1 ) );
+                     sendFunctions[ nProcess ].push_back( std::bind( &blockforest::communication::NonUniformPackInfo::packDataFineToCoarse, *packInfo, block, receiverId, *dir, std::placeholders::_1 ) );
                }
             }
          }
@@ -989,10 +988,10 @@ void NonUniformBufferedScheme<Stencil>::startCommunicationFineToCoarse( const ui
       resetBufferSystem( bufferSystem );
 
       for( auto sender = sendFunctions.begin(); sender != sendFunctions.end(); ++sender )
-         bufferSystem->addSendingFunction( int_c(sender->first), boost::bind(  NonUniformBufferedScheme<Stencil>::send, _1, sender->second ) );
+         bufferSystem->addSendingFunction( int_c(sender->first), std::bind(  NonUniformBufferedScheme<Stencil>::send, std::placeholders::_1, sender->second ) );
 
       for( auto receiver = ranksToReceiveFrom.begin(); receiver != ranksToReceiveFrom.end(); ++receiver )
-         bufferSystem->addReceivingFunction( int_c(*receiver), boost::bind( &NonUniformBufferedScheme<Stencil>::receive, this, _1 ) );
+         bufferSystem->addReceivingFunction( int_c(*receiver), std::bind( &NonUniformBufferedScheme<Stencil>::receive, this, std::placeholders::_1 ) );
 
       setupBeforeNextCommunication = char(0);
    }
diff --git a/src/blockforest/communication/UniformBufferedScheme.h b/src/blockforest/communication/UniformBufferedScheme.h
index 393301f6c..1abd5a955 100644
--- a/src/blockforest/communication/UniformBufferedScheme.h
+++ b/src/blockforest/communication/UniformBufferedScheme.h
@@ -38,9 +38,7 @@
 #include "core/selectable/IsSetSelected.h"
 #include "core/uid/SUID.h"
 
-#include <boost/bind.hpp>
 #include <functional>
-
 #include <map>
 #include <vector>
 
@@ -321,13 +319,13 @@ void UniformBufferedScheme<Stencil>::startCommunication()
                      localBuffers_.push_back( buffer );
                      const uint_t index = uint_c( localBuffers_.size() ) - uint_t(1);
 
-                     VoidFunction pack = boost::bind( &UniformBufferedScheme<Stencil>::localBufferPacking, this,
-                                                      index, boost::cref( *packInfo ), block, *dir );
+                     VoidFunction pack = std::bind( &UniformBufferedScheme<Stencil>::localBufferPacking, this,
+                                                      index, std::cref( *packInfo ), block, *dir );
 
                      threadsafeLocalCommunication_.push_back( pack );
 
-                     VoidFunction unpack = boost::bind( &UniformBufferedScheme<Stencil>::localBufferUnpacking, this,
-                                                        index, boost::cref( *packInfo ), neighbor, *dir  );
+                     VoidFunction unpack = std::bind( &UniformBufferedScheme<Stencil>::localBufferUnpacking, this,
+                                                        index, std::cref( *packInfo ), neighbor, *dir  );
 
                      if( (*packInfo)->threadsafeReceiving() )
                         threadsafeLocalCommunicationUnpack_.push_back( unpack );
@@ -336,7 +334,7 @@ void UniformBufferedScheme<Stencil>::startCommunication()
                   }
                   else
                   {
-                     VoidFunction localCommunicationFunction = boost::bind( &walberla::communication::UniformPackInfo::communicateLocal,
+                     VoidFunction localCommunicationFunction = std::bind( &walberla::communication::UniformPackInfo::communicateLocal,
                                                                             *packInfo, block, neighbor, *dir );
                      if( (*packInfo)->threadsafeReceiving() )
                         threadsafeLocalCommunication_.push_back( localCommunicationFunction );
@@ -350,11 +348,11 @@ void UniformBufferedScheme<Stencil>::startCommunication()
                auto nProcess = block->getNeighborProcess( neighborIdx, uint_t(0) );
 
                if( !packInfos_.empty() )
-                  sendFunctions[ nProcess ].push_back( boost::bind( UniformBufferedScheme<Stencil>::writeHeader, _1, nBlockId, *dir ) );
+                  sendFunctions[ nProcess ].push_back( std::bind( UniformBufferedScheme<Stencil>::writeHeader, std::placeholders::_1, nBlockId, *dir ) );
 
                for( auto packInfo = packInfos_.begin(); packInfo != packInfos_.end(); ++packInfo )
-                  sendFunctions[ nProcess ].push_back( boost::bind( &walberla::communication::UniformPackInfo::packData,
-                                                                     *packInfo, block, *dir, _1 ) );
+                  sendFunctions[ nProcess ].push_back( std::bind( &walberla::communication::UniformPackInfo::packData,
+                                                                     *packInfo, block, *dir,  std::placeholders::_1 ) );
             }
          }
       }
@@ -368,8 +366,8 @@ void UniformBufferedScheme<Stencil>::startCommunication()
 
       for( auto sender = sendFunctions.begin(); sender != sendFunctions.end(); ++sender )
       {
-         bufferSystem_.addSendingFunction  ( int_c(sender->first), boost::bind(  UniformBufferedScheme<Stencil>::send, _1, sender->second ) );
-         bufferSystem_.addReceivingFunction( int_c(sender->first), boost::bind( &UniformBufferedScheme<Stencil>::receive, this, _1 ) );
+         bufferSystem_.addSendingFunction  ( int_c(sender->first), std::bind(  UniformBufferedScheme<Stencil>::send, std::placeholders::_1, sender->second ) );
+         bufferSystem_.addReceivingFunction( int_c(sender->first), std::bind( &UniformBufferedScheme<Stencil>::receive, this, std::placeholders::_1 ) );
       }
 
       setupBeforeNextCommunication_ = false;
@@ -539,13 +537,13 @@ void UniformBufferedScheme<Stencil>::localBufferUnpacking( const uint_t index, c
 template< typename Stencil >
 std::function<void()> UniformBufferedScheme<Stencil>::getStartCommunicateFunctor()
 {
-   return boost::bind( &UniformBufferedScheme::startCommunication, this );
+   return std::bind( &UniformBufferedScheme::startCommunication, this );
 }
 
 template< typename Stencil >
 std::function<void()> UniformBufferedScheme<Stencil>::getWaitFunctor()
 {
-   return boost::bind( &UniformBufferedScheme::wait, this );
+   return std::bind( &UniformBufferedScheme::wait, this );
 }
 
 
diff --git a/src/blockforest/communication/UniformDirectScheme.h b/src/blockforest/communication/UniformDirectScheme.h
index 16d6e9fdd..863930893 100644
--- a/src/blockforest/communication/UniformDirectScheme.h
+++ b/src/blockforest/communication/UniformDirectScheme.h
@@ -32,6 +32,8 @@
 
 #include <vector>
 #include <map>
+#include <functional>
+
 #include "communication/UniformMPIDatatypeInfo.h"
 
 namespace walberla {
@@ -112,8 +114,8 @@ public:
    void startCommunication();
    void wait();
 
-   std::function<void()> getStartCommunicateFunctor() { return boost::bind( &UniformDirectScheme::startCommunication, this ); }
-   std::function<void()> getWaitFunctor()             { return boost::bind( &UniformDirectScheme::wait,               this ); }
+   std::function<void()> getStartCommunicateFunctor() { return std::bind( &UniformDirectScheme::startCommunication, this ); }
+   std::function<void()> getWaitFunctor()             { return std::bind( &UniformDirectScheme::wait,               this ); }
    //@}
    //*******************************************************************************************************************
 
diff --git a/src/blockforest/python/CommunicationExport.impl.h b/src/blockforest/python/CommunicationExport.impl.h
index 934058546..09041944f 100644
--- a/src/blockforest/python/CommunicationExport.impl.h
+++ b/src/blockforest/python/CommunicationExport.impl.h
@@ -106,7 +106,7 @@ namespace internal
                                                       const int tag )
    {
       UniformBufferedSchemeCreator creator( bf, stencil, tag );
-      python_coupling::for_each_noncopyable_type< Stencils >  ( boost::ref(creator) );
+      python_coupling::for_each_noncopyable_type< Stencils >  ( std::ref(creator) );
 
       if ( creator.getResult() == boost::python::object() )
       {
@@ -185,7 +185,7 @@ namespace internal
                                                     const std::string & stencil, const int tag )
    {
       UniformDirectSchemeCreator creator( bf, stencil, tag );
-      python_coupling::for_each_noncopyable_type< Stencils >  ( boost::ref(creator) );
+      python_coupling::for_each_noncopyable_type< Stencils >  ( std::ref(creator) );
 
       if ( creator.getResult() == boost::python::object() )
       {
diff --git a/src/core/DataTypes.h b/src/core/DataTypes.h
index b0442f524..4c348dfe7 100644
--- a/src/core/DataTypes.h
+++ b/src/core/DataTypes.h
@@ -42,7 +42,6 @@ namespace walberla {
 template <typename> struct never_true : std::false_type {};
 
 
-
 // shared ptr
 
 using std::shared_ptr;
@@ -50,9 +49,6 @@ using std::weak_ptr;
 using std::make_shared;
 using std::dynamic_pointer_cast;
 
-// functions, use this when "function" namespace is no longer needed
-//using std::function;
-//using std::bind;
 
 // numeric cast (performs range checks in debug mode)
 
diff --git a/src/core/Environment.cpp b/src/core/Environment.cpp
index 6e6958654..17f2e990b 100644
--- a/src/core/Environment.cpp
+++ b/src/core/Environment.cpp
@@ -31,10 +31,10 @@
 #include "core/uid/SUID.h"
 
 #include <boost/algorithm/string.hpp>
-#include <boost/bind.hpp>
 #include <boost/foreach.hpp>
 
 #include <algorithm>
+#include <functional>
 #include <sstream>
 #include <string>
 
@@ -85,7 +85,7 @@ void configureGlobalState( const shared_ptr<Config> & config ) {
 
       std::vector< std::string > states;
       boost::split( states, suids, boost::is_any_of(", \t") );
-      states.erase( std::remove_if( states.begin(), states.end(), boost::bind( &std::string::empty, _1 ) ), states.end() );
+      states.erase( std::remove_if( states.begin(), states.end(), std::bind( &std::string::empty, std::placeholders::_1 ) ), states.end() );
 
       Set<SUID> state;
       for( auto it = states.begin(); it != states.end(); ++it )
diff --git a/src/core/debug/Debug.h b/src/core/debug/Debug.h
index 3ea4bcd05..ac3f0f3e2 100644
--- a/src/core/debug/Debug.h
+++ b/src/core/debug/Debug.h
@@ -26,7 +26,6 @@
 #ifndef NDEBUG
 #   include "CheckFunctions.h"
 #   include <functional>
-#   include <boost/bind.hpp>
 #   include <string>
 #endif
 
@@ -265,7 +264,7 @@ private:
 /// \endcond
 
 #define WALBERLA_ASSERT_SECTION(condition) if(true)\
-   if(const walberla::debug::ConditionalExec COND_EXEC = walberla::debug::ConditionalExec(!(condition),boost::bind(walberla::debug::myAssert,__FILE__,__LINE__)))
+   if(const walberla::debug::ConditionalExec COND_EXEC = walberla::debug::ConditionalExec(!(condition),std::bind(walberla::debug::myAssert,__FILE__,__LINE__)))
 
 #else
 
diff --git a/src/cuda/AddGPUFieldToStorage.impl.h b/src/cuda/AddGPUFieldToStorage.impl.h
index 03b90c728..1befc3e81 100644
--- a/src/cuda/AddGPUFieldToStorage.impl.h
+++ b/src/cuda/AddGPUFieldToStorage.impl.h
@@ -73,7 +73,7 @@ namespace cuda {
                                     uint_t nrOfGhostLayers,
                                     bool usePitchedMem )
    {
-      auto func = boost::bind ( internal::createGPUField<GPUField_T>, _1, _2, nrOfGhostLayers, fSize, layout, usePitchedMem );
+      auto func = std::bind ( internal::createGPUField<GPUField_T>, std::placeholders::_1, std::placeholders::_2, nrOfGhostLayers, fSize, layout, usePitchedMem );
       return bs->addStructuredBlockData< GPUField_T >( func, identifier );
    }
 
@@ -84,7 +84,7 @@ namespace cuda {
                                      const std::string & identifier,
                                      bool usePitchedMem )
    {
-      auto func = boost::bind ( internal::createGPUFieldFromCPUField<Field_T>, _1, _2, cpuFieldID, usePitchedMem );
+      auto func = std::bind ( internal::createGPUFieldFromCPUField<Field_T>, std::placeholders::_1, std::placeholders::_2, cpuFieldID, usePitchedMem );
       return bs->addStructuredBlockData< GPUField<typename Field_T::value_type> >( func, identifier );
    }
 
diff --git a/src/cuda/FieldCopy.h b/src/cuda/FieldCopy.h
index 07fd04c80..4f13fa999 100644
--- a/src/cuda/FieldCopy.h
+++ b/src/cuda/FieldCopy.h
@@ -52,7 +52,7 @@ namespace cuda {
    std::function<void()> fieldCpyFunctor( const shared_ptr< StructuredBlockStorage > & blocks,
                                             BlockDataID dstID, ConstBlockDataID srcID )
    {
-      return boost::bind( fieldCpy<DstType,SrcType>, blocks, dstID, srcID );
+      return std::bind( fieldCpy<DstType,SrcType>, blocks, dstID, srcID );
    }
 
 
@@ -68,7 +68,7 @@ namespace cuda {
    template<typename DstType, typename SrcType>
    std::function<void(IBlock*)> fieldCpyFunctor( BlockDataID dstID, ConstBlockDataID srcID )
    {
-      return boost::bind( fieldCpySweepFunction<DstType,SrcType>, dstID, srcID, _1 );
+      return std::bind( fieldCpySweepFunction<DstType,SrcType>, dstID, srcID, std::placeholders::_1 );
    }
 
 
diff --git a/src/domain_decomposition/MakeBlockDataInitFunction.h b/src/domain_decomposition/MakeBlockDataInitFunction.h
index 466f944c1..c6446b919 100644
--- a/src/domain_decomposition/MakeBlockDataInitFunction.h
+++ b/src/domain_decomposition/MakeBlockDataInitFunction.h
@@ -23,7 +23,6 @@
 
 #include "IBlock.h"
 
-#include <boost/bind.hpp>
 #include <functional>
 
 
@@ -93,61 +92,61 @@ namespace internal
 template<class T>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction() {
-   return boost::bind( internal::newFunc<T>, _1);
+   return std::bind( internal::newFunc<T>,  std::placeholders::_1);
 }
 
 template<class T, class P1>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1) {
-   return boost::bind( internal::newFunc<T,P1>, _1,p1);
+   return std::bind( internal::newFunc<T,P1>,  std::placeholders::_1,p1);
 }
 
 template<class T, class P1, class P2>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2) {
-   return boost::bind( internal::newFunc<T,P1,P2>, _1,p1,p2);
+   return std::bind( internal::newFunc<T,P1,P2>,  std::placeholders::_1,p1,p2);
 }
 
 template<class T, class P1, class P2, class P3>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3>, _1,p1,p2,p3);
+   return std::bind( internal::newFunc<T,P1,P2,P3>,  std::placeholders::_1,p1,p2,p3);
 }
 
 template<class T, class P1, class P2, class P3, class P4>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3,P4>, _1,p1,p2,p3,p4);
+   return std::bind( internal::newFunc<T,P1,P2,P3,P4>,  std::placeholders::_1,p1,p2,p3,p4);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3,P4,P5>, _1,p1,p2,p3,p4,p5);
+   return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5>,  std::placeholders::_1,p1,p2,p3,p4,p5);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6>, _1,p1,p2,p3,p4,p5,p6);
+   return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6>,  std::placeholders::_1,p1,p2,p3,p4,p5,p6);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7>, _1,p1,p2,p3,p4,p5,p6,p7);
+   return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7>,  std::placeholders::_1,p1,p2,p3,p4,p5,p6,p7);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7, const P8 & p8) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7,P8>, _1,p1,p2,p3,p4,p5,p6,p7,p8);
+   return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7,P8>,  std::placeholders::_1,p1,p2,p3,p4,p5,p6,p7,p8);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9>
 std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7, const P8 & p8, const P9 & p9) {
-   return boost::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7,P8,P9>, _1,p1,p2,p3,p4,p5,p6,p7,p8,p9);
+   return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7,P8,P9>,  std::placeholders::_1,p1,p2,p3,p4,p5,p6,p7,p8,p9);
 }
 
 
diff --git a/src/domain_decomposition/StructuredBlockStorage.h b/src/domain_decomposition/StructuredBlockStorage.h
index 4315429d2..2d398ca3d 100644
--- a/src/domain_decomposition/StructuredBlockStorage.h
+++ b/src/domain_decomposition/StructuredBlockStorage.h
@@ -29,7 +29,7 @@
 #include "core/cell/CellInterval.h"
 #include "core/debug/Debug.h"
 
-#include <boost/bind.hpp>
+#include <functional>
 
 
 namespace walberla {
@@ -112,7 +112,7 @@ public:
                             bdc.incompatibleSelectors_, bdc.identifier_ ); return *this; }
       template< typename T >
       StructuredBlockDataAdder & operator<<( const StructuredBlockDataCreator<T> & sbdc ) {
-         dataHandling_.add( walberla::make_shared< internal::BlockDataHandlingHelper<T> >( walberla::make_shared< internal::BlockDataHandlingFunctionAdaptor<T> >( boost::bind( sbdc.function_, _1, &storage_ ) ) ),
+         dataHandling_.add( walberla::make_shared< internal::BlockDataHandlingHelper<T> >( walberla::make_shared< internal::BlockDataHandlingFunctionAdaptor<T> >( std::bind( sbdc.function_,  std::placeholders::_1, &storage_ ) ) ),
                             sbdc.requiredSelectors_, sbdc.incompatibleSelectors_, sbdc.identifier_ ); return *this; }
       operator BlockDataID() { return storage_.getBlockStorage().addBlockData( dataHandling_, identifier_ ); }
    private:
@@ -1076,7 +1076,7 @@ inline BlockDataID StructuredBlockStorage::addStructuredBlockData(
       const std::string& identifier, const Set<SUID>& requiredSelectors, const Set<SUID>& incompatibleSelectors )
 {
    internal::SelectableBlockDataHandlingWrapper dataHandling(
-            walberla::make_shared< internal::BlockDataHandlingHelper<T> >( walberla::make_shared< internal::BlockDataHandlingFunctionAdaptor<T> >( boost::bind( function, _1, this ) ) ),
+            walberla::make_shared< internal::BlockDataHandlingHelper<T> >( walberla::make_shared< internal::BlockDataHandlingFunctionAdaptor<T> >( std::bind( function,  std::placeholders::_1, this ) ) ),
             requiredSelectors, incompatibleSelectors, identifier );
 
 
diff --git a/src/field/StabilityChecker.h b/src/field/StabilityChecker.h
index 396a7c077..74b4470ed 100644
--- a/src/field/StabilityChecker.h
+++ b/src/field/StabilityChecker.h
@@ -394,7 +394,7 @@ void StabilityChecker< Field_T, Filter_T >::operator()()
 
          vtkWriter->addCellDataWriter( walberla::make_shared< vtk::DumpBlockStructureProcess >( "process" ) );
          vtkWriter->addCellDataWriter( walberla::make_shared< vtk::DumpBlockStructureLevel >( "level" ) );
-         vtkWriter->addCellDataWriter( walberla::make_shared< FValueVTKWriter >( boost::ref( failedCells_ ), "F" ) );
+         vtkWriter->addCellDataWriter( walberla::make_shared< FValueVTKWriter >( std::ref( failedCells_ ), "F" ) );
          vtkWriter->addCellDataWriter( walberla::make_shared< LocalCoordVTKWriter >( "blockLocalCoordinate" ) );
          vtkWriter->addCellDataWriter( walberla::make_shared< GlobalCoordVTKWriter >( "globalCoordinate" ) );
 
diff --git a/src/field/adaptors/AdaptorCreators.h b/src/field/adaptors/AdaptorCreators.h
index af7f5e55b..1c410ca91 100644
--- a/src/field/adaptors/AdaptorCreators.h
+++ b/src/field/adaptors/AdaptorCreators.h
@@ -23,7 +23,9 @@
 #pragma once
 
 #include "blockforest/BlockDataHandling.h"
-#include <boost/bind.hpp>
+
+#include <functional>
+
 
 
 namespace walberla {
diff --git a/src/field/python/FieldExport.impl.h b/src/field/python/FieldExport.impl.h
index ecbbbae8c..4dc9d0c3b 100644
--- a/src/field/python/FieldExport.impl.h
+++ b/src/field/python/FieldExport.impl.h
@@ -1006,7 +1006,7 @@ namespace internal {
 
       auto result = make_shared<boost::python::object>();
       AddToStorageExporter exporter( blocks, name, fs, gl, layout, type, initValue );
-      python_coupling::for_each_noncopyable_type< FieldTypes >  ( boost::ref(exporter) );
+      python_coupling::for_each_noncopyable_type< FieldTypes >  ( std::ref(exporter) );
 
       if ( ! exporter.successful() ) {
          PyErr_SetString( PyExc_ValueError, "Adding Field failed.");
@@ -1079,7 +1079,7 @@ namespace internal {
       auto fieldID = python_coupling::blockDataIDFromString( *blocks, name );
 
       CreateVTKWriterExporter exporter(blocks, fieldID, vtkName);
-      python_coupling::for_each_noncopyable_type< FieldTypes >  ( boost::ref(exporter) );
+      python_coupling::for_each_noncopyable_type< FieldTypes >  ( std::ref(exporter) );
       if ( ! exporter.getCreatedWriter() ) {
          PyErr_SetString( PyExc_ValueError, "Failed to create writer");
          throw boost::python::error_already_set();
@@ -1154,7 +1154,7 @@ namespace internal {
       auto fieldID = python_coupling::blockDataIDFromString( *blocks, name );
 
       CreateFlagFieldVTKWriterExporter exporter(blocks, fieldID, vtkName, flagMapping);
-      python_coupling::for_each_noncopyable_type< FieldTypes >  ( boost::ref(exporter) );
+      python_coupling::for_each_noncopyable_type< FieldTypes >  ( std::ref(exporter) );
       if ( ! exporter.getCreatedWriter() ) {
          PyErr_SetString( PyExc_ValueError, "Failed to create writer");
          throw boost::python::error_already_set();
@@ -1221,7 +1221,7 @@ namespace internal {
       auto fieldID = python_coupling::blockDataIDFromString( *blocks, name );
 
       CreateBinarizationVTKWriterExporter exporter(blocks, fieldID, vtkName, mask);
-      python_coupling::for_each_noncopyable_type< FieldTypes >  ( boost::ref(exporter) );
+      python_coupling::for_each_noncopyable_type< FieldTypes >  ( std::ref(exporter) );
       if ( ! exporter.getCreatedWriter() ) {
          PyErr_SetString( PyExc_ValueError, "Failed to create writer");
          throw boost::python::error_already_set();
diff --git a/src/lbm/BlockForestEvaluation.h b/src/lbm/BlockForestEvaluation.h
index 5a8ed59d7..f9b823696 100644
--- a/src/lbm/BlockForestEvaluation.h
+++ b/src/lbm/BlockForestEvaluation.h
@@ -38,8 +38,8 @@
 #include "field/CellCounter.h"
 #include "field/FlagUID.h"
 
-#include <boost/bind.hpp>
 
+#include <functional>
 #include <map>
 #include <string>
 #include <sstream>
diff --git a/src/lbm/boundary/factories/DefaultBoundaryHandlingCollection.h b/src/lbm/boundary/factories/DefaultBoundaryHandlingCollection.h
index e54c74bca..4bee0c6c1 100644
--- a/src/lbm/boundary/factories/DefaultBoundaryHandlingCollection.h
+++ b/src/lbm/boundary/factories/DefaultBoundaryHandlingCollection.h
@@ -26,6 +26,8 @@
 #include "lbm/boundary/factories/DefaultBoundaryHandling.h"
 #include "lbm/boundary/factories/DefaultDiffusionBoundaryHandling.h"
 
+#include <functional>
+
 namespace walberla {
 namespace lbm{
 
@@ -67,7 +69,7 @@ public:
    static BlockDataID addDefaultBoundaryHandlingCollectionToStorage(
       const shared_ptr< StructuredBlockStorage >& bs, const std::string & identifier, const BlockDataID& flagFieldID, const BlockDataID& handlingID, const BlockDataID& diffusionHandlingID )
    {
-      auto func = boost::bind( createDefaultBoundaryHandlingCollectionFactory, _1, _2, flagFieldID, handlingID, diffusionHandlingID );
+      auto func = std::bind( createDefaultBoundaryHandlingCollectionFactory, std::placeholders::_1, std::placeholders::_2, flagFieldID, handlingID, diffusionHandlingID );
       return bs->addStructuredBlockData< BoundaryHandlingCollection_T >( func, identifier );
    }
 
diff --git a/src/lbm/boundary/factories/DefaultDiffusionBoundaryHandling.h b/src/lbm/boundary/factories/DefaultDiffusionBoundaryHandling.h
index 3104c3f7e..42e3c7536 100644
--- a/src/lbm/boundary/factories/DefaultDiffusionBoundaryHandling.h
+++ b/src/lbm/boundary/factories/DefaultDiffusionBoundaryHandling.h
@@ -36,6 +36,8 @@
 
 #include <boost/tuple/tuple.hpp>
 
+#include <functional>
+
 
 namespace walberla {
 namespace lbm{
@@ -136,7 +138,7 @@ public:
    static BlockDataID addDefaultDiffusionBoundaryHandlingToStorage(
       const shared_ptr< StructuredBlockStorage >& bs, const std::string & identifier, const BlockDataID& flagFieldID, const Set<FlagUID>& domainFlagUIDs, const BlockDataID& pdfFieldID, const Set<FlagUID>& initFlagUIDs )
    {
-      auto func = boost::bind( createDefaultDiffusionBoundaryHandlingFactory, _1, _2, flagFieldID, domainFlagUIDs, pdfFieldID, initFlagUIDs );
+      auto func = std::bind( createDefaultDiffusionBoundaryHandlingFactory, std::placeholders::_1, std::placeholders::_2, flagFieldID, domainFlagUIDs, pdfFieldID, initFlagUIDs );
       return bs->addStructuredBlockData< BoundaryHandling_T >( func, identifier );
    }
 
diff --git a/src/lbm/python/ExportBasic.impl.h b/src/lbm/python/ExportBasic.impl.h
index afae7a5a1..c0097f54e 100644
--- a/src/lbm/python/ExportBasic.impl.h
+++ b/src/lbm/python/ExportBasic.impl.h
@@ -165,7 +165,7 @@ namespace internal
       using namespace boost::python;
 
       LatticeModelCreator creator( compressible, equilibriumAccuracyOrder, stencil, collisionModel, forceModel );
-      python_coupling::for_each_noncopyable_type<LatticeModels>( boost::ref(creator) );
+      python_coupling::for_each_noncopyable_type<LatticeModels>( std::ref(creator) );
 
       if ( creator.getResult() == object() )
       {
@@ -346,7 +346,7 @@ namespace internal
 
       internal::AddPdfFieldToStorageExporter exporter( blocks, identifier, latticeModel, initialVelocity,
                                                        initialDensity, gl, layout, densityAdaptor, velocityAdaptor, shearRateAdaptor );
-      python_coupling::for_each_noncopyable_type< LatticeModels >  ( boost::ref(exporter) );
+      python_coupling::for_each_noncopyable_type< LatticeModels >  ( std::ref(exporter) );
       if ( ! exporter.successful() ) {
          PyErr_SetString( PyExc_ValueError, "Adding Pdf Field failed.");
          throw error_already_set();
diff --git a/src/lbm/python/ExportBoundary.impl.h b/src/lbm/python/ExportBoundary.impl.h
index 009bda532..06845e35a 100644
--- a/src/lbm/python/ExportBoundary.impl.h
+++ b/src/lbm/python/ExportBoundary.impl.h
@@ -227,7 +227,7 @@ namespace internal
       }
 
       ExtendedBoundaryHandlingCreator creator( bs, name, pdfFieldID, flagFieldID );
-      python_coupling::for_each_noncopyable_type<LatticeModels>( boost::ref( creator ) );
+      python_coupling::for_each_noncopyable_type<LatticeModels>( std::ref( creator ) );
 
       if ( ! creator.successful() )
       {
diff --git a/src/lbm/python/ExportSweeps.impl.h b/src/lbm/python/ExportSweeps.impl.h
index fa01bf969..5f9440114 100644
--- a/src/lbm/python/ExportSweeps.impl.h
+++ b/src/lbm/python/ExportSweeps.impl.h
@@ -221,7 +221,7 @@ namespace internal
       auto flagUidSet = python_coupling::uidSetFromStringContainer< FlagUID >( flagList );
 
       CellwiseSweepCreator creator( bs, pdfFieldID, flagFieldStringID, velocityFieldStringID, flagUidSet );
-      python_coupling::for_each_noncopyable_type<LatticeModel_FlagField_Pairs>( boost::ref( creator ) );
+      python_coupling::for_each_noncopyable_type<LatticeModel_FlagField_Pairs>( std::ref( creator ) );
 
       if ( creator.getResult() == object() )
       {
diff --git a/src/pde/sweeps/RBGS.h b/src/pde/sweeps/RBGS.h
index 1f3404341..69f7245fa 100644
--- a/src/pde/sweeps/RBGS.h
+++ b/src/pde/sweeps/RBGS.h
@@ -26,7 +26,7 @@
 #include "stencil/Directions.h"
 
 #include <map>
-
+#include <functional>
 
 
 namespace walberla {
@@ -53,12 +53,12 @@ public:
    
    std::function< void ( IBlock * const ) > getRedSweep()
    {
-      return boost::bind( &RBGS::update, this, _1, true );
+      return std::bind( &RBGS::update, this, std::placeholders::_1, true );
    }
 
    std::function< void ( IBlock * const ) > getBlackSweep()
    {
-      return boost::bind( &RBGS::update, this, _1, false );
+      return std::bind( &RBGS::update, this, std::placeholders::_1, false );
    }
 
 private:
diff --git a/src/pde/sweeps/RBGSFixedStencil.h b/src/pde/sweeps/RBGSFixedStencil.h
index 76df00055..75196987f 100644
--- a/src/pde/sweeps/RBGSFixedStencil.h
+++ b/src/pde/sweeps/RBGSFixedStencil.h
@@ -26,7 +26,7 @@
 #include "stencil/Directions.h"
 
 #include <map>
-
+#include <functional>
 
 
 namespace walberla {
@@ -52,12 +52,12 @@ public:
    
    std::function< void ( IBlock * const ) > getRedSweep()
    {
-      return boost::bind( &RBGSFixedStencil::update, this, _1, true );
+      return std::bind( &RBGSFixedStencil::update, this, std::placeholders::_1, true );
    }
 
    std::function< void ( IBlock * const ) > getBlackSweep()
    {
-      return boost::bind( &RBGSFixedStencil::update, this, _1, false );
+      return std::bind( &RBGSFixedStencil::update, this, std::placeholders::_1, false );
    }
 
 private:
diff --git a/src/pde/sweeps/SOR.h b/src/pde/sweeps/SOR.h
index 90be98268..4997b40d6 100644
--- a/src/pde/sweeps/SOR.h
+++ b/src/pde/sweeps/SOR.h
@@ -26,7 +26,7 @@
 #include "stencil/Directions.h"
 
 #include <map>
-
+#include <functional>
 
 
 namespace walberla {
@@ -53,12 +53,12 @@ public:
 
    std::function< void ( IBlock * const ) > getRedSweep()
    {
-      return boost::bind( &SOR::update, this, _1, true );
+      return std::bind( &SOR::update, this, std::placeholders::_1, true );
    }
 
    std::function< void ( IBlock * const ) > getBlackSweep()
    {
-      return boost::bind( &SOR::update, this, _1, false );
+      return std::bind( &SOR::update, this, std::placeholders::_1, false );
    }
 
 private:
diff --git a/src/pde/sweeps/SORFixedStencil.h b/src/pde/sweeps/SORFixedStencil.h
index 51535e037..d3983ab18 100644
--- a/src/pde/sweeps/SORFixedStencil.h
+++ b/src/pde/sweeps/SORFixedStencil.h
@@ -26,7 +26,7 @@
 #include "stencil/Directions.h"
 
 #include <map>
-
+#include <functional>
 
 
 namespace walberla {
@@ -52,12 +52,12 @@ public:
 
    std::function< void ( IBlock * const ) > getRedSweep()
    {
-      return boost::bind( &SORFixedStencil::update, this, _1, true );
+      return std::bind( &SORFixedStencil::update, this, std::placeholders::_1, true );
    }
 
    std::function< void ( IBlock * const ) > getBlackSweep()
    {
-      return boost::bind( &SORFixedStencil::update, this, _1, false );
+      return std::bind( &SORFixedStencil::update, this, std::placeholders::_1, false );
    }
 
 private:
diff --git a/src/python_coupling/DictWrapper.h b/src/python_coupling/DictWrapper.h
index 912ce3a83..0d2f0cab1 100644
--- a/src/python_coupling/DictWrapper.h
+++ b/src/python_coupling/DictWrapper.h
@@ -28,7 +28,9 @@
 #include "PythonWrapper.h"
 #include "core/DataTypes.h"
 #include "core/Abort.h"
-#include <boost/bind.hpp>
+
+#include <functional>
+
 
 namespace walberla {
 namespace python_coupling {
diff --git a/src/python_coupling/DictWrapper.impl.h b/src/python_coupling/DictWrapper.impl.h
index 400eb2e7f..b6ffecb9b 100644
--- a/src/python_coupling/DictWrapper.impl.h
+++ b/src/python_coupling/DictWrapper.impl.h
@@ -19,6 +19,8 @@
 //
 //======================================================================================================================
 
+#include <functional>
+
 namespace walberla {
 namespace python_coupling {
 
@@ -113,7 +115,7 @@ inline void runPythonObject( boost::python::object obj ) {
 template<>
 inline std::function<void()> DictWrapper::get( const std::string & name ) {
    boost::python::object obj ( d_[name] );
-   return boost::bind( &runPythonObject, obj );
+   return std::bind( &runPythonObject, obj );
 }
 
 template<>
diff --git a/src/python_coupling/Manager.h b/src/python_coupling/Manager.h
index b6294b6fb..ed843ff11 100644
--- a/src/python_coupling/Manager.h
+++ b/src/python_coupling/Manager.h
@@ -61,7 +61,7 @@ namespace python_coupling {
    boost::python::object testBlockData( IBlock & block, BlockDataID blockDataID )
    {
       BlockDataToObjectTester tester( &block, blockDataID );
-      for_each_noncopyable_type< TypeList > ( boost::ref(tester) );
+      for_each_noncopyable_type< TypeList > ( std::ref(tester) );
       return tester.getResult();
    }
 
diff --git a/src/python_coupling/basic_exports/BasicExports.cpp b/src/python_coupling/basic_exports/BasicExports.cpp
index a3e4a8f31..724efcfce 100644
--- a/src/python_coupling/basic_exports/BasicExports.cpp
+++ b/src/python_coupling/basic_exports/BasicExports.cpp
@@ -43,6 +43,8 @@
 
 #include <boost/version.hpp>
 
+#include <functional>
+
 using namespace boost::python;
 
 
@@ -842,7 +844,7 @@ object * blockDataCreationHelper( IBlock * block, StructuredBlockStorage * bs,
 uint_t StructuredBlockStorage_addBlockData( StructuredBlockStorage & s, const std::string & name, object functionPtr )
 {
    BlockDataID res = s.addStructuredBlockData(name)
-               << StructuredBlockDataCreator<object>( boost::bind( &blockDataCreationHelper, _1,_2, functionPtr ) );
+               << StructuredBlockDataCreator<object>( std::bind( &blockDataCreationHelper, std::placeholders::_1, std::placeholders::_2, functionPtr ) );
    //TODO extend this for moving block data ( packing und unpacking with pickle )
    return res;
 }
diff --git a/src/python_coupling/helper/MplHelpers.h b/src/python_coupling/helper/MplHelpers.h
index 640f45637..d9b008664 100644
--- a/src/python_coupling/helper/MplHelpers.h
+++ b/src/python_coupling/helper/MplHelpers.h
@@ -28,8 +28,8 @@
 #include <boost/mpl/pair.hpp>
 #include <boost/mpl/transform.hpp>
 
-#include <boost/bind.hpp>
 
+#include <functional>
 #include <map>
 
 
@@ -102,7 +102,7 @@ public:
          return map_[ blockDataID ];
 
       Exporter exporter( block_, blockDataID );
-      for_each_noncopyable_type< FieldTypeList>  ( boost::ref(exporter) );
+      for_each_noncopyable_type< FieldTypeList>  ( std::ref(exporter) );
       map_[ blockDataID ] = exporter.result;
       return exporter.result;
    }
diff --git a/src/timeloop/PerformanceMeter.cpp b/src/timeloop/PerformanceMeter.cpp
index 7af5f847d..884291215 100644
--- a/src/timeloop/PerformanceMeter.cpp
+++ b/src/timeloop/PerformanceMeter.cpp
@@ -53,7 +53,7 @@ namespace timeloop {
     *******************************************************************************************************************/
    std::function<void () > PerformanceMeter::getBeforeFunction()
    {
-      return boost::bind ( &PerformanceMeter::timingStart, this );
+      return std::bind ( &PerformanceMeter::timingStart, this );
    }
 
 
@@ -66,7 +66,7 @@ namespace timeloop {
     *******************************************************************************************************************/
    std::function<void () > PerformanceMeter::getAfterFunction()
    {
-      return boost::bind ( &PerformanceMeter::timingEnd, this );
+      return std::bind ( &PerformanceMeter::timingEnd, this );
    }
 
 
diff --git a/src/timeloop/PerformanceMeter.h b/src/timeloop/PerformanceMeter.h
index 732121789..731f968fe 100644
--- a/src/timeloop/PerformanceMeter.h
+++ b/src/timeloop/PerformanceMeter.h
@@ -23,9 +23,7 @@
 #include "core/timing/Timer.h"
 #include "domain_decomposition/StructuredBlockStorage.h"
 
-#include <boost/bind.hpp>
 #include <functional>
-
 #include <iostream>
 #include <map>
 #include <string>
@@ -180,7 +178,7 @@ namespace timeloop {
                                                           typename FField::flag_t activeMask,
                                                           uint_t countFreq , real_t scaling )
    {
-      this->addMeasurement( name, boost::bind( flagFieldCountFunction<FField>, _1, flagFieldID, activeMask ),
+      this->addMeasurement( name, std::bind( flagFieldCountFunction<FField>,  std::placeholders::_1, flagFieldID, activeMask ),
                            countFreq, scaling );
    }
 
diff --git a/src/timeloop/SelectableFunctionCreators.h b/src/timeloop/SelectableFunctionCreators.h
index b6762e469..4deaa2ce4 100644
--- a/src/timeloop/SelectableFunctionCreators.h
+++ b/src/timeloop/SelectableFunctionCreators.h
@@ -25,7 +25,6 @@
 #include "core/uid/SUID.h"
 #include "domain_decomposition/BlockStorage.h"
 
-#include <boost/bind.hpp>
 #include <functional>
 #include <string>
 
@@ -177,7 +176,7 @@ namespace timeloop {
          BlockDataID bdId = bs_.addBlockData() << bdCreator;
 
          // add a sweep function that fetches the block data sweep and executes it
-         auto sweepFunc = boost::bind ( executeSweepOnBlock<SweepClass>, _1, bdId );
+         auto sweepFunc = std::bind ( executeSweepOnBlock<SweepClass>,  std::placeholders::_1, bdId );
          ( *this ) << Sweep ( sweepFunc, sw.identifier_, sw.requiredSelectors_, sw.incompatibleSelectors_  );
 
          return *this;
diff --git a/src/vtk/Initialization.cpp b/src/vtk/Initialization.cpp
index d551086d5..bac98bdb9 100644
--- a/src/vtk/Initialization.cpp
+++ b/src/vtk/Initialization.cpp
@@ -29,7 +29,8 @@
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/split.hpp>
-#include <boost/bind.hpp>
+
+#include <functional>
 
 
 namespace walberla {
@@ -43,7 +44,7 @@ static void splitVector( T& x, T& y, T& z, const Config::BlockHandle& bb, const
    std::vector< std::string > coordinates;
    std::string vector = bb.getParameter< std::string >( vertex );
    boost::split( coordinates, vector, boost::is_any_of("<,> \t") );
-   coordinates.erase( std::remove_if( coordinates.begin(), coordinates.end(), boost::bind( &std::string::empty, _1 ) ), coordinates.end() );
+   coordinates.erase( std::remove_if( coordinates.begin(), coordinates.end(), std::bind( &std::string::empty,  std::placeholders::_1 ) ), coordinates.end() );
 
    if( coordinates.size() != 3 )
       WALBERLA_ABORT( errorMsg );
@@ -60,7 +61,7 @@ static std::vector< std::string > splitList( const std::string& string )
    std::vector< std::string > list;
 
    boost::split( list, string, boost::is_any_of(", \t") );
-   list.erase( std::remove_if( list.begin(), list.end(), boost::bind( &std::string::empty, _1 ) ), list.end() );
+   list.erase( std::remove_if( list.begin(), list.end(), std::bind( &std::string::empty,  std::placeholders::_1 ) ), list.end() );
 
    return list;
 }
@@ -71,7 +72,7 @@ static void addStates( Set<SUID>& set, const std::string& string )
 {
    std::vector< std::string > states;
    boost::split( states, string, boost::is_any_of(", \t") );
-   states.erase( std::remove_if( states.begin(), states.end(), boost::bind( &std::string::empty, _1 ) ), states.end() );
+   states.erase( std::remove_if( states.begin(), states.end(), std::bind( &std::string::empty,  std::placeholders::_1 ) ), states.end() );
 
    for( auto it = states.begin(); it != states.end(); ++it )
       set += SUID( *it );
diff --git a/tests/lbm/DiffusionTest.cpp b/tests/lbm/DiffusionTest.cpp
index a6f126a35..4bed8c474 100644
--- a/tests/lbm/DiffusionTest.cpp
+++ b/tests/lbm/DiffusionTest.cpp
@@ -79,6 +79,8 @@
 
 #include <boost/lexical_cast.hpp>
 
+#include <functional>
+
 
 namespace walberla {
 
@@ -280,16 +282,16 @@ int run( int argc, char **argv )
    scheme.addPackInfo( make_shared< field::communication::PackInfo<  AdvDiffPDFField > >( srcFieldID ) );
    timeloop.addFuncBeforeTimeStep( scheme, "Communication" );
 
-   using boost::ref;
+   using std::ref;
 
-   timeloop.add() << Sweep( boost::bind( hydroFunc, _1, velFieldID, u, tperiod, ref(timestep) ), "Hydro Func" );
+   timeloop.add() << Sweep( std::bind( hydroFunc, std::placeholders::_1, velFieldID, u, tperiod, ref(timestep) ), "Hydro Func" );
    
    timeloop.add() << Sweep( makeSharedSweep( lbm::makeCellwiseAdvectionDiffusionSweep< AdvDiffLatticeModel, VectorField, MyFlagField >(
                                                 srcFieldID, velFieldID, flagFieldID, getFluidFlag() ) ), "LBM_SRT" );
   
-   timeloop.add() << BeforeFunction( boost::bind( prepFunc, u[dim], dv, D, cperiod, tperiod, ref(timestep), ref(cosi), ref(sisi), ref(sexp) ), "prepare test" )
-                  << Sweep         ( boost::bind( testFunc<AdvDiffPDFField>, _1, srcFieldID, dim, v, cperiod, ref(cosi), ref(sisi), ref(sexp), ref(E_mean_) ), "Test Func" ) 
-                  << AfterFunction ( boost::bind( incTimeFunc, ref(timestep) ), "increment time" );
+   timeloop.add() << BeforeFunction( std::bind( prepFunc, u[dim], dv, D, cperiod, tperiod, ref(timestep), ref(cosi), ref(sisi), ref(sexp) ), "prepare test" )
+                  << Sweep         ( std::bind( testFunc<AdvDiffPDFField>, std::placeholders::_1, srcFieldID, dim, v, cperiod, ref(cosi), ref(sisi), ref(sexp), ref(E_mean_) ), "Test Func" ) 
+                  << AfterFunction ( std::bind( incTimeFunc, ref(timestep) ), "increment time" );
 
    // --- run timeloop --- //
 
diff --git a/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp b/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp
index d28603a3f..1cc3e60f9 100644
--- a/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp
+++ b/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp
@@ -76,6 +76,7 @@
 
 #include <stdexcept>
 #include <array>
+#include <functional>
 
 #include "gather/GnuPlotGraphWriter.h"
 #include "field/vtk/FlagFieldCellFilter.h"
@@ -85,7 +86,6 @@
 #include "vtk/VTKOutput.h"
 
 
-
 namespace walberla {
 
 typedef GhostLayerField< real_t, 1 >          ScalarField;
@@ -138,7 +138,7 @@ shared_ptr< StructuredBlockForest > makeStructuredBlockStorage( uint_t length, u
 
     uint_t cells[]  = { length, width, width  };
     uint_t blocks[] = { uint_t(1u), uint_t(1u), uint_t(1u) };
-    sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, refinement ) );
+    sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, refinement ) );
     sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
     sforest.init(
diff --git a/tests/lbm/refinement/CommunicationEquivalence.cpp b/tests/lbm/refinement/CommunicationEquivalence.cpp
index 32f029d77..6cd232235 100644
--- a/tests/lbm/refinement/CommunicationEquivalence.cpp
+++ b/tests/lbm/refinement/CommunicationEquivalence.cpp
@@ -50,11 +50,10 @@
 
 #include "timeloop/SweepTimeloop.h"
 
-#include <boost/bind.hpp>
-
 #include <algorithm>
 #include <cstdlib>
 #include <fstream>
+#include <functional>
 
 //#define TEST_USES_VTK_OUTPUT
 #ifdef TEST_USES_VTK_OUTPUT
@@ -190,7 +189,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const uint_t le
    // initialize SetupBlockForest = determine domain decomposition
    SetupBlockForest sforest;
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, levels ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, levels ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( AABB( real_c(0), real_c(0), real_c(0), real_c( numberOfXBlocks * numberOfXCellsPerBlock ),
diff --git a/tests/lbm/refinement/NonConstantDiffusion.cpp b/tests/lbm/refinement/NonConstantDiffusion.cpp
index 12d96631a..dca9d0529 100644
--- a/tests/lbm/refinement/NonConstantDiffusion.cpp
+++ b/tests/lbm/refinement/NonConstantDiffusion.cpp
@@ -75,6 +75,7 @@
 #include <boost/lexical_cast.hpp>
 
 #include <stdexcept>
+#include <functional>
 
 #include "gather/GnuPlotGraphWriter.h"
 #include "field/vtk/FlagFieldCellFilter.h"
@@ -137,7 +138,7 @@ shared_ptr< StructuredBlockForest > makeStructuredBlockStorage( uint_t length, u
 
     uint_t cells[]  = { length, width, width  };
     uint_t blocks[] = { uint_t(1u), uint_t(1u), uint_t(1u) };
-    sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, refinement ) );
+    sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, refinement ) );
     sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
     sforest.init(
diff --git a/tests/lbm/refinement/Uniformity.cpp b/tests/lbm/refinement/Uniformity.cpp
index 67e73915a..aabd8d6fb 100644
--- a/tests/lbm/refinement/Uniformity.cpp
+++ b/tests/lbm/refinement/Uniformity.cpp
@@ -50,10 +50,9 @@
 
 #include "timeloop/SweepTimeloop.h"
 
-#include <boost/bind.hpp>
-
 #include <algorithm>
 #include <cstdlib>
+#include <functional>
 
 //#define TEST_USES_VTK_OUTPUT
 #ifdef TEST_USES_VTK_OUTPUT
@@ -150,7 +149,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const uint_t le
    // initialize SetupBlockForest = determine domain decomposition
    SetupBlockForest sforest;
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, levels ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, levels ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( AABB( real_c(0), real_c(0), real_c(0), real_c( numberOfXBlocks * numberOfXCellsPerBlock ),
diff --git a/tests/mesh/PeVTKMeshWriterTest.cpp b/tests/mesh/PeVTKMeshWriterTest.cpp
index a765f30c4..5399af727 100644
--- a/tests/mesh/PeVTKMeshWriterTest.cpp
+++ b/tests/mesh/PeVTKMeshWriterTest.cpp
@@ -42,6 +42,7 @@
 #include <postprocessing/sqlite/SQLite.h>
 #include <vtk/VTKOutput.h>
 
+#include <functional>
 #include <random>
 
 using namespace walberla;
@@ -142,7 +143,7 @@ int main( int argc, char ** argv )
    cr.setRelaxationParameter( real_t(0.7) );
    cr.setGlobalLinearAcceleration( Vec3(0,0,5) );
 
-   std::function<void(void)> syncCall = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(*forest), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+   std::function<void(void)> syncCall = std::bind( pe::syncNextNeighbors<BodyTuple>, std::ref(*forest), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
 
    typedef mesh::FloatPolyMesh OutputMeshType;
    typedef mesh::pe::DefaultTesselation<OutputMeshType> TesselationType;
diff --git a/tests/pe/DeleteBody.cpp b/tests/pe/DeleteBody.cpp
index 64f03d42a..a37e73bff 100644
--- a/tests/pe/DeleteBody.cpp
+++ b/tests/pe/DeleteBody.cpp
@@ -31,6 +31,8 @@
 #include "core/debug/TestSubsystem.h"
 #include "core/math/Random.h"
 
+#include <functional>
+
 using namespace walberla;
 using namespace walberla::pe;
 
@@ -83,10 +85,10 @@ int main( int argc, char** argv )
     std::function<void(void)> syncCall;
     if (!syncShadowOwners)
     {
-       syncCall = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+       syncCall = std::bind( pe::syncNextNeighbors<BodyTuple>, std::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
     } else
     {
-       syncCall = boost::bind( pe::syncShadowOwners<BodyTuple>, boost::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+       syncCall = std::bind( pe::syncShadowOwners<BodyTuple>, std::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
     }
 
     pe::createSphere(*globalBodyStorage, forest->getBlockStorage(), storageID, 0, Vec3(5,5,5), 2);
diff --git a/tests/pe/ShadowCopy.cpp b/tests/pe/ShadowCopy.cpp
index cbd4958e3..da6c31cef 100644
--- a/tests/pe/ShadowCopy.cpp
+++ b/tests/pe/ShadowCopy.cpp
@@ -28,6 +28,8 @@
 
 #include "core/debug/TestSubsystem.h"
 
+#include <functional>
+
 using namespace walberla;
 using namespace walberla::pe;
 
@@ -65,10 +67,10 @@ int main( int argc, char** argv )
    std::function<void(void)> syncCall;
    if (!syncShadowOwners)
    {
-      syncCall = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+      syncCall = std::bind( pe::syncNextNeighbors<BodyTuple>, std::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
    } else
    {
-      syncCall = boost::bind( pe::syncShadowOwners<BodyTuple>, boost::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
+      syncCall = std::bind( pe::syncShadowOwners<BodyTuple>, std::ref(forest->getBlockForest()), storageID, static_cast<WcTimingTree*>(NULL), real_c(0.0), false );
    }
 
    WALBERLA_LOG_PROGRESS_ON_ROOT( " *** SPHERE *** ");
diff --git a/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp b/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
index d9fd26707..ca71c9f03 100644
--- a/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
+++ b/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
@@ -44,6 +44,7 @@
 
 #include "vtk/VTKOutput.h"
 
+#include <functional>
 #include <vector>
 #include <iomanip>
 #include <iostream>
@@ -851,7 +852,7 @@ int main( int argc, char **argv )
 
    // connect to pe
    const real_t overlap = real_t( 1.5 ) * dx;
-   auto syncCall = boost::bind( pe::syncNextNeighbors<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   auto syncCall = std::bind( pe::syncNextNeighbors<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
    shared_ptr<CollisionPropertiesEvaluator> collisionPropertiesEvaluator = walberla::make_shared<CollisionPropertiesEvaluator>( *cr );
 
    // create the spheres
@@ -1147,7 +1148,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::NearestNeighborFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -1155,7 +1156,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       } else if (interpol == Interpolation::IKernel) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -1165,7 +1166,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::KernelFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -1173,7 +1174,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       } else if (interpol == Interpolation::ITrilinear) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -1183,7 +1184,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::TrilinearFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -1191,7 +1192,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       }
    }
@@ -1211,7 +1212,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1219,7 +1220,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::IKernel )
@@ -1230,7 +1231,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1238,7 +1239,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::ITrilinear )
@@ -1249,7 +1250,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1257,7 +1258,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
 
@@ -1271,7 +1272,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1279,7 +1280,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::IKernel )
@@ -1290,7 +1291,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1298,7 +1299,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::ITrilinear )
@@ -1309,7 +1310,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1317,7 +1318,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
 
@@ -1329,13 +1330,13 @@ int main( int argc, char **argv )
       {
          typedef pe_coupling::LubricationCorrection LE_T;
          shared_ptr<LE_T> lubEval = make_shared<LE_T>( blocks, globalBodyStorage, bodyStorageID, viscosity, lubricationCutOffDistance );
-         lubricationEvaluationFunction = boost::bind(&LE_T::operator(), lubEval);
+         lubricationEvaluationFunction = std::bind(&LE_T::operator(), lubEval);
       }
       else
       {
          typedef pe_coupling::discrete_particle_methods::LubricationForceEvaluator LE_T;
          shared_ptr<LE_T> lubEval = make_shared<LE_T>( blocks, globalBodyStorage, bodyStorageID, viscosity, lubricationCutOffDistance );
-         lubricationEvaluationFunction = boost::bind(&LE_T::operator(), lubEval);
+         lubricationEvaluationFunction = std::bind(&LE_T::operator(), lubEval);
       }
    } else {
       lubricationEvaluationFunction = emptyFunction;
@@ -1343,7 +1344,7 @@ int main( int argc, char **argv )
 
 
    // function to evaluate the mean fluid velocity
-   std::function<Vector3<real_t> ()> evaluateMeanFluidVelocity = boost::bind(getGNSMeanFluidVelocity, blocks, pdfFieldID, svfFieldID, domainVolume);
+   std::function<Vector3<real_t> ()> evaluateMeanFluidVelocity = std::bind(getGNSMeanFluidVelocity, blocks, pdfFieldID, svfFieldID, domainVolume);
 
 
    //////////////////////////////
diff --git a/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp b/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
index 5ec32af40..052676d3f 100644
--- a/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
+++ b/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
@@ -44,6 +44,7 @@
 #include "vtk/VTKOutput.h"
 
 #include <vector>
+#include <functional>
 #include <iomanip>
 #include <iostream>
 #include <random>
@@ -698,7 +699,7 @@ int main( int argc, char **argv )
 
    // connect to pe
    const real_t overlap = real_t( 1.5 ) * dx;
-   auto syncCall = boost::bind( pe::syncNextNeighbors<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   auto syncCall = std::bind( pe::syncNextNeighbors<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create the sphere
    const real_t restitutionCoeff = real_t(0.97);
@@ -943,7 +944,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::NearestNeighborFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -951,7 +952,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       } else if (interpol == Interpolation::IKernel) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -961,7 +962,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::KernelFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -969,7 +970,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       } else if (interpol == Interpolation::ITrilinear) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -979,7 +980,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          } else if (dist == Distribution::DKernel) {
             typedef pe_coupling::discrete_particle_methods::InteractionForceEvaluator<FlagField_T, field::TrilinearFieldInterpolator, field::KernelDistributor> IFE_T;
             shared_ptr<IFE_T> forceEvaluatorPtr = make_shared<IFE_T>(blocks, dragForceFieldID, bodyStorageID,
@@ -987,7 +988,7 @@ int main( int argc, char **argv )
                                                                      velocityFieldID, svfFieldID,
                                                                      pressureGradientFieldID, dragCorrelationFunction,
                                                                      viscosity);
-            dragAndPressureForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+            dragAndPressureForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
          }
       }
    }
@@ -1007,7 +1008,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1015,7 +1016,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::IKernel )
@@ -1026,7 +1027,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1034,7 +1035,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::ITrilinear )
@@ -1045,7 +1046,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1053,7 +1054,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, liftForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         velocityFieldID, velocityCurlFieldID, liftCorrelationFunction,
                                                                         viscosity );
-         liftForceEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         liftForceEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
 
@@ -1068,7 +1069,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1076,7 +1077,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::IKernel )
@@ -1087,7 +1088,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1095,7 +1096,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
    else if( interpol == Interpolation::ITrilinear )
@@ -1106,7 +1107,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
       else if( dist == Distribution::DKernel )
       {
@@ -1114,7 +1115,7 @@ int main( int argc, char **argv )
          shared_ptr< IFE_T > forceEvaluatorPtr = make_shared< IFE_T > ( blocks, amForceFieldID, bodyStorageID, flagFieldID, Fluid_Flag,
                                                                         timeDerivativeVelocityFieldID, addedMassCorrelationFunction,
                                                                         bodyVelocityTimeDerivativeEvaluator );
-         addedMassEvaluationFunction = boost::bind(&IFE_T::operator(), forceEvaluatorPtr);
+         addedMassEvaluationFunction = std::bind(&IFE_T::operator(), forceEvaluatorPtr);
       }
    }
 
@@ -1126,13 +1127,13 @@ int main( int argc, char **argv )
       {
          typedef pe_coupling::LubricationCorrection LE_T;
          shared_ptr<LE_T> lubEval = make_shared<LE_T>( blocks, globalBodyStorage, bodyStorageID, viscosity, lubricationCutOffDistance );
-         lubricationEvaluationFunction = boost::bind(&LE_T::operator(), lubEval);
+         lubricationEvaluationFunction = std::bind(&LE_T::operator(), lubEval);
       }
       else
       {
          typedef pe_coupling::discrete_particle_methods::LubricationForceEvaluator LE_T;
          shared_ptr<LE_T> lubEval = make_shared<LE_T>( blocks, globalBodyStorage, bodyStorageID, viscosity, lubricationCutOffDistance );
-         lubricationEvaluationFunction = boost::bind(&LE_T::operator(), lubEval);
+         lubricationEvaluationFunction = std::bind(&LE_T::operator(), lubEval);
       }
    } else {
       lubricationEvaluationFunction = emptyFunction;
diff --git a/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp b/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
index 4133741c7..bbf5224bf 100644
--- a/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
@@ -64,6 +64,7 @@
 #include <vector>
 #include <iomanip>
 #include <iostream>
+#include <functional>
 
 namespace body_at_block_boarder_check
 {
@@ -132,7 +133,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( AABB domainAABB
                                                      uint_c(domainAABB.zMax()) / blockSizeInCells[2] );
 
    AABB refinementBox( domainAABB.xMin(), domainAABB.yMin(), domainAABB.zMin(), domainAABB.xMax() * real_c(0.5), domainAABB.yMax(), domainAABB.zMax() );
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, numberOfLevels, refinementBox ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, numberOfLevels, refinementBox ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( domainAABB, numberOfCoarseBlocksPerDirection[0], numberOfCoarseBlocksPerDirection[1], numberOfCoarseBlocksPerDirection[2], true, true, true );
@@ -281,7 +282,7 @@ int main( int argc, char **argv )
 
    // connect to pe
    const real_t overlap = real_c( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    auto sphereMaterialID = pe::createMaterial( "sphereMat", real_c(1) , real_c(0.3), real_c(0.2), real_c(0.2), real_c(0.24), real_c(200), real_c(200), real_c(0), real_c(0) );
    // create two spheres: one which overlaps with a block boundary and one inside the block
diff --git a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp
index a084604c7..33371ade9 100644
--- a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp
@@ -67,6 +67,7 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
 #include <vector>
 #include <iomanip>
 #include <iostream>
@@ -165,7 +166,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const Setup & s
    // initialize SetupBlockForest = determine domain decomposition
    SetupBlockForest sforest;
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, setup.levels, setup.radius * real_c(2), setup.length ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, setup.levels, setup.radius * real_c(2), setup.length ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( AABB( real_c(0), real_c(0), real_c(0), setup.length, setup.length, setup.length ),
diff --git a/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
index 27626a2e5..393df5213 100644
--- a/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
@@ -60,6 +60,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace global_body_as_boundary_mem_static_refinement
 {
 
@@ -163,7 +165,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const AABB & do
 
    WALBERLA_LOG_INFO_ON_ROOT(" - refinement box: " << refinementBox);
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, numberOfLevels, refinementBox ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, numberOfLevels, refinementBox ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( domainAABB, numberOfCoarseBlocksPerDirection[0], numberOfCoarseBlocksPerDirection[1], numberOfCoarseBlocksPerDirection[2], false, false, false );
diff --git a/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp b/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
index d0d021395..124cbad21 100644
--- a/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
@@ -57,6 +57,8 @@
 #include "pe_coupling/momentum_exchange_method/all.h"
 #include "pe_coupling/utility/all.h"
 
+#include <functional>
+
 
 namespace lubrication_correction_mem
 {
@@ -789,7 +791,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_c( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create the material
    const auto myMat = pe::createMaterial( "myMat", real_c(1.4), real_t(0), real_t(1), real_t(1), real_t(0), real_t(1), real_t(1), real_t(0), real_t(0) );
diff --git a/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp b/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
index ef64aa7a8..bbf831d83 100644
--- a/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
@@ -65,6 +65,7 @@
 
 #include "vtk/all.h"
 
+#include <functional>
 #include <vector>
 
 namespace periodic_particle_channel_mem
@@ -413,7 +414,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_c( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
    const auto material = pe::createMaterial( "granular", real_c(1.2), real_c(0.25), real_c(0.4), real_c(0.4), real_c(0.35), real_c(1.39e11), real_c(5.18e7), real_c(1.07e2), real_c(1.07e2) );
diff --git a/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp b/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
index 6ccc9f5c7..c05c2636c 100644
--- a/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
@@ -65,6 +65,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace segre_silberberg_mem
 {
 
@@ -549,10 +551,10 @@ int main( int argc, char **argv )
    std::function<void(void)> syncCall;
    if (!syncShadowOwners)
    {
-      syncCall = boost::bind( pe::syncNextNeighbors<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+      syncCall = std::bind( pe::syncNextNeighbors<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
    } else
    {
-      syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+      syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
    }
 
    // create pe bodies
@@ -670,9 +672,9 @@ int main( int argc, char **argv )
    }
 
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = std::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = std::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
 
    bodiesFTContainer2->store();
 
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
index 6674cde01..ed9c8da8c 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
@@ -63,6 +63,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace settling_sphere_mem
 {
 
@@ -457,7 +459,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
 
    // create pe bodies
@@ -530,11 +532,11 @@ int main( int argc, char **argv )
                   ( blocks, boundaryHandlingID, bodyStorageID, globalBodyStorage, bodyFieldID, reconstructor, FormerMO_Flag, Fluid_Flag ), "PDF Restore" );
 
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = std::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = std::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
    shared_ptr<pe_coupling::ForceTorqueOnBodiesScaler> forceScaler = make_shared<pe_coupling::ForceTorqueOnBodiesScaler>(blocks, bodyStorageID, real_t(1));
-   std::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
+   std::function<void(void)> setForceScalingFactorToHalf = std::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
 
    if( averageForceTorqueOverTwoTimSteps ) {
       bodiesFTContainer2->store();
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
index 0e44a2e57..6ebde5403 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
@@ -65,6 +65,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace settling_sphere_mem_dynamic_refinement
 {
 
@@ -251,7 +253,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const AABB & do
 
    WALBERLA_LOG_INFO_ON_ROOT(" - refinement box: " << refinementBox);
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, numberOfLevels, refinementBox ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, numberOfLevels, refinementBox ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( domainAABB, numberOfCoarseBlocksPerDirection[0], numberOfCoarseBlocksPerDirection[1], numberOfCoarseBlocksPerDirection[2], false, false, false );
@@ -677,7 +679,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
 
@@ -728,12 +730,12 @@ int main( int argc, char **argv )
 
    // force averaging functionality
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = std::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = std::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
    shared_ptr<pe_coupling::ForceTorqueOnBodiesScaler> forceScaler = make_shared<pe_coupling::ForceTorqueOnBodiesScaler>(blocks, bodyStorageID, real_t(0.5));
-   std::function<void(void)> setForceScalingFactorToOne = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(1));
-   std::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
+   std::function<void(void)> setForceScalingFactorToOne = std::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(1));
+   std::function<void(void)> setForceScalingFactorToHalf = std::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
 
    if( averageForceTorqueOverTwoTimSteps ) {
       bodiesFTContainer2->store();
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
index 391ab7b89..b8cbd96b2 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
@@ -63,6 +63,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace settling_sphere_mem_static_refinement
 {
 
@@ -170,7 +172,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const AABB & do
 
    WALBERLA_LOG_INFO_ON_ROOT(" - refinement box: " << refinementBox);
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, numberOfLevels, refinementBox ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, numberOfLevels, refinementBox ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( domainAABB, numberOfCoarseBlocksPerDirection[0], numberOfCoarseBlocksPerDirection[1], numberOfCoarseBlocksPerDirection[2], false, false, false );
@@ -544,7 +546,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
 
    // create pe bodies
@@ -595,11 +597,11 @@ int main( int argc, char **argv )
 
    // force averaging functionality
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = std::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = std::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
    shared_ptr<pe_coupling::ForceTorqueOnBodiesScaler> forceScaler = make_shared<pe_coupling::ForceTorqueOnBodiesScaler>(blocks, bodyStorageID, real_t(1));
-   std::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
+   std::function<void(void)> setForceScalingFactorToHalf = std::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
 
    if( averageForceTorqueOverTwoTimSteps ) {
       bodiesFTContainer2->store();
diff --git a/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp b/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
index 82fd10937..08a7ad4d2 100644
--- a/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
@@ -66,6 +66,7 @@
 #include "lbm/vtk/Velocity.h"
 #include "vtk/VTKOutput.h"
 
+#include <functional>
 
 namespace squirmer
 {
@@ -289,8 +290,8 @@ int main(int argc, char **argv) {
       return EXIT_FAILURE;
    }
 
-   std::function<void(void)> syncCall = boost::bind(pe::syncShadowOwners<BodyTypeTuple>,
-                                                      boost::ref(blocks->getBlockForest()), bodyStorageID,
+   std::function<void(void)> syncCall = std::bind(pe::syncShadowOwners<BodyTypeTuple>,
+                                                      std::ref(blocks->getBlockForest()), bodyStorageID,
                                                       static_cast<WcTimingTree *>(NULL), overlap, false);
 
    const auto myMat = pe::createMaterial("myMat", real_c(1), real_t(0), real_t(1), real_t(1), real_t(0), real_t(1),
diff --git a/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp b/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
index e6d43a5d0..54cf9698e 100644
--- a/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
@@ -57,6 +57,8 @@
 
 #include "vtk/all.h"
 
+#include <functional>
+
 namespace taylor_coette_flow_mem
 {
 
@@ -303,7 +305,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
    const auto material = pe::createMaterial( "granular", real_t(1.2), real_t(0.25), real_t(0.4), real_t(0.4), real_t(0.35), real_t(1.39e11), real_t(5.18e7), real_t(1.07e2), real_t(1.07e2) );
diff --git a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp
index f29f7d650..d3b4fce22 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp
@@ -67,6 +67,7 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
 #include <vector>
 #include <iomanip>
 #include <iostream>
@@ -185,7 +186,7 @@ static shared_ptr< StructuredBlockForest > createBlockStructure( const Setup & s
    // initialize SetupBlockForest = determine domain decomposition
    SetupBlockForest sforest;
 
-   sforest.addRefinementSelectionFunction( boost::bind( refinementSelection, _1, setup.levels, setup.radius * real_c(2), real_c(setup.length) ) );
+   sforest.addRefinementSelectionFunction( std::bind( refinementSelection, std::placeholders::_1, setup.levels, setup.radius * real_c(2), real_c(setup.length) ) );
    sforest.addWorkloadMemorySUIDAssignmentFunction( workloadAndMemoryAssignment );
 
    sforest.init( AABB( real_c(0), real_c(0), real_c(0), real_c(setup.length), real_c(setup.length), real_c(setup.length) ),
diff --git a/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
index 7e0ad3250..f0153483f 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
@@ -64,6 +64,8 @@
 #include "field/vtk/all.h"
 #include "lbm/vtk/all.h"
 
+#include <functional>
+
 namespace segre_silberberg_psm
 {
 
@@ -502,7 +504,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_c( 1.5 ) * dx;
-   std::function<void(void)> syncCall = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
+   std::function<void(void)> syncCall = std::bind( pe::syncShadowOwners<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
 
-- 
GitLab