From eaf49972a544f624c6aa3f0ec84d149c1f15d6de Mon Sep 17 00:00:00 2001
From: Michael Kuron <mkuron@icp.uni-stuttgart.de>
Date: Thu, 25 Jan 2018 16:51:59 +0100
Subject: [PATCH] Remove boost::function

---
 .../ForcesOnSphereNearPlaneInShearFlow.cpp    |  4 +-
 .../MotionSingleHeavySphere.cpp               |  4 +-
 apps/benchmarks/UniformGrid/UniformGrid.cpp   |  4 +-
 .../BidisperseFluidizedBedDPM.cpp             | 16 +++----
 apps/tutorials/pe/02_ConfinedGasExtended.cpp  |  4 +-
 src/blockforest/Block.cpp                     |  2 +-
 src/blockforest/Block.h                       |  2 +-
 src/blockforest/BlockForest.h                 | 16 +++----
 src/blockforest/GlobalLoadBalancing.h         |  4 +-
 src/blockforest/PhantomBlockForest.cpp        |  4 +-
 src/blockforest/PhantomBlockForest.h          | 10 ++---
 src/blockforest/SetupBlockForest.h            | 12 +++---
 src/blockforest/StructuredBlockForest.h       |  2 +-
 .../communication/NonUniformBufferedScheme.h  | 10 ++---
 .../communication/UniformBufferedScheme.h     | 14 +++----
 .../communication/UniformDirectScheme.h       |  4 +-
 .../loadbalancing/StaticParMetis.h            |  2 +-
 src/core/Abort.h                              |  4 +-
 src/core/debug/Debug.h                        |  6 +--
 src/core/logging/Logging.h                    |  2 +-
 src/core/mpi/OpenMPBufferSystem.cpp           |  4 +-
 src/core/mpi/OpenMPBufferSystem.h             | 10 ++---
 src/cuda/FieldCopy.h                          |  4 +-
 src/domain_decomposition/BlockDataHandling.h  |  4 +-
 src/domain_decomposition/BlockStorage.h       |  6 +--
 .../MakeBlockDataInitFunction.h               | 22 +++++-----
 .../StructuredBlockStorage.h                  | 10 ++---
 src/fft/Fft.cpp                               |  2 +-
 src/fft/Fft.h                                 |  2 +-
 src/field/AccuracyEvaluation.h                |  2 +-
 src/field/AccuracyEvaluationLinePlot.h        |  2 +-
 src/field/AddToStorage.h                      | 42 +++++++++----------
 src/field/Field.h                             |  4 +-
 src/field/VolumetricFlowRateEvaluation.h      | 30 ++++++-------
 src/field/blockforest/BlockDataHandling.h     | 20 ++++-----
 src/field/python/GatherExport.impl.h          |  2 +-
 src/gather/CurveGatherPackInfo.h              |  4 +-
 src/gui/Gui.h                                 |  4 +-
 src/lbm/python/ExportBasic.impl.h             |  4 +-
 src/lbm/refinement/BoundarySetup.h            | 16 +++----
 src/lbm/refinement/RefinementFunctorWrapper.h | 10 ++---
 src/lbm/refinement/TimeStep.h                 |  4 +-
 src/mesh/boundary/BoundarySetup.h             |  4 +-
 src/mesh/vtk/VTKMeshWriter.h                  |  4 +-
 src/pde/iterations/CGFixedStencilIteration.h  |  8 ++--
 src/pde/iterations/CGIteration.h              |  8 ++--
 src/pde/iterations/JacobiIteration.cpp        |  4 +-
 src/pde/iterations/JacobiIteration.h          | 18 ++++----
 src/pde/iterations/RBGSIteration.cpp          |  6 +--
 src/pde/iterations/RBGSIteration.h            | 22 +++++-----
 src/pde/iterations/VCycles.h                  | 14 +++----
 src/pde/iterations/VCycles.impl.h             |  4 +-
 src/pde/sweeps/RBGS.h                         |  4 +-
 src/pde/sweeps/RBGSFixedStencil.h             |  4 +-
 src/pde/sweeps/SOR.h                          |  4 +-
 src/pde/sweeps/SORFixedStencil.h              |  4 +-
 src/pe/rigidbody/BodyStorage.h                | 14 +++----
 .../evaluators/AddedMassForceEvaluator.h      | 10 ++---
 .../BodyVelocityTimeDerivativeEvaluator.h     |  6 +--
 .../EffectiveViscosityFieldEvaluator.h        |  4 +-
 .../evaluators/InteractionForceEvaluator.h    | 10 ++---
 .../evaluators/LiftForceEvaluator.h           | 10 ++---
 .../SolidVolumeFractionFieldEvaluator.h       |  6 +--
 .../utility/BodyVelocityInitializer.h         |  6 +--
 .../utility/SubgridTimeStep.h                 | 10 ++---
 src/pe_coupling/mapping/BodyMapping.h         |  4 +-
 .../momentum_exchange_method/BodyMapping.h    |  8 ++--
 .../restoration/PDFReconstruction.h           |  6 +--
 .../BodyAndVolumeFractionMapping.h            |  6 +--
 src/pe_coupling/utility/TimeStep.h            |  6 +--
 src/python_coupling/DictWrapper.impl.h        |  6 +--
 src/python_coupling/Manager.h                 |  4 +-
 src/python_coupling/helper/MplHelpers.h       |  2 +-
 src/timeloop/PerformanceMeter.cpp             |  4 +-
 src/timeloop/PerformanceMeter.h               |  8 ++--
 src/timeloop/SelectableFunctionCreators.h     | 18 ++++----
 src/timeloop/SweepTimeloop.h                  |  2 +-
 src/timeloop/Timeloop.h                       |  4 +-
 src/vtk/ChainedFilter.h                       |  4 +-
 src/vtk/Initialization.h                      |  6 +--
 src/vtk/VTKOutput.h                           |  6 +--
 tests/field/FieldTiming.cpp                   |  2 +-
 .../lbm/boundary/SimpleDiffusionDirichlet.cpp |  4 +-
 tests/mesh/PeVTKMeshWriterTest.cpp            |  2 +-
 tests/pe/DeleteBody.cpp                       |  2 +-
 tests/pe/ShadowCopy.cpp                       |  2 +-
 .../HinderedSettlingDynamicsDPM.cpp           | 22 +++++-----
 .../SphereWallCollisionBehaviorDPM.cpp        | 16 +++----
 .../BodyAtBlockBoarderCheck.cpp               |  2 +-
 .../DragForceSphereMEM.cpp                    |  2 +-
 ...lobalBodyAsBoundaryMEMStaticRefinement.cpp |  2 +-
 .../LubricationCorrectionMEM.cpp              |  4 +-
 .../PeriodicParticleChannelMEM.cpp            |  4 +-
 .../SegreSilberbergMEM.cpp                    |  8 ++--
 .../SettlingSphereMEM.cpp                     | 10 ++---
 .../SettlingSphereMEMDynamicRefinement.cpp    | 12 +++---
 .../SettlingSphereMEMStaticRefinement.cpp     | 10 ++---
 .../momentum_exchange_method/SquirmerTest.cpp |  4 +-
 .../TaylorCouetteFlowMEM.cpp                  |  4 +-
 .../TorqueSphereMEM.cpp                       |  2 +-
 .../DragForceSpherePSM.cpp                    |  2 +-
 .../SegreSilberbergPSM.cpp                    |  4 +-
 .../TorqueSpherePSM.cpp                       |  2 +-
 103 files changed, 368 insertions(+), 366 deletions(-)

diff --git a/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp b/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
index e10ef4cb9..62cd5258d 100644
--- a/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
+++ b/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
@@ -576,7 +576,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
 
@@ -635,7 +635,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
diff --git a/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp b/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
index 90e2b3479..10c97a06f 100644
--- a/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
+++ b/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
@@ -809,7 +809,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::function<void(void)> syncCall;
+   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 );
    else
@@ -949,7 +949,7 @@ int main( int argc, char **argv )
       boost::filesystem::create_directory( tpath );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
 
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
diff --git a/apps/benchmarks/UniformGrid/UniformGrid.cpp b/apps/benchmarks/UniformGrid/UniformGrid.cpp
index 15c75b3f8..396faa830 100644
--- a/apps/benchmarks/UniformGrid/UniformGrid.cpp
+++ b/apps/benchmarks/UniformGrid/UniformGrid.cpp
@@ -495,7 +495,7 @@ struct AddLB
    {
       // setup of the LB communication for synchronizing the pdf field between neighboring blocks
 
-      boost::function< void () > commFunction;
+      std::function< void () > commFunction;
       if( directComm )
       {
          if( fullComm )
@@ -599,7 +599,7 @@ struct AddLB< LatticeModel_T, typename boost::enable_if_c< boost::mpl::or_<
    {
       // setup of the LB communication for synchronizing the pdf field between neighboring blocks
 
-      boost::function< void () > commFunction;
+      std::function< void () > commFunction;
       if( directComm )
       {
          
diff --git a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
index 1d65e3987..7e5cab129 100644
--- a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
+++ b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
@@ -1093,7 +1093,7 @@ int main( int argc, char **argv ) {
    /////////////////////////////////
 
    // drag correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t>&, const Vector3<real_t> &, real_t, real_t, real_t, real_t)> dragCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t>&, const Vector3<real_t> &, real_t, real_t, real_t, real_t)> dragCorrelationFunction;
    if( dragCorr == DragCorrelation::ErgunWenYu )
    {
       dragCorrelationFunction = pe_coupling::discrete_particle_methods::dragForceErgunWenYu;
@@ -1124,7 +1124,7 @@ int main( int argc, char **argv ) {
    }
 
    // lift correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftCorrelationFunction;
    if( liftCorr == LiftCorrelation::NoLift )
    {
       liftCorrelationFunction = pe_coupling::discrete_particle_methods::noLiftForce;
@@ -1139,7 +1139,7 @@ int main( int argc, char **argv ) {
    }
 
    // added mass correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassCorrelationFunction;
    if( addedMassCorr == AddedMassCorrelation::NoAM )
    {
       addedMassCorrelationFunction = pe_coupling::discrete_particle_methods::noAddedMassForce;
@@ -1154,7 +1154,7 @@ int main( int argc, char **argv ) {
    }
 
    // set up effective viscosity calculation
-   boost::function<real_t ( real_t, real_t)> effectiveViscosityFunction;
+   std::function<real_t ( real_t, real_t)> effectiveViscosityFunction;
    if( effVisc == EffectiveViscosity::None )
    {
       effectiveViscosityFunction = pe_coupling::discrete_particle_methods::calculateUnchangedEffectiveViscosity;
@@ -1186,7 +1186,7 @@ int main( int argc, char **argv ) {
    (*bodyVelocityTimeDerivativeEvaluator)();
 
    // function used to evaluate the interaction force between fluid and particles
-   boost::function<void(void)> dragAndPressureForceEvaluationFunction;
+   std::function<void(void)> dragAndPressureForceEvaluationFunction;
    if( dpm == DPMethod::GNS ) {
       if (interpol == Interpolation::INearestNeighbor) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -1251,7 +1251,7 @@ int main( int argc, char **argv ) {
 
 
    // function to evaluate the lift force contribution
-   boost::function<void(void)> liftForceEvaluationFunction;
+   std::function<void(void)> liftForceEvaluationFunction;
    if( interpol == Interpolation::INearestNeighbor )
    {
       if( dist == Distribution::DNearestNeighbor )
@@ -1311,7 +1311,7 @@ int main( int argc, char **argv ) {
    }
 
    // function to evaluate the added mass contribution
-   boost::function<void(void)> addedMassEvaluationFunction;
+   std::function<void(void)> addedMassEvaluationFunction;
    if( interpol == Interpolation::INearestNeighbor )
    {
       if( dist == Distribution::DNearestNeighbor )
@@ -1371,7 +1371,7 @@ int main( int argc, char **argv ) {
    }
 
    // function to evaluate lubrication forces
-   boost::function<void(void)> lubricationEvaluationFunction;
+   std::function<void(void)> lubricationEvaluationFunction;
    if( lubricationCutOffDistance > real_t(0) )
    {
       typedef pe_coupling::discrete_particle_methods::LubricationForceEvaluator LE_T;
diff --git a/apps/tutorials/pe/02_ConfinedGasExtended.cpp b/apps/tutorials/pe/02_ConfinedGasExtended.cpp
index c58d14c2f..b1ac3e4a3 100644
--- a/apps/tutorials/pe/02_ConfinedGasExtended.cpp
+++ b/apps/tutorials/pe/02_ConfinedGasExtended.cpp
@@ -147,7 +147,7 @@ int main( int argc, char ** argv )
    cr.setGlobalLinearAcceleration( Vec3(0,0,0) );
 
    WALBERLA_LOG_INFO_ON_ROOT("*** SYNCCALL ***");
-   boost::function<void(void)> syncCall;
+   std::function<void(void)> syncCall;
    if (!syncShadowOwners)
    {
       syncCall = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(*forest), storageID, &tt, real_c(0.0), false );
@@ -157,7 +157,7 @@ int main( int argc, char ** argv )
    }
 
    //! [Bind Sync Call]
-   boost::function<void(void)> syncCallWithoutTT;
+   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 );
diff --git a/src/blockforest/Block.cpp b/src/blockforest/Block.cpp
index d4d081c33..d13ba9de7 100644
--- a/src/blockforest/Block.cpp
+++ b/src/blockforest/Block.cpp
@@ -97,7 +97,7 @@ Block::Block( BlockForest & forest, const PhantomBlock & phantom ) :
 
 
 Block::Block( BlockForest & forest, const BlockID & id, const AABB & aabb, const uint_t level, mpi::RecvBuffer & buffer,
-              const boost::function< uint_t ( const uint_t ) > & processMapping ) :
+              const std::function< uint_t ( const uint_t ) > & processMapping ) :
 
    IBlock( forest, aabb, id.getID() ),
 
diff --git a/src/blockforest/Block.h b/src/blockforest/Block.h
index 5f1a089ff..39d958b7e 100644
--- a/src/blockforest/Block.h
+++ b/src/blockforest/Block.h
@@ -77,7 +77,7 @@ public:
           const std::vector< BlockReconstruction::NeighborhoodReconstructionBlock > & neighbors );
    Block( BlockForest & forest, const PhantomBlock & phantom );
    Block( BlockForest & forest, const BlockID & id, const AABB & aabb, const uint_t level, mpi::RecvBuffer & buffer,
-          const boost::function< uint_t ( const uint_t ) > & processMapping = boost::function< uint_t ( const uint_t ) >() );
+          const std::function< uint_t ( const uint_t ) > & processMapping = std::function< uint_t ( const uint_t ) >() );
 
    virtual ~Block() {}
 
diff --git a/src/blockforest/BlockForest.h b/src/blockforest/BlockForest.h
index af1a1f8af..42d1081e1 100644
--- a/src/blockforest/BlockForest.h
+++ b/src/blockforest/BlockForest.h
@@ -49,16 +49,16 @@ class BlockForest : public BlockStorage
 {
 public:
 
-   typedef boost::function< void ( std::vector< std::pair< const Block *, uint_t > > & minTargetLevels,
+   typedef std::function< void ( std::vector< std::pair< const Block *, uint_t > > & minTargetLevels,
                                    std::vector< const Block * > & blocksAlreadyMarkedForRefinement,
                                    const BlockForest & forest ) >
            RefreshMinTargetLevelDeterminationFunction;
 
-   typedef boost::function< void ( BlockForest & forest, const PhantomBlockForest & phantomForest ) >  RefreshCallbackFunction;
+   typedef std::function< void ( BlockForest & forest, const PhantomBlockForest & phantomForest ) >  RefreshCallbackFunction;
 
-   typedef boost::function< void ( std::vector<uint_t> & sendTo, std::vector<uint_t> & recvFrom ) > SnapshotCreationFunction;
-   typedef boost::function< uint_t ( const uint_t ) > SnapshotRestorenFunction;
-   typedef boost::function< void () > SnapshotRestoreCallbackFunction;
+   typedef std::function< void ( std::vector<uint_t> & sendTo, std::vector<uint_t> & recvFrom ) > SnapshotCreationFunction;
+   typedef std::function< uint_t ( const uint_t ) > SnapshotRestorenFunction;
+   typedef std::function< void () > SnapshotRestoreCallbackFunction;
 
    enum FileIOMode { MPI_PARALLEL, MASTER_SLAVE, SERIALIZED_DISTRIBUTED };
 
@@ -87,7 +87,7 @@ public:
    class RefreshCallbackWrappper
    {
    public:
-      typedef boost::function< void () >  Functor_T;
+      typedef std::function< void () >  Functor_T;
       RefreshCallbackWrappper( const Functor_T & functor ) : functor_( functor ) {}
       void operator()( BlockForest &, const PhantomBlockForest & ) { functor_(); }
    private:
@@ -354,7 +354,7 @@ public:
                                     const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
                                     
    template< typename T >
-   inline BlockDataID addBlockData( boost::function< T* ( IBlock* const block ) > function,
+   inline BlockDataID addBlockData( std::function< T* ( IBlock* const block ) > function,
                                     const std::string & identifier          = std::string(),
                                     const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
                                     const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
@@ -452,7 +452,7 @@ public:
    void setRefreshPhantomBlockDataPackFunction( const PhantomBlockForest::PhantomBlockDataPackFunction & f ) { refreshPhantomBlockDataPackFunction_ = f; }
    void setRefreshPhantomBlockDataUnpackFunction( const PhantomBlockForest::PhantomBlockDataUnpackFunction & f ) { refreshPhantomBlockDataUnpackFunction_ = f; }
 
-   inline bool loadBalancingFunctionRegistered() const { return !refreshPhantomBlockMigrationPreparationFunction_.empty(); }
+   inline bool loadBalancingFunctionRegistered() const { return static_cast<bool>(refreshPhantomBlockMigrationPreparationFunction_); }
    /// get number of "setRefreshPhantomBlockMigrationPreparationFunction" calls
    inline uint_t phantomBlockMigrationIterations() const { return phantomBlockMigrationIterations_; }
 
diff --git a/src/blockforest/GlobalLoadBalancing.h b/src/blockforest/GlobalLoadBalancing.h
index 23f79d7b5..d14e98291 100644
--- a/src/blockforest/GlobalLoadBalancing.h
+++ b/src/blockforest/GlobalLoadBalancing.h
@@ -32,7 +32,7 @@
 #include "core/load_balancing/MetisWrapper.h"
 #include "core/math/KahanSummation.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <algorithm>
 #include <list>
@@ -55,7 +55,7 @@ public:
    class MetisConfiguration {
 
    public:
-      typedef boost::function< memory_t ( const BLOCK* const, const BLOCK* const ) > CommunicationFunction;
+      typedef std::function< memory_t ( const BLOCK* const, const BLOCK* const ) > CommunicationFunction;
 
       MetisConfiguration( const bool _includeMetis = false, const bool _forceMetis = false, CommunicationFunction _communicationFunction = 0,
                           const real_t _maxUbvec = real_c(1.5), const uint_t _iterations = uint_c(10) ) :
diff --git a/src/blockforest/PhantomBlockForest.cpp b/src/blockforest/PhantomBlockForest.cpp
index 4dce58b48..691cfe744 100644
--- a/src/blockforest/PhantomBlockForest.cpp
+++ b/src/blockforest/PhantomBlockForest.cpp
@@ -405,7 +405,7 @@ void PhantomBlockForest::migrate( const PhantomBlockDataPackFunction & packBlock
 
          if( packBlockData )
          {
-            WALBERLA_ASSERT( unpackBlockData );
+            WALBERLA_ASSERT( static_cast<bool>(unpackBlockData) );
             packBlockData( buffer, *pBlock );
          }
 
@@ -483,7 +483,7 @@ void PhantomBlockForest::migrate( const PhantomBlockDataPackFunction & packBlock
 
          if( unpackBlockData )
          {
-            WALBERLA_ASSERT( packBlockData );
+            WALBERLA_ASSERT( static_cast<bool>(packBlockData) );
             boost::any data;
             unpackBlockData( buffer, *phantom, data );
             phantom->addData( data );
diff --git a/src/blockforest/PhantomBlockForest.h b/src/blockforest/PhantomBlockForest.h
index 5e263158d..797a29cbe 100644
--- a/src/blockforest/PhantomBlockForest.h
+++ b/src/blockforest/PhantomBlockForest.h
@@ -42,23 +42,23 @@ class PhantomBlockForest
 {
 public:
 
-   typedef boost::function< Set<SUID> ( const std::vector< std::pair< BlockID, Set<SUID> > > & source, const BlockID & destintation ) >
+   typedef std::function< Set<SUID> ( const std::vector< std::pair< BlockID, Set<SUID> > > & source, const BlockID & destintation ) >
            BlockStateDeterminationFunction;
 
-   typedef boost::function< void ( std::vector< std::pair< const PhantomBlock *, boost::any > > & blockData,
+   typedef std::function< void ( std::vector< std::pair< const PhantomBlock *, boost::any > > & blockData,
                                    const PhantomBlockForest & phantomForest ) >
            PhantomBlockDataAssignmentFunction;
 
    /// \param iteration execution counter of this callback
    /// \return should the callback rerun after phantom block migration?
-   typedef boost::function< bool ( std::vector< std::pair< const PhantomBlock *, uint_t > > & targetProcess,
+   typedef std::function< bool ( std::vector< std::pair< const PhantomBlock *, uint_t > > & targetProcess,
                                    std::set< uint_t > & processesToRecvFrom,
                                    const PhantomBlockForest & phantomForest,
                                    const uint_t iteration ) >
            MigrationPreparationFunction; // = load balancing
 
-   typedef boost::function< void ( mpi::SendBuffer & buffer, const PhantomBlock & block ) >                    PhantomBlockDataPackFunction;
-   typedef boost::function< void ( mpi::RecvBuffer & buffer, const PhantomBlock & block, boost::any & data ) > PhantomBlockDataUnpackFunction;
+   typedef std::function< void ( mpi::SendBuffer & buffer, const PhantomBlock & block ) >                    PhantomBlockDataPackFunction;
+   typedef std::function< void ( mpi::RecvBuffer & buffer, const PhantomBlock & block, boost::any & data ) > PhantomBlockDataUnpackFunction;
 
 
 
diff --git a/src/blockforest/SetupBlockForest.h b/src/blockforest/SetupBlockForest.h
index 01a1379a3..dbea75a00 100644
--- a/src/blockforest/SetupBlockForest.h
+++ b/src/blockforest/SetupBlockForest.h
@@ -31,7 +31,7 @@
 #include "core/math/AABB.h"
 #include "core/uid/SUID.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <set>
 #include <string>
 #include <vector>
@@ -45,7 +45,7 @@ class SetupBlockForest : private NonCopyable {
 
 public:
 
-   typedef boost::function< uint_t ( SetupBlockForest & forest, const uint_t numberOfProcesses, const memory_t perProcessMemoryLimit ) >
+   typedef std::function< uint_t ( SetupBlockForest & forest, const uint_t numberOfProcesses, const memory_t perProcessMemoryLimit ) >
           TargetProcessAssignmentFunction; // returns number of processes (may be lower than numberOfProcesses)
 
 
@@ -72,14 +72,14 @@ public:
 
    // Do not use a vector of bool's! Due to the implementation of this vector in the standard library, parallel access to a
    // vector of bool's - even on different elements - is not thread-safe!
-   typedef boost::function< void ( std::vector<uint8_t>& excludeBlock, const RootBlockAABB& aabb ) > RootBlockExclusionFunction;
+   typedef std::function< void ( std::vector<uint8_t>& excludeBlock, const RootBlockAABB& aabb ) > RootBlockExclusionFunction;
 
-   typedef boost::function< void ( SetupBlockForest& forest ) > RefinementSelectionFunction;
-   typedef boost::function< void ( SetupBlockForest& forest ) > WorkloadMemorySUIDAssignmentFunction;
+   typedef std::function< void ( SetupBlockForest& forest ) > RefinementSelectionFunction;
+   typedef std::function< void ( SetupBlockForest& forest ) > WorkloadMemorySUIDAssignmentFunction;
 
    typedef std::vector< std::pair< const SetupBlock*, const SetupBlock* > >               CommunicationPairs;
    typedef std::vector< real_t >                                                          CommunicationWeights;
-   typedef boost::function< void ( const CommunicationPairs &, CommunicationWeights & ) > CommunicationWeightFunction;
+   typedef std::function< void ( const CommunicationPairs &, CommunicationWeights & ) > CommunicationWeightFunction;
 
    inline static void NullCommunicationWeightFunction( const CommunicationPairs &, CommunicationWeights & )
    {
diff --git a/src/blockforest/StructuredBlockForest.h b/src/blockforest/StructuredBlockForest.h
index 19de504b6..82f4e810d 100644
--- a/src/blockforest/StructuredBlockForest.h
+++ b/src/blockforest/StructuredBlockForest.h
@@ -138,7 +138,7 @@ public:
    { return blockForest_->addBlockData( dataHandling, identifier, requiredSelectors, incompatibleSelectors ); }
    
    template< typename T >
-   inline BlockDataID addBlockData( boost::function< T* ( IBlock* const block ) > function,
+   inline BlockDataID addBlockData( std::function< T* ( IBlock* const block ) > function,
                                     const std::string& identifier = std::string(),
                                     const Set<SUID>& requiredSelectors     = Set<SUID>::emptySet(),
                                     const Set<SUID>& incompatibleSelectors = Set<SUID>::emptySet() )
diff --git a/src/blockforest/communication/NonUniformBufferedScheme.h b/src/blockforest/communication/NonUniformBufferedScheme.h
index 12d059fc6..e2eca543d 100644
--- a/src/blockforest/communication/NonUniformBufferedScheme.h
+++ b/src/blockforest/communication/NonUniformBufferedScheme.h
@@ -37,7 +37,7 @@
 #include "core/uid/SUID.h"
 
 #include <boost/bind.hpp>
-#include <boost/function.hpp>
+#include <functional>
 
 #include <map>
 #include <set>
@@ -60,8 +60,8 @@ public:
    typedef mpi::RecvBuffer RecvBuffer;
 
    typedef shared_ptr< blockforest::communication::NonUniformPackInfo > PackInfo;
-   typedef boost::function<void ()>                            VoidFunction;
-   typedef boost::function<void ( SendBuffer & buffer )> SendBufferFunction;
+   typedef std::function<void ()>                            VoidFunction;
+   typedef std::function<void ( SendBuffer & buffer )> SendBufferFunction;
 
    //**Construction & Destruction***************************************************************************************
    /*! \name Construction & Destruction */
@@ -110,7 +110,7 @@ public:
    //@{
 
    void startCommunication() { startCommunicateEqualLevel(); startCommunicateCoarseToFine(); startCommunicateFineToCoarse(); }
-   boost::function<void()>  getStartCommunicateFunctor() { return boost::bind( &NonUniformBufferedScheme::startCommunication, this ); }
+   std::function<void()>  getStartCommunicateFunctor() { return boost::bind( &NonUniformBufferedScheme::startCommunication, this ); }
 
    inline void startCommunicateEqualLevel();
    inline void startCommunicateCoarseToFine();
@@ -121,7 +121,7 @@ public:
    inline void startCommunicateFineToCoarse( const uint_t fineLevel );
    
    void wait() { waitCommunicateEqualLevel(); waitCommunicateCoarseToFine(); waitCommunicateFineToCoarse(); }
-   boost::function<void() >  getWaitFunctor() { return boost::bind( &NonUniformBufferedScheme::wait, this ); }
+   std::function<void() >  getWaitFunctor() { return boost::bind( &NonUniformBufferedScheme::wait, this ); }
 
    inline void waitCommunicateEqualLevel();
    inline void waitCommunicateCoarseToFine();
diff --git a/src/blockforest/communication/UniformBufferedScheme.h b/src/blockforest/communication/UniformBufferedScheme.h
index 5fc500e20..393301f6c 100644
--- a/src/blockforest/communication/UniformBufferedScheme.h
+++ b/src/blockforest/communication/UniformBufferedScheme.h
@@ -39,7 +39,7 @@
 #include "core/uid/SUID.h"
 
 #include <boost/bind.hpp>
-#include <boost/function.hpp>
+#include <functional>
 
 #include <map>
 #include <vector>
@@ -89,8 +89,8 @@ public:
 
    typedef shared_ptr< walberla::communication::UniformPackInfo >  PackInfo;
 
-   typedef boost::function<void ()>                            VoidFunction;
-   typedef boost::function<void ( SendBuffer & buffer )> SendBufferFunction;
+   typedef std::function<void ()>                            VoidFunction;
+   typedef std::function<void ( SendBuffer & buffer )> SendBufferFunction;
 
    typedef walberla::communication::UniformPackInfo CommunicationItemInfo;
 
@@ -161,8 +161,8 @@ public:
    void startCommunication();
    void wait();
 
-   boost::function<void()> getStartCommunicateFunctor();
-   boost::function<void()> getWaitFunctor();
+   std::function<void()> getStartCommunicateFunctor();
+   std::function<void()> getWaitFunctor();
    //@}
    //*******************************************************************************************************************
 
@@ -537,13 +537,13 @@ void UniformBufferedScheme<Stencil>::localBufferUnpacking( const uint_t index, c
 }
 
 template< typename Stencil >
-boost::function<void()> UniformBufferedScheme<Stencil>::getStartCommunicateFunctor()
+std::function<void()> UniformBufferedScheme<Stencil>::getStartCommunicateFunctor()
 {
    return boost::bind( &UniformBufferedScheme::startCommunication, this );
 }
 
 template< typename Stencil >
-boost::function<void()> UniformBufferedScheme<Stencil>::getWaitFunctor()
+std::function<void()> UniformBufferedScheme<Stencil>::getWaitFunctor()
 {
    return boost::bind( &UniformBufferedScheme::wait, this );
 }
diff --git a/src/blockforest/communication/UniformDirectScheme.h b/src/blockforest/communication/UniformDirectScheme.h
index 4c2e0a4de..16d6e9fdd 100644
--- a/src/blockforest/communication/UniformDirectScheme.h
+++ b/src/blockforest/communication/UniformDirectScheme.h
@@ -112,8 +112,8 @@ public:
    void startCommunication();
    void wait();
 
-   boost::function<void()> getStartCommunicateFunctor() { return boost::bind( &UniformDirectScheme::startCommunication, this ); }
-   boost::function<void()> getWaitFunctor()             { return boost::bind( &UniformDirectScheme::wait,               this ); }
+   std::function<void()> getStartCommunicateFunctor() { return boost::bind( &UniformDirectScheme::startCommunication, this ); }
+   std::function<void()> getWaitFunctor()             { return boost::bind( &UniformDirectScheme::wait,               this ); }
    //@}
    //*******************************************************************************************************************
 
diff --git a/src/blockforest/loadbalancing/StaticParMetis.h b/src/blockforest/loadbalancing/StaticParMetis.h
index 85012654d..0e77baf45 100644
--- a/src/blockforest/loadbalancing/StaticParMetis.h
+++ b/src/blockforest/loadbalancing/StaticParMetis.h
@@ -41,7 +41,7 @@ public:
    enum WeightsToUse { PARMETIS_NO_WEIGHTS = 0, PARMETIS_EDGE_WEIGHTS = 1, PARMETIS_VERTEX_WEIGHTS = 2, PARMETIS_BOTH_WEIGHTS = 3 };
 
    typedef std::pair< const SetupBlock *, const SetupBlock * > BlockPair;
-   typedef boost::function<void (const std::vector< BlockPair > & edges, std::vector< int64_t > & weights ) > CommWeightFunction;
+   typedef std::function<void (const std::vector< BlockPair > & edges, std::vector< int64_t > & weights ) > CommWeightFunction;
 
    StaticLevelwiseParMetis( const Algorithm algorithm = PARMETIS_PART_GEOM_KWAY )
       : algorithm_( algorithm ), weightsToUse_( PARMETIS_VERTEX_WEIGHTS ) {}
diff --git a/src/core/Abort.h b/src/core/Abort.h
index 3fa01308b..8c52f6783 100644
--- a/src/core/Abort.h
+++ b/src/core/Abort.h
@@ -23,7 +23,7 @@
 
 #include "core/singleton/Singleton.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <cstdlib>
 #include <sstream>
 #include <stdexcept>
@@ -40,7 +40,7 @@ class Abort : public singleton::Singleton<Abort>
 
 public:
 
-   typedef boost::function<void ( const std::string & message, const std::string & callerPath, const int line, bool withDebugInfo  )> AbortFunction;
+   typedef std::function<void ( const std::string & message, const std::string & callerPath, const int line, bool withDebugInfo  )> AbortFunction;
 
    void resetAbortFunction( const AbortFunction & function = AbortFunction() ) { abortFunction_ = function; }
 
diff --git a/src/core/debug/Debug.h b/src/core/debug/Debug.h
index 8bca728a3..3ea4bcd05 100644
--- a/src/core/debug/Debug.h
+++ b/src/core/debug/Debug.h
@@ -25,7 +25,7 @@
 
 #ifndef NDEBUG
 #   include "CheckFunctions.h"
-#   include <boost/function.hpp>
+#   include <functional>
 #   include <boost/bind.hpp>
 #   include <string>
 #endif
@@ -255,12 +255,12 @@ void myAssert(const char * const file, const int line);
 class ConditionalExec
 {
 public:
-   ConditionalExec( bool cond, const boost::function<void (void)> & function ) : cond_(cond), function_(function) { }
+   ConditionalExec( bool cond, const std::function<void (void)> & function ) : cond_(cond), function_(function) { }
    ~ConditionalExec() { if(cond_) function_(); }
    operator bool() const { return cond_; }
 private:
    bool cond_;
-   boost::function<void (void)> function_;
+   std::function<void (void)> function_;
 };
 /// \endcond
 
diff --git a/src/core/logging/Logging.h b/src/core/logging/Logging.h
index 0f7a88319..603b94414 100644
--- a/src/core/logging/Logging.h
+++ b/src/core/logging/Logging.h
@@ -31,7 +31,7 @@
 #include "core/Regex.h"
 
 #include <boost/algorithm/string/replace.hpp>
-#include <boost/function.hpp>
+#include <functional>
 
 #include <cmath>
 #include <fstream>
diff --git a/src/core/mpi/OpenMPBufferSystem.cpp b/src/core/mpi/OpenMPBufferSystem.cpp
index afdc66b1a..54471ccf4 100644
--- a/src/core/mpi/OpenMPBufferSystem.cpp
+++ b/src/core/mpi/OpenMPBufferSystem.cpp
@@ -47,14 +47,14 @@ OpenMPBufferSystem::OpenMPBufferSystem( const MPI_Comm & communicator, int tag,
 }
 
 
-void OpenMPBufferSystem::addReceivingFunction( MPIRank rank, boost::function<void ( RecvBuffer & buf ) > recvFunction )
+void OpenMPBufferSystem::addReceivingFunction( MPIRank rank, std::function<void ( RecvBuffer & buf ) > recvFunction )
 {
    dirty_ = true;
    recvFunctions_[rank] = recvFunction;
 }
 
 
-void OpenMPBufferSystem::addSendingFunction  ( MPIRank rank, boost::function<void ( SendBuffer & buf ) > sendFunction )
+void OpenMPBufferSystem::addSendingFunction  ( MPIRank rank, std::function<void ( SendBuffer & buf ) > sendFunction )
 {
    dirty_ = true;
    sendRanks_.push_back( rank );
diff --git a/src/core/mpi/OpenMPBufferSystem.h b/src/core/mpi/OpenMPBufferSystem.h
index f38f47160..9fd31e2b2 100644
--- a/src/core/mpi/OpenMPBufferSystem.h
+++ b/src/core/mpi/OpenMPBufferSystem.h
@@ -23,7 +23,7 @@
 
 #include "BufferSystem.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <map>
 
 
@@ -60,8 +60,8 @@ public:
 
    bool isSizeCommunicatedInNextStep() const          { return bs_.isSizeCommunicatedInNextStep(); }
 
-   void addReceivingFunction( MPIRank rank, boost::function<void ( RecvBuffer & buf ) > recvFunction );
-   void addSendingFunction  ( MPIRank rank, boost::function<void ( SendBuffer & buf ) > sendFunction );
+   void addReceivingFunction( MPIRank rank, std::function<void ( RecvBuffer & buf ) > recvFunction );
+   void addSendingFunction  ( MPIRank rank, std::function<void ( SendBuffer & buf ) > sendFunction );
 
    void clearReceivingFunctions() { dirty_ = true; recvFunctions_.clear(); }
    void clearSendingFunctions()   { dirty_ = true; sendFunctions_.clear(); sendRanks_.clear(); }
@@ -86,11 +86,11 @@ private:
 
    bool sizeChangesEverytime_;
 
-   std::map<MPIRank, boost::function<void ( RecvBuffer & )> > recvFunctions_;
+   std::map<MPIRank, std::function<void ( RecvBuffer & )> > recvFunctions_;
 
 
    std::vector<MPIRank> sendRanks_;
-   std::vector< boost::function<void ( SendBuffer & )> > sendFunctions_;
+   std::vector< std::function<void ( SendBuffer & )> > sendFunctions_;
 
    void startCommunicationOpenMP();
    void startCommunicationSerial();
diff --git a/src/cuda/FieldCopy.h b/src/cuda/FieldCopy.h
index 87af5060d..07fd04c80 100644
--- a/src/cuda/FieldCopy.h
+++ b/src/cuda/FieldCopy.h
@@ -49,7 +49,7 @@ namespace cuda {
    }
 
    template<typename DstType, typename SrcType>
-   boost::function<void()> fieldCpyFunctor( const shared_ptr< StructuredBlockStorage > & blocks,
+   std::function<void()> fieldCpyFunctor( const shared_ptr< StructuredBlockStorage > & blocks,
                                             BlockDataID dstID, ConstBlockDataID srcID )
    {
       return boost::bind( fieldCpy<DstType,SrcType>, blocks, dstID, srcID );
@@ -66,7 +66,7 @@ namespace cuda {
    }
 
    template<typename DstType, typename SrcType>
-   boost::function<void(IBlock*)> fieldCpyFunctor( BlockDataID dstID, ConstBlockDataID srcID )
+   std::function<void(IBlock*)> fieldCpyFunctor( BlockDataID dstID, ConstBlockDataID srcID )
    {
       return boost::bind( fieldCpySweepFunction<DstType,SrcType>, dstID, srcID, _1 );
    }
diff --git a/src/domain_decomposition/BlockDataHandling.h b/src/domain_decomposition/BlockDataHandling.h
index c9e74212e..4bd96dae0 100644
--- a/src/domain_decomposition/BlockDataHandling.h
+++ b/src/domain_decomposition/BlockDataHandling.h
@@ -82,7 +82,7 @@ class BlockDataHandlingFunctionAdaptor : public BlockDataHandling<T>
 {
 public:
 
-   typedef boost::function< T* ( IBlock * const block ) > Function;
+   typedef std::function< T* ( IBlock * const block ) > Function;
 
    BlockDataHandlingFunctionAdaptor( const Function & function ) : function_( function ) {}
 
@@ -130,7 +130,7 @@ struct BlockDataCreator
       requiredSelectors_( requiredSelectors ), incompatibleSelectors_( incompatibleSelectors )
    {}
 
-   BlockDataCreator( const boost::function< T* ( IBlock * const block ) > & function,
+   BlockDataCreator( const std::function< T* ( IBlock * const block ) > & function,
                      const std::string & identifier            = std::string(),
                      const Set<SUID> &   requiredSelectors     = Set<SUID>::emptySet(),
                      const Set<SUID> &   incompatibleSelectors = Set<SUID>::emptySet() ) :
diff --git a/src/domain_decomposition/BlockStorage.h b/src/domain_decomposition/BlockStorage.h
index 4d3292e21..fb778309a 100644
--- a/src/domain_decomposition/BlockStorage.h
+++ b/src/domain_decomposition/BlockStorage.h
@@ -34,7 +34,7 @@
 #include "core/uid/GlobalState.h"
 #include "core/uid/SUID.h"
 
-#include <boost/function.hpp>
+#include <functional>
 //#include <boost/type_traits/is_base_of.hpp>
 #include <string>
 #include <vector>
@@ -472,7 +472,7 @@ public:
                                     const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
 
    template< typename T >
-   inline BlockDataID addBlockData( boost::function< T* ( IBlock* const block ) > function,
+   inline BlockDataID addBlockData( std::function< T* ( IBlock* const block ) > function,
                                     const std::string & identifier          = std::string(),
                                     const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
                                     const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
@@ -676,7 +676,7 @@ inline BlockDataID BlockStorage::addBlockData( const shared_ptr< T > & dataHandl
 */
 //**********************************************************************************************************************
 template< typename T >
-inline BlockDataID BlockStorage::addBlockData( boost::function< T* ( IBlock* const block ) > function, const std::string & identifier,
+inline BlockDataID BlockStorage::addBlockData( std::function< T* ( IBlock* const block ) > function, const std::string & identifier,
                                                const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors )
 {
    internal::SelectableBlockDataHandlingWrapper dataHandling(
diff --git a/src/domain_decomposition/MakeBlockDataInitFunction.h b/src/domain_decomposition/MakeBlockDataInitFunction.h
index 2f82ea473..466f944c1 100644
--- a/src/domain_decomposition/MakeBlockDataInitFunction.h
+++ b/src/domain_decomposition/MakeBlockDataInitFunction.h
@@ -24,7 +24,7 @@
 #include "IBlock.h"
 
 #include <boost/bind.hpp>
-#include <boost/function.hpp>
+#include <functional>
 
 
 namespace walberla {
@@ -91,61 +91,61 @@ namespace internal
 
 
 template<class T>
-boost::function< T* ( const IBlock* const block ) >
+std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction() {
    return boost::bind( internal::newFunc<T>, _1);
 }
 
 template<class T, class P1>
-boost::function< T* ( const IBlock* const block ) >
+std::function< T* ( const IBlock* const block ) >
 makeBlockDataInitFunction(const P1 & p1) {
    return boost::bind( internal::newFunc<T,P1>, _1,p1);
 }
 
 template<class T, class P1, class P2>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3, class P4>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
 
 template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9>
-boost::function< T* ( const IBlock* const block ) >
+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);
 }
diff --git a/src/domain_decomposition/StructuredBlockStorage.h b/src/domain_decomposition/StructuredBlockStorage.h
index 8fbd4fb04..4315429d2 100644
--- a/src/domain_decomposition/StructuredBlockStorage.h
+++ b/src/domain_decomposition/StructuredBlockStorage.h
@@ -43,14 +43,14 @@ template< typename T >
 struct StructuredBlockDataCreator {
 
    StructuredBlockDataCreator(
-         const boost::function< T * ( IBlock * const block, StructuredBlockStorage * const storage ) > & function,
+         const std::function< T * ( IBlock * const block, StructuredBlockStorage * const storage ) > & function,
          const std::string & identifier            = std::string(),
          const Set<SUID> &   requiredSelectors     = Set<SUID>::emptySet(),
          const Set<SUID> &   incompatibleSelectors = Set<SUID>::emptySet() ) :
       function_( function ), identifier_( identifier ),
       requiredSelectors_( requiredSelectors ), incompatibleSelectors_( incompatibleSelectors ) {}
 
-   boost::function< T * ( IBlock * const block, StructuredBlockStorage * const storage ) > function_;
+   std::function< T * ( IBlock * const block, StructuredBlockStorage * const storage ) > function_;
 
    std::string identifier_;
    Set<SUID>   requiredSelectors_;
@@ -243,7 +243,7 @@ public:
    { return blockStorage_->addBlockData( dataHandling, identifier, requiredSelectors, incompatibleSelectors ); }
 
    template< typename T >
-   inline BlockDataID addBlockData( boost::function< T* ( IBlock* const block ) > function,
+   inline BlockDataID addBlockData( std::function< T* ( IBlock* const block ) > function,
                                     const std::string& identifier = std::string(),
                                     const Set<SUID>& requiredSelectors     = Set<SUID>::emptySet(),
                                     const Set<SUID>& incompatibleSelectors = Set<SUID>::emptySet() )
@@ -413,7 +413,7 @@ public:
                                                                                { return StructuredBlockDataAdder( *this, identifier ); }
 
    template< typename T >
-   inline BlockDataID addStructuredBlockData( boost::function< T* ( IBlock* const block, StructuredBlockStorage* const storage ) > function,
+   inline BlockDataID addStructuredBlockData( std::function< T* ( IBlock* const block, StructuredBlockStorage* const storage ) > function,
                                               const std::string& identifier          = std::string(),
                                               const Set<SUID>& requiredSelectors     = Set<SUID>::emptySet(),
                                               const Set<SUID>& incompatibleSelectors = Set<SUID>::emptySet() );
@@ -1072,7 +1072,7 @@ inline void StructuredBlockStorage::transformBlockLocalToGlobalCellInterval( Cel
 //**********************************************************************************************************************
 template< typename T >
 inline BlockDataID StructuredBlockStorage::addStructuredBlockData(
-      boost::function< T* ( IBlock* const block, StructuredBlockStorage* const storage ) > function,
+      std::function< T* ( IBlock* const block, StructuredBlockStorage* const storage ) > function,
       const std::string& identifier, const Set<SUID>& requiredSelectors, const Set<SUID>& incompatibleSelectors )
 {
    internal::SelectableBlockDataHandlingWrapper dataHandling(
diff --git a/src/fft/Fft.cpp b/src/fft/Fft.cpp
index f54423ee7..bbae269ea 100644
--- a/src/fft/Fft.cpp
+++ b/src/fft/Fft.cpp
@@ -7,7 +7,7 @@ namespace fft {
 
 template <typename Field_T>
 FourierTransform<Field_T>::FourierTransform( shared_ptr< StructuredBlockForest > & blocks, BlockDataID fieldId,
-                                             boost::function<real_t(uint_t,uint_t,uint_t)> greens )
+                                             std::function<real_t(uint_t,uint_t,uint_t)> greens )
 : blocks_(blocks), fieldId_(fieldId), greens_()
 {
 #ifdef WALBERLA_USE_PFFT
diff --git a/src/fft/Fft.h b/src/fft/Fft.h
index 0f4c29f46..481c96bb8 100644
--- a/src/fft/Fft.h
+++ b/src/fft/Fft.h
@@ -22,7 +22,7 @@ class FourierTransform
 {
    public:
       FourierTransform( shared_ptr< StructuredBlockForest > & blocks, BlockDataID fieldId,
-                        boost::function<real_t(uint_t,uint_t,uint_t)> greens = boost::function<real_t(uint_t,uint_t,uint_t)>() );
+                        std::function<real_t(uint_t,uint_t,uint_t)> greens = std::function<real_t(uint_t,uint_t,uint_t)>() );
       void operator() ();
       
    private:
diff --git a/src/field/AccuracyEvaluation.h b/src/field/AccuracyEvaluation.h
index a043dc095..4f6e40176 100644
--- a/src/field/AccuracyEvaluation.h
+++ b/src/field/AccuracyEvaluation.h
@@ -133,7 +133,7 @@ inline real_t accuracyEvaluationAbsError( const Vector3<real_t> & error ) { retu
 //**********************************************************************************************************************
 
 template< typename Field_T,
-          typename SolutionFunction_T = boost::function< typename Field_T::value_type ( const Vector3< real_t > & ) >,
+          typename SolutionFunction_T = std::function< typename Field_T::value_type ( const Vector3< real_t > & ) >,
           typename Filter_T = DefaultEvaluationFilter >
 class AccuracyEvaluation
 {
diff --git a/src/field/AccuracyEvaluationLinePlot.h b/src/field/AccuracyEvaluationLinePlot.h
index 217a2c55a..d2c1fcbe6 100644
--- a/src/field/AccuracyEvaluationLinePlot.h
+++ b/src/field/AccuracyEvaluationLinePlot.h
@@ -191,7 +191,7 @@ inline void accuracyEvaluationLinePlotIO( std::ofstream & file, const std::vecto
 //**********************************************************************************************************************
 
 template< typename Field_T,
-          typename SolutionFunction_T = boost::function< typename Field_T::value_type ( const Vector3< real_t > & ) >,
+          typename SolutionFunction_T = std::function< typename Field_T::value_type ( const Vector3< real_t > & ) >,
           typename Filter_T = DefaultEvaluationFilter >
 class AccuracyEvaluationLinePlot
 {
diff --git a/src/field/AddToStorage.h b/src/field/AddToStorage.h
index 5136dab5a..7895d3b55 100644
--- a/src/field/AddToStorage.h
+++ b/src/field/AddToStorage.h
@@ -64,8 +64,8 @@ BlockDataID addFlagFieldToStorage( const shared_ptr< BlockStorage_T > & blocks,
                                    const std::string & identifier,
                                    const uint_t nrOfGhostLayers = uint_t(1),
                                    const bool alwaysInitialize = false,
-                                   const boost::function< void ( FlagField_T * field, IBlock * const block ) > & initFunction =
-                                      boost::function< void ( FlagField_T * field, IBlock * const block ) >(),
+                                   const std::function< void ( FlagField_T * field, IBlock * const block ) > & initFunction =
+                                      std::function< void ( FlagField_T * field, IBlock * const block ) >(),
                                    const Set<SUID> & requiredSelectors = Set<SUID>::emptySet(),
                                    const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
 {
@@ -91,7 +91,7 @@ BlockDataID addFlagFieldToStorage( const shared_ptr< BlockStorage_T > & blocks,
                                    const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
 {
    return addFlagFieldToStorage< FlagField_T >( blocks, identifier, nrOfGhostLayers, alwaysInitialize,
-                                                boost::function< void ( FlagField_T * field, IBlock * const block ) >(),
+                                                std::function< void ( FlagField_T * field, IBlock * const block ) >(),
                                                 requiredSelectors, incompatibleSelectors );
 }
 
@@ -108,9 +108,9 @@ struct AddToStorage
 {
    static BlockDataID add( const shared_ptr< BlockStorage_T > & blocks, const std::string & identifier,
                            const typename GhostLayerField_T::value_type & initValue, const Layout layout, const uint_t nrOfGhostLayers,
-                           const bool /*alwaysInitialize*/, const boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction,
+                           const bool /*alwaysInitialize*/, const std::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction,
                            const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors,
-                           const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = defaultSize )
+                           const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = defaultSize )
    {
       auto dataHandling = walberla::make_shared< field::AlwaysInitializeBlockDataHandling< GhostLayerField_T > >( blocks, nrOfGhostLayers, initValue, layout, calculateSize );
       dataHandling->addInitializationFunction( initFunction );
@@ -125,9 +125,9 @@ struct AddToStorage< GhostLayerField_T, BlockStorage_T,
 {
    static BlockDataID add( const shared_ptr< BlockStorage_T > & blocks, const std::string & identifier,
                            const typename GhostLayerField_T::value_type & initValue, const Layout layout, const uint_t nrOfGhostLayers,
-                           const bool alwaysInitialize, const boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction,
+                           const bool alwaysInitialize, const std::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction,
                            const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors,
-                           const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = defaultSize )
+                           const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = defaultSize )
    {
       if( alwaysInitialize )
       {
@@ -153,8 +153,8 @@ BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
                           const Layout layout = zyxf,
                           const uint_t nrOfGhostLayers = uint_t(1),
                           const bool alwaysInitialize = false,
-                          const boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
-                             boost::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
+                          const std::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
+                             std::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
                           const Set<SUID> & requiredSelectors = Set<SUID>::emptySet(),
                           const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
 {
@@ -174,7 +174,7 @@ BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
                           const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
 {
    return addToStorage< GhostLayerField_T >( blocks, identifier, initValue, layout, nrOfGhostLayers, alwaysInitialize,
-                                             boost::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
+                                             std::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
                                              requiredSelectors, incompatibleSelectors );
 }
 
@@ -183,13 +183,13 @@ BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
 template< typename GhostLayerField_T, typename BlockStorage_T >
 BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
                           const std::string & identifier,
-                          const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize,
+                          const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize,
                           const typename GhostLayerField_T::value_type & initValue = typename GhostLayerField_T::value_type(),
                           const Layout layout = zyxf,
                           const uint_t nrOfGhostLayers = uint_t(1),
                           const bool alwaysInitialize = false,
-                          const boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
-                          boost::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
+                          const std::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
+                          std::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
                           const Set<SUID> & requiredSelectors = Set<SUID>::emptySet(),
                           const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
 {
@@ -203,7 +203,7 @@ BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
 template< typename GhostLayerField_T, typename BlockStorage_T >
 BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
                           const std::string & identifier,
-                          const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize,
+                          const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize,
                           const typename GhostLayerField_T::value_type & initValue,
                           const Layout layout,
                           const uint_t nrOfGhostLayers,
@@ -211,7 +211,7 @@ BlockDataID addToStorage( const shared_ptr< BlockStorage_T > & blocks,
                           const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() )
 {
    return addToStorage< GhostLayerField_T >( blocks, identifier, initValue, layout, nrOfGhostLayers, alwaysInitialize,
-                                             boost::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
+                                             std::function< void ( GhostLayerField_T * field, IBlock * const block ) >(),
                                              requiredSelectors, incompatibleSelectors, calculateSize );
 }
 
@@ -274,8 +274,8 @@ struct Creator : public domain_decomposition::BlockDataCreator< GhostLayerField_
             const Layout layout = zyxf,
             const uint_t nrOfGhostLayers = uint_t(1),
             const bool /*alwaysInitialize*/ = false,
-            const boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
-               boost::function< void ( GhostLayerField_T * field, IBlock * const block ) >() ) :
+            const std::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
+               std::function< void ( GhostLayerField_T * field, IBlock * const block ) >() ) :
       domain_decomposition::BlockDataCreator< GhostLayerField_T >( shared_ptr< field::DefaultBlockDataHandling< GhostLayerField_T > >(),
                                                                    identifier, requiredSelectors, incompatibleSelectors )
    {
@@ -313,8 +313,8 @@ struct Creator< GhostLayerField_T,
             const Layout layout = zyxf,
             const uint_t nrOfGhostLayers = uint_t(1),
             const bool alwaysInitialize = false,
-            const boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
-               boost::function< void ( GhostLayerField_T * field, IBlock * const block ) >() ) :
+            const std::function< void ( GhostLayerField_T * field, IBlock * const block ) > & initFunction =
+               std::function< void ( GhostLayerField_T * field, IBlock * const block ) >() ) :
       domain_decomposition::BlockDataCreator< GhostLayerField_T >( shared_ptr< field::DefaultBlockDataHandling< GhostLayerField_T > >(),
                                                                    identifier, requiredSelectors, incompatibleSelectors )
    {
@@ -358,8 +358,8 @@ struct Creator< FlagField<T> > : public domain_decomposition::BlockDataCreator<
             const Set<SUID> & incompatibleSelectors,
             const uint_t nrOfGhostLayers = uint_t(1),
             const bool alwaysInitialize = false,
-            const boost::function< void ( FlagField<T> * field, IBlock * const block ) > & initFunction =
-               boost::function< void ( FlagField<T> * field, IBlock * const block ) >() ) :
+            const std::function< void ( FlagField<T> * field, IBlock * const block ) > & initFunction =
+               std::function< void ( FlagField<T> * field, IBlock * const block ) >() ) :
       domain_decomposition::BlockDataCreator< FlagField<T> >( shared_ptr< field::DefaultBlockDataHandling< FlagField<T> > >(),
                                                               identifier, requiredSelectors, incompatibleSelectors )
    {
diff --git a/src/field/Field.h b/src/field/Field.h
index 079e8d7fe..913655771 100644
--- a/src/field/Field.h
+++ b/src/field/Field.h
@@ -36,7 +36,7 @@
 #include "iterators/FieldIterator.h"
 #include "iterators/FieldPointer.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <memory>
 #include <vector>
 
@@ -277,7 +277,7 @@ namespace field {
       //** Monitoring  *************************************************************************************************
       /*! \name Monitoring */
       //@{
-      typedef boost::function< void ( cell_idx_t x, cell_idx_t y,
+      typedef std::function< void ( cell_idx_t x, cell_idx_t y,
                                       cell_idx_t z, cell_idx_t f, const T & value) > MonitorFunction;
 
       void addMonitoringFunction( const MonitorFunction & func );
diff --git a/src/field/VolumetricFlowRateEvaluation.h b/src/field/VolumetricFlowRateEvaluation.h
index 26bf6ec81..1763ea0eb 100644
--- a/src/field/VolumetricFlowRateEvaluation.h
+++ b/src/field/VolumetricFlowRateEvaluation.h
@@ -47,8 +47,8 @@ namespace field {
 
 namespace internal {
 
-typedef boost::function< real_t () >  FlowRateSolution_T;
-typedef boost::function< Vector3< real_t > ( const Vector3< real_t > & ) >  FlowRateVelocitySolution_T;
+typedef std::function< real_t () >  FlowRateSolution_T;
+typedef std::function< Vector3< real_t > ( const Vector3< real_t > & ) >  FlowRateVelocitySolution_T;
 
 const std::string     volumetricFlowRateEvaluationFilename("flowrate.dat");
 const real_t          volumetricFlowRateEvaluationNormalization( real_t(1) );
@@ -205,7 +205,7 @@ public:
 
    real_t solution() const
    {
-      if( solution_.empty() )
+      if( !solution_ )
          return real_t(0);
 
       auto blocks = blocks_.lock();
@@ -305,7 +305,7 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
       if( axis_[0] )
       {
          const auto factor = normalizationFactor_ * normalizedDy * normalizedDz;
-         if( velocitySolution_.empty() )
+         if( !velocitySolution_ )
          {
             WALBERLA_FOR_ALL_CELLS_XYZ_OMP( field, omp parallel for schedule(static) reduction(+:_flowRate),
 
@@ -338,7 +338,7 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
       else if( axis_[1] )
       {
          const auto factor = normalizationFactor_ * normalizedDx * normalizedDz;
-         if( velocitySolution_.empty() )
+         if( !velocitySolution_ )
          {
             WALBERLA_FOR_ALL_CELLS_XYZ_OMP( field, omp parallel for schedule(static) reduction(+:_flowRate),
 
@@ -371,7 +371,7 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
       else
       {
          const auto factor = normalizationFactor_ * normalizedDx * normalizedDy;
-         if( velocitySolution_.empty() )
+         if( !velocitySolution_ )
          {
             WALBERLA_FOR_ALL_CELLS_XYZ_OMP( field, omp parallel for schedule(static) reduction(+:_flowRate),
 
@@ -420,16 +420,16 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
          file << "# volumetric flow rate evaluation of data '" << id <<  "'\n"
               << "# step [1], flow rate (simulation) [2], flow rate (\"discrete\" solution) [3], flow rate (exact solution) [4]"
                  ", rel. error (base = \"discrete\" solution) [5], rel. error (base = exact solution) [6]" << std::endl;
-         if( velocitySolution_.empty() )
+         if( !velocitySolution_ )
             file << "ATTENTION: \"discrete\" solution values not available and thus not valid!" << std::endl;
-         if( solution_.empty() )
+         if( !solution_ )
             file << "ATTENTION: exact solution values not available and thus not valid!" << std::endl;
          file.close();
       }
 
       if( log )
       {
-         if( !velocitySolution_.empty() && !solution_.empty() )
+         if( velocitySolution_ && solution_ )
          {
             WALBERLA_LOG_INFO( "Evaluation of the volumetric flow rate [data = '" << id << "']:" <<
                                "\n- exact solution:      " << _solution <<
@@ -439,18 +439,18 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
                                "\n   + " << ( std::abs( ( flowRate_ - velocitySolutionFlowRate_ ) / velocitySolutionFlowRate_ ) ) << " (base = \"discrete\" solution)" <<
                                "\n   + " << ( std::abs( ( flowRate_ - _solution ) / _solution ) ) << " (base = exact solution)" );
          }
-         else if( !velocitySolution_.empty() )
+         else if( velocitySolution_ )
          {
-            WALBERLA_ASSERT( solution_.empty() );
+            WALBERLA_ASSERT( !solution_ );
             WALBERLA_LOG_INFO( "Evaluation of the volumetric flow rate [data = '" << id << "']:" <<
                                "\n- \"discrete\" solution: " <<  velocitySolutionFlowRate_ << " (using reference velocities evaluated at cell centers)" <<
                                "\n- simulation:          " <<  flowRate_ <<  " (using computed velocities evaluated at cell centers)" <<
                                "\n- rel. error (of the simulation): " << ( std::abs( flowRate_ - velocitySolutionFlowRate_ ) / velocitySolutionFlowRate_ ) );
 
          }
-         else if( !solution_.empty() )
+         else if( solution_ )
          {
-            WALBERLA_ASSERT( velocitySolution_.empty() );
+            WALBERLA_ASSERT( !velocitySolution_ );
             WALBERLA_LOG_INFO( "Evaluation of the volumetric flow rate [data = '" << id << "']:" <<
                                "\n- exact solution: " << _solution <<
                                "\n- simulation:     " <<  flowRate_ <<
@@ -459,7 +459,7 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
          }
          else
          {
-            WALBERLA_ASSERT( solution_.empty() && velocitySolution_.empty() );
+            WALBERLA_ASSERT( !solution_ && !velocitySolution_ );
             WALBERLA_LOG_INFO( "Evaluation of the volumetric flow rate [data = '" << id << "']: " << flowRate_ );
          }
       }
@@ -467,7 +467,7 @@ void VolumetricFlowRateEvaluation< VelocityField_T, Filter_T >::operator()()
       if( plot )
       {
          std::ofstream file( filename_.c_str(), std::ofstream::out | std::ofstream::app );
-         file << ( executionCounter_ - uint_t(1) ) << " " << flowRate_ << " " << velocitySolutionFlowRate_ << " " << solution_ << " "
+         file << ( executionCounter_ - uint_t(1) ) << " " << flowRate_ << " " << velocitySolutionFlowRate_ << " " << _solution << " "
               << ( isIdentical( velocitySolutionFlowRate_, real_t(0) ) ? real_t(0) : std::abs( ( flowRate_ - velocitySolutionFlowRate_ ) / velocitySolutionFlowRate_ ) ) << " "
               << ( isIdentical( _solution, real_t(0) ) ? real_t(0) : std::abs( ( flowRate_ - _solution ) / _solution ) ) << std::endl;
          file.close();
diff --git a/src/field/blockforest/BlockDataHandling.h b/src/field/blockforest/BlockDataHandling.h
index 3e73314c6..3d6d92a62 100644
--- a/src/field/blockforest/BlockDataHandling.h
+++ b/src/field/blockforest/BlockDataHandling.h
@@ -40,7 +40,7 @@ class BlockDataHandling : public blockforest::BlockDataHandling< Field_T >
 public:
 
    typedef typename Field_T::value_type Value_T;
-   typedef boost::function< void ( Field_T * field, IBlock * const block ) > InitializationFunction_T;
+   typedef std::function< void ( Field_T * field, IBlock * const block ) > InitializationFunction_T;
 
    virtual ~BlockDataHandling() {}
 
@@ -395,18 +395,18 @@ public:
    typedef typename GhostLayerField_T::value_type Value_T;
 
    DefaultBlockDataHandling( const weak_ptr< StructuredBlockStorage > & blocks,
-                             const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
+                             const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
       blocks_( blocks ), nrOfGhostLayers_( uint_t(1) ), initValue_(), layout_( zyxf ), calculateSize_( calculateSize )
    {}
 
    DefaultBlockDataHandling( const weak_ptr< StructuredBlockStorage > & blocks, const uint_t nrOfGhostLayers,
-                             const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
+                             const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
       blocks_( blocks ), nrOfGhostLayers_( nrOfGhostLayers ), initValue_(), layout_( zyxf ), calculateSize_( calculateSize )
    {}
 
    DefaultBlockDataHandling( const weak_ptr< StructuredBlockStorage > & blocks, const uint_t nrOfGhostLayers,
                              const Value_T & initValue, const Layout layout = zyxf,
-                             const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
+                             const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
       blocks_( blocks ), nrOfGhostLayers_( nrOfGhostLayers ), initValue_( initValue ), layout_( layout ), calculateSize_( calculateSize )
    {
       static_assert( !boost::is_same< GhostLayerField_T, FlagField< Value_T > >::value,
@@ -440,7 +440,7 @@ private:
    uint_t  nrOfGhostLayers_;
    Value_T initValue_;
    Layout  layout_;
-   const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize_;
+   const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize_;
 
 }; // class DefaultBlockDataHandling
 
@@ -455,21 +455,21 @@ class AlwaysInitializeBlockDataHandling : public blockforest::AlwaysInitializeBl
 public:
 
    typedef typename GhostLayerField_T::value_type Value_T;
-   typedef boost::function< void ( GhostLayerField_T * field, IBlock * const block ) > InitializationFunction_T;
+   typedef std::function< void ( GhostLayerField_T * field, IBlock * const block ) > InitializationFunction_T;
 
    AlwaysInitializeBlockDataHandling( const weak_ptr< StructuredBlockStorage > & blocks,
-                                      const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
+                                      const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
       blocks_( blocks ), nrOfGhostLayers_( uint_t(1) ), initValue_(), layout_( zyxf ), calculateSize_( calculateSize )
    {}
 
    AlwaysInitializeBlockDataHandling( const weak_ptr< StructuredBlockStorage > & blocks, const uint_t nrOfGhostLayers,
-                                      const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
+                                      const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
       blocks_( blocks ), nrOfGhostLayers_( nrOfGhostLayers ), initValue_(), layout_( zyxf ), calculateSize_( calculateSize )
    {}
 
    AlwaysInitializeBlockDataHandling( const weak_ptr< StructuredBlockStorage > & blocks, const uint_t nrOfGhostLayers,
                                       const Value_T & initValue, const Layout layout,
-                                      const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
+                                      const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize = internal::defaultSize ) :
       blocks_( blocks ), nrOfGhostLayers_( nrOfGhostLayers ), initValue_( initValue ), layout_( layout ), calculateSize_( calculateSize )
    {
       static_assert( !boost::is_same< GhostLayerField_T, FlagField< Value_T > >::value,
@@ -498,7 +498,7 @@ private:
    uint_t  nrOfGhostLayers_;
    Value_T initValue_;
    Layout  layout_;
-   const boost::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize_;
+   const std::function< Vector3< uint_t > ( const shared_ptr< StructuredBlockStorage > &, IBlock * const ) > calculateSize_;
 
    InitializationFunction_T initFunction_;
 
diff --git a/src/field/python/GatherExport.impl.h b/src/field/python/GatherExport.impl.h
index d297d8a63..42f66565c 100644
--- a/src/field/python/GatherExport.impl.h
+++ b/src/field/python/GatherExport.impl.h
@@ -76,7 +76,7 @@ namespace internal {
       IBlock * firstBlock =  & ( * blocks->begin() );
       python_coupling::Dispatcher<FieldTypes, Exporter_gatherToObject > dispatcher( firstBlock );
       auto func = dispatcher( fieldID );
-      if ( func.empty() )
+      if ( !func )
       {
          PyErr_SetString( PyExc_RuntimeError, "This function cannot handle this type of block data.");
          throw error_already_set();
diff --git a/src/gather/CurveGatherPackInfo.h b/src/gather/CurveGatherPackInfo.h
index ff545e15f..f23b18ae6 100644
--- a/src/gather/CurveGatherPackInfo.h
+++ b/src/gather/CurveGatherPackInfo.h
@@ -28,7 +28,7 @@
 #include "domain_decomposition/StructuredBlockStorage.h"
 #include "field/interpolators/TrilinearInterpolatorFwd.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <functional>
 #include <map>
 #include <vector>
@@ -52,7 +52,7 @@ class CurveGatherPackInfo : public GatherPackInfo
 {
    public:
       typedef Vector3<real_t>  RealVec3;
-      typedef boost::function<RealVec3 (real_t t) > CurveCallback;
+      typedef std::function<RealVec3 (real_t t) > CurveCallback;
 
 
       //**Construction & Destruction*************************************************************************
diff --git a/src/gui/Gui.h b/src/gui/Gui.h
index f2b520d76..b66ddc3be 100644
--- a/src/gui/Gui.h
+++ b/src/gui/Gui.h
@@ -25,7 +25,7 @@
 #include "blockforest/StructuredBlockForest.h"
 #include "timeloop/ITimeloop.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <vector>
 
 
@@ -52,7 +52,7 @@ namespace gui {
 
       void registerPropertyTree( const shared_ptr<PropertyTree> propertyTree );
 
-      typedef boost::function< DisplayAdaptor * ( const IBlock &, ConstBlockDataID ) > DisplayAdaptorCreatorFunc;
+      typedef std::function< DisplayAdaptor * ( const IBlock &, ConstBlockDataID ) > DisplayAdaptorCreatorFunc;
       void registerDisplayAdaptorCreator( const DisplayAdaptorCreatorFunc & creatorFunc );
 
       static void breakpoint( const std::string & comment, const std::string & file, int line );
diff --git a/src/lbm/python/ExportBasic.impl.h b/src/lbm/python/ExportBasic.impl.h
index 4727cb5f3..afae7a5a1 100644
--- a/src/lbm/python/ExportBasic.impl.h
+++ b/src/lbm/python/ExportBasic.impl.h
@@ -388,7 +388,7 @@ namespace internal
         SweepWrapper()
         {}
 
-        SweepWrapper( const boost::function<void(IBlock*) > & sweepToWrap )
+        SweepWrapper( const std::function<void(IBlock*) > & sweepToWrap )
                 : sweepToWrap_( sweepToWrap ) {}
 
         void operator() ( IBlock * block )
@@ -397,7 +397,7 @@ namespace internal
               sweepToWrap_( block );
         }
     protected:
-        boost::function<void(IBlock*) > sweepToWrap_;
+        std::function<void(IBlock*) > sweepToWrap_;
     };
 
 
diff --git a/src/lbm/refinement/BoundarySetup.h b/src/lbm/refinement/BoundarySetup.h
index 07b963f0d..4271b9984 100644
--- a/src/lbm/refinement/BoundarySetup.h
+++ b/src/lbm/refinement/BoundarySetup.h
@@ -74,16 +74,16 @@ inline shared_ptr< BoundaryConfiguration > defaultBoundaryConfiguration( const C
 //**********************************************************************************************************************
 template< typename BoundaryHandling_T, bool ForceBoundary >
 void consistentlySetBoundary( StructuredBlockStorage & blocks, Block & block, const BlockDataID & boundaryHandlingId, const FlagUID & flag,
-                              const boost::function< bool ( const Vector3< real_t > & ) > & isBoundary,
-                              const boost::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter = internal::defaultBoundaryConfiguration );
+                              const std::function< bool ( const Vector3< real_t > & ) > & isBoundary,
+                              const std::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter = internal::defaultBoundaryConfiguration );
 
 
 
 /// For documentation see function "template< typename BoundaryHandling_T, bool ForceBoundary > void consistentlySetBoundary(...)"
 template< typename BoundaryHandling_T >
 void consistentlySetBoundary( StructuredBlockStorage & blocks, Block & block, const BlockDataID & boundaryHandlingId, const FlagUID & flag,
-                              const boost::function< bool ( const Vector3< real_t > & ) > & isBoundary,
-                              const boost::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter = internal::defaultBoundaryConfiguration )
+                              const std::function< bool ( const Vector3< real_t > & ) > & isBoundary,
+                              const std::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter = internal::defaultBoundaryConfiguration )
 {
    consistentlySetBoundary< BoundaryHandling_T, false >( blocks, block, boundaryHandlingId, flag, isBoundary, parameter );
 }
@@ -93,8 +93,8 @@ void consistentlySetBoundary( StructuredBlockStorage & blocks, Block & block, co
 /// For documentation see function "template< typename BoundaryHandling_T, bool ForceBoundary > void consistentlySetBoundary(...)"
 template< typename BoundaryHandling_T >
 void consistentlyForceBoundary( StructuredBlockStorage & blocks, Block & block, const BlockDataID & boundaryHandlingId, const FlagUID & flag,
-                                const boost::function< bool ( const Vector3< real_t > & ) > & isBoundary,
-                                const boost::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter = internal::defaultBoundaryConfiguration )
+                                const std::function< bool ( const Vector3< real_t > & ) > & isBoundary,
+                                const std::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter = internal::defaultBoundaryConfiguration )
 {
    consistentlySetBoundary< BoundaryHandling_T, true >( blocks, block, boundaryHandlingId, flag, isBoundary, parameter );
 }
@@ -103,8 +103,8 @@ void consistentlyForceBoundary( StructuredBlockStorage & blocks, Block & block,
 
 template< typename BoundaryHandling_T, bool ForceBoundary >
 void consistentlySetBoundary( StructuredBlockStorage & blocks, Block & block, const BlockDataID & boundaryHandlingId, const FlagUID & flag,
-                              const boost::function< bool ( const Vector3< real_t > & ) > & isBoundary,
-                              const boost::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter )
+                              const std::function< bool ( const Vector3< real_t > & ) > & isBoundary,
+                              const std::function< shared_ptr< BoundaryConfiguration > ( const Cell &, const Vector3< real_t > & ) > & parameter )
 {
    const uint_t level = blocks.getLevel(block);
 
diff --git a/src/lbm/refinement/RefinementFunctorWrapper.h b/src/lbm/refinement/RefinementFunctorWrapper.h
index 922618574..9ea0b99e1 100644
--- a/src/lbm/refinement/RefinementFunctorWrapper.h
+++ b/src/lbm/refinement/RefinementFunctorWrapper.h
@@ -23,7 +23,7 @@
 
 #include "domain_decomposition/BlockStorage.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace lbm {
@@ -31,7 +31,7 @@ namespace refinement {
 
 class FunctorWrapper {
 public:
-   FunctorWrapper( const boost::function<void()> & fct)
+   FunctorWrapper( const std::function<void()> & fct)
          : fct_(fct) {
    }
 
@@ -40,12 +40,12 @@ public:
    }
 
 private:
-   boost::function<void(void)> fct_;
+   std::function<void(void)> fct_;
 };
 
 class SweepAsFunctorWrapper {
 public:
-   SweepAsFunctorWrapper( const boost::function<void(IBlock * )> & fct,
+   SweepAsFunctorWrapper( const std::function<void(IBlock * )> & fct,
                           const shared_ptr <StructuredBlockStorage> & blockStorage )
          : fct_(fct), blockStorage_(blockStorage) {
    }
@@ -58,7 +58,7 @@ public:
    }
 
 private:
-   boost::function<void(IBlock * )> fct_;
+   std::function<void(IBlock * )> fct_;
    shared_ptr <StructuredBlockStorage> blockStorage_;
 };
 
diff --git a/src/lbm/refinement/TimeStep.h b/src/lbm/refinement/TimeStep.h
index f006d0494..1be6a470d 100644
--- a/src/lbm/refinement/TimeStep.h
+++ b/src/lbm/refinement/TimeStep.h
@@ -55,8 +55,8 @@ public:
    
    typedef typename NeighborsStencil<LatticeModel_T>::type CommunicationStencil_T;
 
-   typedef boost::function< void ( const uint_t, const uint_t ) >            VoidFunction;  // parameters: level, execution count
-   typedef boost::function< void ( IBlock *, const uint_t, const uint_t ) >  BlockFunction; // parameters: block, level, execution count
+   typedef std::function< void ( const uint_t, const uint_t ) >            VoidFunction;  // parameters: level, execution count
+   typedef std::function< void ( IBlock *, const uint_t, const uint_t ) >  BlockFunction; // parameters: block, level, execution count
    
 private:
 
diff --git a/src/mesh/boundary/BoundarySetup.h b/src/mesh/boundary/BoundarySetup.h
index 26254df4e..08840ed0a 100644
--- a/src/mesh/boundary/BoundarySetup.h
+++ b/src/mesh/boundary/BoundarySetup.h
@@ -34,7 +34,7 @@
 
 #include "stencil/D3Q27.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <queue>
 
@@ -46,7 +46,7 @@ class BoundarySetup
 public:
    typedef field::GhostLayerField< uint8_t, uint_t(1) > VoxelizationField;
 
-   typedef boost::function< real_t ( const Vector3< real_t > &) > DistanceFunction;
+   typedef std::function< real_t ( const Vector3< real_t > &) > DistanceFunction;
 
    enum Location { INSIDE, OUTSIDE };
 
diff --git a/src/mesh/vtk/VTKMeshWriter.h b/src/mesh/vtk/VTKMeshWriter.h
index f01a65beb..025779e4f 100644
--- a/src/mesh/vtk/VTKMeshWriter.h
+++ b/src/mesh/vtk/VTKMeshWriter.h
@@ -42,7 +42,7 @@ namespace mesh {
 template< typename MeshType >
 class VTKMeshWriter {
 public:
-   typedef boost::function<bool ( const MeshType &, const typename MeshType::FaceHandle & )> FaceFilterFunction;
+   typedef std::function<bool ( const MeshType &, const typename MeshType::FaceHandle & )> FaceFilterFunction;
 
    typedef std::vector< typename MeshType::FaceHandle >   Faces;
    typedef std::vector< typename MeshType::VertexHandle > Vertices;
@@ -98,7 +98,7 @@ public:
 
    inline void setFaceFilter  ( const FaceFilterFunction & f ) { faceFilter_ = f;                    }
    inline void clearFaceFilter()                               { faceFilter_ = FaceFilterFunction(); }
-   inline bool isFaceFilterSet()                         const { return !faceFilter_.empty();        }
+   inline bool isFaceFilterSet()                         const { return static_cast<bool>(faceFilter_);        }
 
    void incrementTimeStep()      { ++timestep_; }
    bool isWriteScheduled() const { return timestep_ % writeFrequency_ == 0; }
diff --git a/src/pde/iterations/CGFixedStencilIteration.h b/src/pde/iterations/CGFixedStencilIteration.h
index b7c5ac85f..145fa37c8 100644
--- a/src/pde/iterations/CGFixedStencilIteration.h
+++ b/src/pde/iterations/CGFixedStencilIteration.h
@@ -31,7 +31,7 @@
 #include "field/GhostLayerField.h"
 #include "field/iterators/IteratorMacros.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 
 
@@ -50,7 +50,7 @@ public:
    CGFixedStencilIteration( BlockStorage & blocks,
                             const BlockDataID & uId, const BlockDataID & rId, const BlockDataID & dId, const BlockDataID & zId,
                             const BlockDataID & fId, const std::vector< real_t > & weights,
-                            const uint_t iterations, const boost::function< void () > & synchronizeD,
+                            const uint_t iterations, const std::function< void () > & synchronizeD,
                             const real_t residualNormThreshold = real_t(0),
                             const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
                             const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
@@ -88,7 +88,7 @@ protected:
    uint_t iterations_;
    real_t residualNormThreshold_;
    
-   boost::function< void () > synchronizeD_;
+   std::function< void () > synchronizeD_;
    
    Set<SUID> requiredSelectors_;
    Set<SUID> incompatibleSelectors_;
@@ -100,7 +100,7 @@ template< typename Stencil_T >
 CGFixedStencilIteration< Stencil_T >::CGFixedStencilIteration( BlockStorage & blocks,
                                                               const BlockDataID & uId, const BlockDataID & rId, const BlockDataID & dId, const BlockDataID & zId,
                                                               const BlockDataID & fId, const std::vector< real_t > & weights,
-                                                              const uint_t iterations, const boost::function< void () > & synchronizeD,
+                                                              const uint_t iterations, const std::function< void () > & synchronizeD,
                                                               const real_t residualNormThreshold,
                                                               const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors ) :
    blocks_( blocks ), uId_( uId ), rId_( rId ), dId_( dId ), zId_( zId ), fId_( fId ),
diff --git a/src/pde/iterations/CGIteration.h b/src/pde/iterations/CGIteration.h
index 2a0afaf23..d3339759b 100644
--- a/src/pde/iterations/CGIteration.h
+++ b/src/pde/iterations/CGIteration.h
@@ -31,7 +31,7 @@
 #include "field/GhostLayerField.h"
 #include "field/iterators/IteratorMacros.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 
 
@@ -51,7 +51,7 @@ public:
    CGIteration( BlockStorage & blocks,
                             const BlockDataID & uId, const BlockDataID & rId, const BlockDataID & dId, const BlockDataID & zId,
                             const BlockDataID & fId, const BlockDataID & stencilId,
-                            const uint_t iterations, const boost::function< void () > & synchronizeD,
+                            const uint_t iterations, const std::function< void () > & synchronizeD,
                             const real_t residualNormThreshold = real_t(0),
                             const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
                             const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
@@ -88,7 +88,7 @@ protected:
    uint_t iterations_;
    real_t residualNormThreshold_;
    
-   boost::function< void () > synchronizeD_;
+   std::function< void () > synchronizeD_;
    
    Set<SUID> requiredSelectors_;
    Set<SUID> incompatibleSelectors_;
@@ -100,7 +100,7 @@ template< typename Stencil_T >
 CGIteration< Stencil_T >::CGIteration( BlockStorage & blocks,
                                                               const BlockDataID & uId, const BlockDataID & rId, const BlockDataID & dId, const BlockDataID & zId,
                                                               const BlockDataID & fId, const BlockDataID & stencilId,
-                                                              const uint_t iterations, const boost::function< void () > & synchronizeD,
+                                                              const uint_t iterations, const std::function< void () > & synchronizeD,
                                                               const real_t residualNormThreshold,
                                                               const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors ) :
    blocks_( blocks ), uId_( uId ), rId_( rId ), dId_( dId ), zId_( zId ), fId_( fId ), stencilId_( stencilId ), 
diff --git a/src/pde/iterations/JacobiIteration.cpp b/src/pde/iterations/JacobiIteration.cpp
index f3044457e..f088ebe31 100644
--- a/src/pde/iterations/JacobiIteration.cpp
+++ b/src/pde/iterations/JacobiIteration.cpp
@@ -37,7 +37,7 @@ void JacobiIteration::operator()()
    uint_t i( uint_t(0) );
    while( i < iterations_ )
    {
-      if( !boundary_.empty() )
+      if( boundary_ )
          boundary_();
       communication_();
 
@@ -48,7 +48,7 @@ void JacobiIteration::operator()()
       {
          if( (i % residualCheckFrequency_) == uint_t(0) )
          {
-            if( !boundary_.empty() )
+            if( boundary_ )
                boundary_();
             const real_t residualNorm = residualNorm_();
             WALBERLA_CHECK( math::finite(residualNorm), "Non-finite residual norm detected during the Jacobi iteration, "
diff --git a/src/pde/iterations/JacobiIteration.h b/src/pde/iterations/JacobiIteration.h
index 3f30bcd85..3002e7ff3 100644
--- a/src/pde/iterations/JacobiIteration.h
+++ b/src/pde/iterations/JacobiIteration.h
@@ -25,7 +25,7 @@
 #include "core/uid/SUID.h"
 #include "domain_decomposition/BlockStorage.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 
 
@@ -39,9 +39,9 @@ class JacobiIteration
 public:
 
    JacobiIteration( BlockStorage & blocks, const uint_t iterations,
-                    const boost::function< void () > & communication,
-                    const boost::function< void ( IBlock * ) > & jacobi,
-                    const boost::function< real_t () > & residualNorm,
+                    const std::function< void () > & communication,
+                    const std::function< void ( IBlock * ) > & jacobi,
+                    const std::function< real_t () > & residualNorm,
                     const real_t residualNormThreshold = real_t(0), const uint_t residualCheckFrequency = uint_t(1),
                     const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
                     const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() ) :
@@ -51,7 +51,7 @@ public:
       requiredSelectors_( requiredSelectors ), incompatibleSelectors_( incompatibleSelectors )
    {}
       
-   void addBoundaryHandling( const boost::function< void () > & boundary ) { boundary_ = boundary; }
+   void addBoundaryHandling( const std::function< void () > & boundary ) { boundary_ = boundary; }
 
    void operator()();
    
@@ -63,10 +63,10 @@ protected:
    real_t residualNormThreshold_;
    uint_t residualCheckFrequency_;
    
-   boost::function< void () >            boundary_;
-   boost::function< void () >            communication_;
-   boost::function< void ( IBlock * ) >  jacobi_;
-   boost::function< real_t () >          residualNorm_;
+   std::function< void () >            boundary_;
+   std::function< void () >            communication_;
+   std::function< void ( IBlock * ) >  jacobi_;
+   std::function< real_t () >          residualNorm_;
    
    Set<SUID> requiredSelectors_;
    Set<SUID> incompatibleSelectors_;
diff --git a/src/pde/iterations/RBGSIteration.cpp b/src/pde/iterations/RBGSIteration.cpp
index 7994b6331..18c503db7 100644
--- a/src/pde/iterations/RBGSIteration.cpp
+++ b/src/pde/iterations/RBGSIteration.cpp
@@ -40,14 +40,14 @@ void RBGSIteration::operator()()
    uint_t i( uint_t(0) );
    while( i < iterations_ )
    {
-      if( !boundary_.empty() )
+      if( boundary_ )
          boundary_();
       communication_();
 
       for( auto block = blocks_.begin( requiredSelectors_, incompatibleSelectors_ ); block != blocks_.end(); ++block )
          redUpdate_( block.get() );
 
-      if( !boundary_.empty() )
+      if( boundary_ )
          boundary_();
       communication_();
 
@@ -58,7 +58,7 @@ void RBGSIteration::operator()()
       {
          if( (i % residualCheckFrequency_) == uint_t(0) )
          {
-            if( !boundary_.empty() )
+            if( boundary_ )
                boundary_();
             const real_t residualNorm = residualNorm_();
             WALBERLA_CHECK( math::finite(residualNorm), "Non-finite residual norm detected during the red-black Gauss-Seidel iteration, "
diff --git a/src/pde/iterations/RBGSIteration.h b/src/pde/iterations/RBGSIteration.h
index aaae71891..9f4ee04e7 100644
--- a/src/pde/iterations/RBGSIteration.h
+++ b/src/pde/iterations/RBGSIteration.h
@@ -25,7 +25,7 @@
 #include "core/uid/SUID.h"
 #include "domain_decomposition/BlockStorage.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 
 
@@ -39,10 +39,10 @@ class RBGSIteration
 public:
 
    RBGSIteration( BlockStorage & blocks, const uint_t iterations,
-                  const boost::function< void () > & communication,
-                  const boost::function< void ( IBlock * ) > & redUpdate,
-                  const boost::function< void ( IBlock * ) > & blackUpdate,
-                  const boost::function< real_t () > & residualNorm,
+                  const std::function< void () > & communication,
+                  const std::function< void ( IBlock * ) > & redUpdate,
+                  const std::function< void ( IBlock * ) > & blackUpdate,
+                  const std::function< real_t () > & residualNorm,
                   const real_t residualNormThreshold = real_t(0), const uint_t residualCheckFrequency = uint_t(1),
                   const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
                   const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() ) :
@@ -53,7 +53,7 @@ public:
       requiredSelectors_( requiredSelectors ), incompatibleSelectors_( incompatibleSelectors )
    {}
 
-   void addBoundaryHandling( const boost::function< void () > & boundary ) { boundary_ = boundary; }
+   void addBoundaryHandling( const std::function< void () > & boundary ) { boundary_ = boundary; }
       
    void operator()();
    
@@ -71,11 +71,11 @@ protected:
    uint_t iterationsPerformed_;
    bool thresholdReached_;
 
-   boost::function< void () >            boundary_;
-   boost::function< void () >            communication_;
-   boost::function< void ( IBlock * ) >  redUpdate_;
-   boost::function< void ( IBlock * ) >  blackUpdate_;
-   boost::function< real_t () >          residualNorm_;
+   std::function< void () >            boundary_;
+   std::function< void () >            communication_;
+   std::function< void ( IBlock * ) >  redUpdate_;
+   std::function< void ( IBlock * ) >  blackUpdate_;
+   std::function< real_t () >          residualNorm_;
    
    Set<SUID> requiredSelectors_;
    Set<SUID> incompatibleSelectors_;
diff --git a/src/pde/iterations/VCycles.h b/src/pde/iterations/VCycles.h
index 161af6711..eca2b908f 100644
--- a/src/pde/iterations/VCycles.h
+++ b/src/pde/iterations/VCycles.h
@@ -33,7 +33,7 @@
 #include "pde/sweeps/RBGSFixedStencil.h"
 #include "pde/sweeps/RBGS.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <vector>
 
@@ -54,7 +54,7 @@ public:
             const Weight_T weights,
             const uint_t iterations, const uint_t numLvl,
             const uint_t preSmoothingIters, const uint_t postSmoothingIters,
-            const uint_t coarseIters, const boost::function< real_t () > & residualNorm,
+            const uint_t coarseIters, const std::function< real_t () > & residualNorm,
             const real_t residualNormThreshold = real_t(0), const uint_t residualCheckFrequency = uint_t(1),
             const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
             const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
@@ -63,7 +63,7 @@ public:
             const BlockDataID & stencilFieldId,
             const uint_t iterations, const uint_t numLvl,
             const uint_t preSmoothingIters, const uint_t postSmoothingIters,
-            const uint_t coarseIters, const boost::function< real_t () > & residualNorm,
+            const uint_t coarseIters, const std::function< real_t () > & residualNorm,
             const real_t residualNormThreshold = real_t(0), const uint_t residualCheckFrequency = uint_t(1),
             const Set<SUID> & requiredSelectors     = Set<SUID>::emptySet(),
             const Set<SUID> & incompatibleSelectors = Set<SUID>::emptySet() );
@@ -94,7 +94,7 @@ protected:
    uint_t iterationsPerformed_;
    bool thresholdReached_;
 
-   boost::function< real_t() > residualNorm_;
+   std::function< real_t() > residualNorm_;
    std::vector<real_t> convergenceRate_;
 
    std::vector<BlockDataID> uId_;
@@ -105,9 +105,9 @@ protected:
 
    std::vector< shared_ptr<pde::RBGSFixedStencil< Stencil_T > > > RBGSFixedSweeps_;
    std::vector< shared_ptr<pde::RBGS< Stencil_T > > >             RBGSSweeps_;
-   std::vector< boost::function< void() > > RBGSIteration_;
-   boost::function< void() > CGIteration_;
-   std::vector<boost::function< void(IBlock *) > > computeResidual_, restrict_, zeroize_, prolongateAndCorrect_;
+   std::vector< std::function< void() > > RBGSIteration_;
+   std::function< void() > CGIteration_;
+   std::vector<std::function< void(IBlock *) > > computeResidual_, restrict_, zeroize_, prolongateAndCorrect_;
 
    std::vector< blockforest::communication::UniformBufferedScheme< Stencil_T > > communication_;
 
diff --git a/src/pde/iterations/VCycles.impl.h b/src/pde/iterations/VCycles.impl.h
index 8ad0833d4..a35cf3577 100644
--- a/src/pde/iterations/VCycles.impl.h
+++ b/src/pde/iterations/VCycles.impl.h
@@ -44,7 +44,7 @@ VCycles< Stencil_T >::VCycles( shared_ptr< StructuredBlockForest > blocks, const
         const Weight_T weights,
         const uint_t iterations, const uint_t numLvl,
         const uint_t preSmoothingIters, const uint_t postSmoothingIters,
-        const uint_t coarseIters, const boost::function< real_t () > & residualNorm,
+        const uint_t coarseIters, const std::function< real_t () > & residualNorm,
         const real_t residualNormThreshold, const uint_t residualCheckFrequency,
         const Set<SUID> & requiredSelectors,
         const Set<SUID> & incompatibleSelectors ) :
@@ -150,7 +150,7 @@ VCycles< Stencil_T >::VCycles( shared_ptr< StructuredBlockForest > blocks, const
         const BlockDataID & stencilFieldId,
         const uint_t iterations, const uint_t numLvl,
         const uint_t preSmoothingIters, const uint_t postSmoothingIters,
-        const uint_t coarseIters, const boost::function< real_t () > & residualNorm,
+        const uint_t coarseIters, const std::function< real_t () > & residualNorm,
         const real_t residualNormThreshold, const uint_t residualCheckFrequency,
         const Set<SUID> & requiredSelectors,
         const Set<SUID> & incompatibleSelectors ) :
diff --git a/src/pde/sweeps/RBGS.h b/src/pde/sweeps/RBGS.h
index 98f984919..1f3404341 100644
--- a/src/pde/sweeps/RBGS.h
+++ b/src/pde/sweeps/RBGS.h
@@ -51,12 +51,12 @@ public:
 
    void update( IBlock * const block, const bool rb );
    
-   boost::function< void ( IBlock * const ) > getRedSweep()
+   std::function< void ( IBlock * const ) > getRedSweep()
    {
       return boost::bind( &RBGS::update, this, _1, true );
    }
 
-   boost::function< void ( IBlock * const ) > getBlackSweep()
+   std::function< void ( IBlock * const ) > getBlackSweep()
    {
       return boost::bind( &RBGS::update, this, _1, false );
    }
diff --git a/src/pde/sweeps/RBGSFixedStencil.h b/src/pde/sweeps/RBGSFixedStencil.h
index cd4715fda..76df00055 100644
--- a/src/pde/sweeps/RBGSFixedStencil.h
+++ b/src/pde/sweeps/RBGSFixedStencil.h
@@ -50,12 +50,12 @@ public:
 
    void update( IBlock * const block, const bool rb );
    
-   boost::function< void ( IBlock * const ) > getRedSweep()
+   std::function< void ( IBlock * const ) > getRedSweep()
    {
       return boost::bind( &RBGSFixedStencil::update, this, _1, true );
    }
 
-   boost::function< void ( IBlock * const ) > getBlackSweep()
+   std::function< void ( IBlock * const ) > getBlackSweep()
    {
       return boost::bind( &RBGSFixedStencil::update, this, _1, false );
    }
diff --git a/src/pde/sweeps/SOR.h b/src/pde/sweeps/SOR.h
index 9ce89069c..90be98268 100644
--- a/src/pde/sweeps/SOR.h
+++ b/src/pde/sweeps/SOR.h
@@ -51,12 +51,12 @@ public:
 
    void update( IBlock * const block, const bool rb );
 
-   boost::function< void ( IBlock * const ) > getRedSweep()
+   std::function< void ( IBlock * const ) > getRedSweep()
    {
       return boost::bind( &SOR::update, this, _1, true );
    }
 
-   boost::function< void ( IBlock * const ) > getBlackSweep()
+   std::function< void ( IBlock * const ) > getBlackSweep()
    {
       return boost::bind( &SOR::update, this, _1, false );
    }
diff --git a/src/pde/sweeps/SORFixedStencil.h b/src/pde/sweeps/SORFixedStencil.h
index 2e9a54a91..51535e037 100644
--- a/src/pde/sweeps/SORFixedStencil.h
+++ b/src/pde/sweeps/SORFixedStencil.h
@@ -50,12 +50,12 @@ public:
 
    void update( IBlock * const block, const bool rb );
 
-   boost::function< void ( IBlock * const ) > getRedSweep()
+   std::function< void ( IBlock * const ) > getRedSweep()
    {
       return boost::bind( &SORFixedStencil::update, this, _1, true );
    }
 
-   boost::function< void ( IBlock * const ) > getBlackSweep()
+   std::function< void ( IBlock * const ) > getBlackSweep()
    {
       return boost::bind( &SORFixedStencil::update, this, _1, false );
    }
diff --git a/src/pe/rigidbody/BodyStorage.h b/src/pe/rigidbody/BodyStorage.h
index fb34a5590..6761fea4e 100644
--- a/src/pe/rigidbody/BodyStorage.h
+++ b/src/pe/rigidbody/BodyStorage.h
@@ -37,7 +37,7 @@
 #include <pe/rigidbody/RigidBody.h>
 #include <pe/Types.h>
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe {
@@ -133,11 +133,11 @@ public:
    //**Callbacks************************************************************************
    /*!\name Callbacks */
    //@{
-   inline void          registerAddCallback     ( const std::string name, const boost::function<void (BodyID)>& func );
+   inline void          registerAddCallback     ( const std::string name, const std::function<void (BodyID)>& func );
    inline void          deregisterAddCallback   ( const std::string name );
    inline void          clearAddCallbacks       ( );
 
-   inline void          registerRemoveCallback     ( const std::string name, const boost::function<void (BodyID)>& func );
+   inline void          registerRemoveCallback     ( const std::string name, const std::function<void (BodyID)>& func );
    inline void          deregisterRemoveCallback   ( const std::string name );
    inline void          clearRemoveCallbacks       ( );
    //@}
@@ -150,8 +150,8 @@ private:
    Bodies bodies_;  //!< The rigid bodies contained in the simulation world.
    std::map<id_t, SizeType> bodyIDs_;   //!< The association of system IDs to rigid bodies.
 
-   std::map< std::string, boost::function<void (BodyID)> > addCallbacks_;
-   std::map< std::string, boost::function<void (BodyID)> > removeCallbacks_;
+   std::map< std::string, std::function<void (BodyID)> > addCallbacks_;
+   std::map< std::string, std::function<void (BodyID)> > removeCallbacks_;
    //@}
    //**********************************************************************************************
 };
@@ -713,7 +713,7 @@ inline void BodyStorage::clear()
 }
 //*************************************************************************************************
 
-inline void          BodyStorage::registerAddCallback     ( const std::string name, const boost::function<void (BodyID)>& func )
+inline void          BodyStorage::registerAddCallback     ( const std::string name, const std::function<void (BodyID)>& func )
 {
    WALBERLA_ASSERT_EQUAL(addCallbacks_.find(name), addCallbacks_.end(), "Callback '" << name << "' already exists!");
    addCallbacks_.insert( std::make_pair(name, func) );
@@ -733,7 +733,7 @@ inline void          BodyStorage::clearAddCallbacks       ( )
    addCallbacks_.clear();
 }
 
-inline void          BodyStorage::registerRemoveCallback     ( const std::string name, const boost::function<void (BodyID)>& func )
+inline void          BodyStorage::registerRemoveCallback     ( const std::string name, const std::function<void (BodyID)>& func )
 {
    WALBERLA_ASSERT_EQUAL(removeCallbacks_.find(name), removeCallbacks_.end(), "Callback '" << name << "' already exists!");
    removeCallbacks_.insert( std::make_pair(name, func) );
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/AddedMassForceEvaluator.h b/src/pe_coupling/discrete_particle_methods/evaluators/AddedMassForceEvaluator.h
index 5950cfc3f..a318686d8 100644
--- a/src/pe_coupling/discrete_particle_methods/evaluators/AddedMassForceEvaluator.h
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/AddedMassForceEvaluator.h
@@ -45,7 +45,7 @@
 
 #include "stencil/Directions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe_coupling {
@@ -78,9 +78,9 @@ public:
                             const BlockDataID & forceFieldID, const BlockDataID & bodyStorageID,
                             const BlockDataID & flagFieldID, const Set< FlagUID > & domainFlags,
                             const BlockDataID & velocityTimeDerivativeFieldID,
-                            const boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> & addedMassForceCorrelationFunction,
+                            const std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> & addedMassForceCorrelationFunction,
                             const shared_ptr< BodyVelocityTimeDerivativeEvaluator > & bodyVelocityTimeDerivativeEvaluator,
-                            const boost::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
+                            const std::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), bodyStorageID_( bodyStorageID ),
      addedMassForceCorrelationFunction_( addedMassForceCorrelationFunction ),
      bodyVelocityTimeDerivativeEvaluator_( bodyVelocityTimeDerivativeEvaluator ),
@@ -97,11 +97,11 @@ private:
    shared_ptr<StructuredBlockStorage> blockStorage_;
    const BlockDataID bodyStorageID_;
 
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassForceCorrelationFunction_;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassForceCorrelationFunction_;
 
    shared_ptr< BodyVelocityTimeDerivativeEvaluator > bodyVelocityTimeDerivativeEvaluator_;
 
-   boost::function<bool(pe::BodyID)> dpmBodySelectorFct_;
+   std::function<bool(pe::BodyID)> dpmBodySelectorFct_;
 
    BlockDataID velocityTimeDerivativeFieldInterpolatorID_;
    BlockDataID forceDistributorID_;
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/BodyVelocityTimeDerivativeEvaluator.h b/src/pe_coupling/discrete_particle_methods/evaluators/BodyVelocityTimeDerivativeEvaluator.h
index 95d640640..229be174e 100644
--- a/src/pe_coupling/discrete_particle_methods/evaluators/BodyVelocityTimeDerivativeEvaluator.h
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/BodyVelocityTimeDerivativeEvaluator.h
@@ -27,7 +27,7 @@
 
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <map>
 
 namespace walberla {
@@ -50,7 +50,7 @@ public:
 
    BodyVelocityTimeDerivativeEvaluator( const shared_ptr<StructuredBlockStorage> & blockStorage,
                                         const BlockDataID & bodyStorageID, const real_t & deltaT = real_t(1),
-                                        const boost::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
+                                        const std::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), bodyStorageID_( bodyStorageID ), deltaTinv_( real_t(1) / deltaT ),
      dpmBodySelectorFct_( dpmBodySelectorFct)
      { }
@@ -88,7 +88,7 @@ private:
    const BlockDataID bodyStorageID_;
    std::map< walberla::id_t, Vector3< real_t > > bodyVelocityMap_;
    real_t deltaTinv_;
-   boost::function<bool(pe::BodyID)> dpmBodySelectorFct_;
+   std::function<bool(pe::BodyID)> dpmBodySelectorFct_;
 };
 
 
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/EffectiveViscosityFieldEvaluator.h b/src/pe_coupling/discrete_particle_methods/evaluators/EffectiveViscosityFieldEvaluator.h
index c052b6059..fc10c9b97 100644
--- a/src/pe_coupling/discrete_particle_methods/evaluators/EffectiveViscosityFieldEvaluator.h
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/EffectiveViscosityFieldEvaluator.h
@@ -66,7 +66,7 @@ public:
 
    EffectiveViscosityFieldEvaluator( const BlockDataID & omegaFieldID, const ConstBlockDataID & solidVolumeFractionFieldID,
                                      const real_t & fluidViscosity,
-                                     const boost::function<real_t (real_t, real_t)> & effectiveViscosityFunc )
+                                     const std::function<real_t (real_t, real_t)> & effectiveViscosityFunc )
       : omegaFieldID_( omegaFieldID ), solidVolumeFractionFieldID_( solidVolumeFractionFieldID ), fluidViscosity_( fluidViscosity ),
         effectiveViscosityFunc_( effectiveViscosityFunc )
    {
@@ -97,7 +97,7 @@ private:
    const BlockDataID omegaFieldID_;
    const ConstBlockDataID solidVolumeFractionFieldID_;
    real_t fluidViscosity_;
-   boost::function<real_t (real_t, real_t)> effectiveViscosityFunc_;
+   std::function<real_t (real_t, real_t)> effectiveViscosityFunc_;
 };
 
 
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/InteractionForceEvaluator.h b/src/pe_coupling/discrete_particle_methods/evaluators/InteractionForceEvaluator.h
index d3a6dc098..33a2e7d76 100644
--- a/src/pe_coupling/discrete_particle_methods/evaluators/InteractionForceEvaluator.h
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/InteractionForceEvaluator.h
@@ -45,7 +45,7 @@
 
 #include "stencil/Directions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <vector>
 
@@ -88,9 +88,9 @@ public:
                               const BlockDataID & forceFieldID, const BlockDataID & bodyStorageID,
                               const BlockDataID & flagFieldID, const Set< FlagUID > & domainFlags,
                               const BlockDataID & velocityFieldID, const BlockDataID & solidVolumeFractionFieldID, const BlockDataID & pressureGradientFieldID,
-                              const boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t, real_t )> & dragForceCorrelationFunction,
+                              const std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t, real_t )> & dragForceCorrelationFunction,
                               real_t fluidDynamicViscosity,
-                              const boost::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
+                              const std::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), bodyStorageID_( bodyStorageID ),
      dragForceCorrelationFunction_( dragForceCorrelationFunction ), fluidDynamicViscosity_( fluidDynamicViscosity ),
      dpmBodySelectorFct_( dpmBodySelectorFct)
@@ -109,11 +109,11 @@ private:
    const BlockDataID bodyStorageID_;
    const BlockDataID pdfFieldID_;
 
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t, real_t )> dragForceCorrelationFunction_;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t, real_t )> dragForceCorrelationFunction_;
 
    real_t fluidDynamicViscosity_;
 
-   boost::function<bool(pe::BodyID)> dpmBodySelectorFct_;
+   std::function<bool(pe::BodyID)> dpmBodySelectorFct_;
 
    BlockDataID velocityFieldInterpolatorID_;
    BlockDataID solidVolumeFractionFieldInterpolatorID_;
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/LiftForceEvaluator.h b/src/pe_coupling/discrete_particle_methods/evaluators/LiftForceEvaluator.h
index 97dee854d..d04ca701c 100644
--- a/src/pe_coupling/discrete_particle_methods/evaluators/LiftForceEvaluator.h
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/LiftForceEvaluator.h
@@ -38,7 +38,7 @@
 #include "pe_coupling/geometry/SphereEquivalentDiameter.h"
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <cmath>
 
@@ -72,9 +72,9 @@ public:
    LiftForceEvaluator( const shared_ptr<StructuredBlockStorage> & blockStorage,
                        const BlockDataID & forceFieldID, const BlockDataID & bodyStorageID, const BlockDataID & flagFieldID, const Set< FlagUID > & domainFlags,
                        const BlockDataID & velocityFieldID, const BlockDataID & velocityCurlFieldID,
-                       const boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> & liftForceCorrelationFunction,
+                       const std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> & liftForceCorrelationFunction,
                        real_t fluidDynamicViscosity,
-                       const boost::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
+                       const std::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), bodyStorageID_( bodyStorageID ), liftForceCorrelationFunction_( liftForceCorrelationFunction ),
      fluidDynamicViscosity_( fluidDynamicViscosity ), dpmBodySelectorFct_( dpmBodySelectorFct)
    {
@@ -90,11 +90,11 @@ private:
    shared_ptr<StructuredBlockStorage> blockStorage_;
    BlockDataID bodyStorageID_;
 
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftForceCorrelationFunction_;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftForceCorrelationFunction_;
 
    real_t fluidDynamicViscosity_;
 
-   boost::function<bool(pe::BodyID)> dpmBodySelectorFct_;
+   std::function<bool(pe::BodyID)> dpmBodySelectorFct_;
 
    BlockDataID velocityFieldInterpolatorID_;
    BlockDataID velocityCurlFieldInterpolatorID_;
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/SolidVolumeFractionFieldEvaluator.h b/src/pe_coupling/discrete_particle_methods/evaluators/SolidVolumeFractionFieldEvaluator.h
index eb0bbafb4..1c83df74a 100644
--- a/src/pe_coupling/discrete_particle_methods/evaluators/SolidVolumeFractionFieldEvaluator.h
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/SolidVolumeFractionFieldEvaluator.h
@@ -32,7 +32,7 @@
 
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe_coupling {
@@ -68,7 +68,7 @@ public:
    SolidVolumeFractionFieldEvaluator( const shared_ptr<StructuredBlockStorage> & blockStorage,
                                       const BlockDataID & solidVolumeFractionFieldID, const BlockDataID & bodyStorageID,
                                       const BlockDataID & flagFieldID, const Set< FlagUID > & domainFlags,
-                                      const boost::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
+                                      const std::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), solidVolumeFractionFieldID_( solidVolumeFractionFieldID ),
      bodyStorageID_( bodyStorageID ), dpmBodySelectorFct_( dpmBodySelectorFct)
    {
@@ -104,7 +104,7 @@ private:
    BlockDataID solidVolumeFractionFieldID_;
    BlockDataID bodyStorageID_;
 
-   boost::function<bool(pe::BodyID)> dpmBodySelectorFct_;
+   std::function<bool(pe::BodyID)> dpmBodySelectorFct_;
 
    BlockDataID scalarDistributorID_;
 };
diff --git a/src/pe_coupling/discrete_particle_methods/utility/BodyVelocityInitializer.h b/src/pe_coupling/discrete_particle_methods/utility/BodyVelocityInitializer.h
index 3ad78d1ad..75ebeef5b 100644
--- a/src/pe_coupling/discrete_particle_methods/utility/BodyVelocityInitializer.h
+++ b/src/pe_coupling/discrete_particle_methods/utility/BodyVelocityInitializer.h
@@ -36,7 +36,7 @@
 
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <cmath>
 
@@ -66,7 +66,7 @@ public:
    BodyVelocityInitializer( const shared_ptr<StructuredBlockStorage> & blockStorage,
                             const BlockDataID & bodyStorageID, const BlockDataID & flagFieldID, const Set< FlagUID > & domainFlags,
                             const BlockDataID & velocityFieldID,
-                            const boost::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
+                            const std::function<bool(pe::BodyID)> & dpmBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), bodyStorageID_( bodyStorageID ),
      dpmBodySelectorFct_( dpmBodySelectorFct)
    {
@@ -105,7 +105,7 @@ private:
    shared_ptr<StructuredBlockStorage> blockStorage_;
    BlockDataID bodyStorageID_;
    BlockDataID velocityFieldInterpolatorID_;
-   boost::function<bool(pe::BodyID)> dpmBodySelectorFct_;
+   std::function<bool(pe::BodyID)> dpmBodySelectorFct_;
 };
 
 
diff --git a/src/pe_coupling/discrete_particle_methods/utility/SubgridTimeStep.h b/src/pe_coupling/discrete_particle_methods/utility/SubgridTimeStep.h
index 130a4829f..b337175e0 100644
--- a/src/pe_coupling/discrete_particle_methods/utility/SubgridTimeStep.h
+++ b/src/pe_coupling/discrete_particle_methods/utility/SubgridTimeStep.h
@@ -32,7 +32,7 @@
 #include "pe/rigidbody/BodyIterators.h"
 #include "pe/synchronization/SyncForces.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <map>
 
@@ -63,8 +63,8 @@ public:
    explicit SubgridTimeStep( const shared_ptr<StructuredBlockStorage> & blockStorage,
                              const BlockDataID & bodyStorageID,
                              pe::cr::ICR & collisionResponse,
-                             const boost::function<void (void)> & synchronizeFunc,
-                             const boost::function<void ()> & forceEvaluationFunc,
+                             const std::function<void (void)> & synchronizeFunc,
+                             const std::function<void ()> & forceEvaluationFunc,
                              const real_t timeStepSize = real_t(1), const uint_t intermediateSteps = uint_t(1) )
    : timeStepSize_( timeStepSize )
    , intermediateSteps_( ( intermediateSteps == 0 ) ? uint_t(1) : intermediateSteps )
@@ -153,8 +153,8 @@ protected:
    const BlockDataID &  bodyStorageID_;
 
    pe::cr::ICR & collisionResponse_;
-   boost::function<void (void)> synchronizeFunc_;
-   boost::function<void ()> forceEvaluationFunc_;
+   std::function<void (void)> synchronizeFunc_;
+   std::function<void ()> forceEvaluationFunc_;
 
 };
 
diff --git a/src/pe_coupling/mapping/BodyMapping.h b/src/pe_coupling/mapping/BodyMapping.h
index 042c8dd23..4af2e9d31 100644
--- a/src/pe_coupling/mapping/BodyMapping.h
+++ b/src/pe_coupling/mapping/BodyMapping.h
@@ -35,7 +35,7 @@
 
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe_coupling {
@@ -99,7 +99,7 @@ template< typename BoundaryHandling_T >
 void mapBodies( StructuredBlockStorage & blockStorage, const BlockDataID & boundaryHandlingID,
                 const BlockDataID & bodyStorageID, pe::BodyStorage & globalBodyStorage,
                 const FlagUID & obstacle,
-                const boost::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectAllBodies )
+                const std::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectAllBodies )
 {
    for( auto blockIt = blockStorage.begin(); blockIt != blockStorage.end(); ++blockIt )
    {
diff --git a/src/pe_coupling/momentum_exchange_method/BodyMapping.h b/src/pe_coupling/momentum_exchange_method/BodyMapping.h
index 3b4b7ff57..7651386b6 100644
--- a/src/pe_coupling/momentum_exchange_method/BodyMapping.h
+++ b/src/pe_coupling/momentum_exchange_method/BodyMapping.h
@@ -35,7 +35,7 @@
 #include "pe_coupling/mapping/BodyBBMapping.h"
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe_coupling {
@@ -70,7 +70,7 @@ public:
                 const shared_ptr<pe::BodyStorage> & globalBodyStorage,
                 const BlockDataID & bodyFieldID,
                 const FlagUID & obstacle, const FlagUID & formerObstacle,
-                const boost::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectRegularBodies )
+                const std::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectRegularBodies )
    : blockStorage_( blockStorage ), boundaryHandlingID_( boundaryHandlingID ),
      bodyStorageID_(bodyStorageID), globalBodyStorage_( globalBodyStorage ), bodyFieldID_( bodyFieldID ),
      obstacle_( obstacle ), formerObstacle_( formerObstacle ), mappingBodySelectorFct_( mappingBodySelectorFct )
@@ -192,7 +192,7 @@ private:
    const FlagUID obstacle_;
    const FlagUID formerObstacle_;
 
-   boost::function<bool(pe::BodyID)> mappingBodySelectorFct_;
+   std::function<bool(pe::BodyID)> mappingBodySelectorFct_;
 
 }; // class BodyMapping
 
@@ -267,7 +267,7 @@ template< typename BoundaryHandling_T >
 void mapMovingBodies( StructuredBlockStorage & blockStorage, const BlockDataID & boundaryHandlingID,
                       const BlockDataID & bodyStorageID, pe::BodyStorage & globalBodyStorage,
                       const BlockDataID & bodyFieldID, const FlagUID & obstacle,
-                      const boost::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectAllBodies )
+                      const std::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectAllBodies )
 {
    for( auto blockIt = blockStorage.begin(); blockIt != blockStorage.end(); ++blockIt )
    {
diff --git a/src/pe_coupling/momentum_exchange_method/restoration/PDFReconstruction.h b/src/pe_coupling/momentum_exchange_method/restoration/PDFReconstruction.h
index ef8289da0..d21808bb3 100644
--- a/src/pe_coupling/momentum_exchange_method/restoration/PDFReconstruction.h
+++ b/src/pe_coupling/momentum_exchange_method/restoration/PDFReconstruction.h
@@ -33,7 +33,7 @@
 #include "field/iterators/IteratorMacros.h"
 #include "Reconstructor.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe_coupling {
@@ -71,7 +71,7 @@ public:
                              const BlockDataID & bodyFieldID,
                              const Reconstructer_T & reconstructor,
                              const FlagUID & formerObstacle, const FlagUID & fluid,
-                             const boost::function<bool(pe::BodyID)> & movingBodySelectorFct = selectRegularBodies,
+                             const std::function<bool(pe::BodyID)> & movingBodySelectorFct = selectRegularBodies,
                              const bool optimizeForSmallObstacleFraction = false ) :
       blockStorage_( blockStorage ), boundaryHandlingID_( boundaryHandlingID ), bodyStorageID_(bodyStorageID),
       globalBodyStorage_( globalBodyStorage ), bodyFieldID_( bodyFieldID ),
@@ -127,7 +127,7 @@ private:
    const FlagUID formerObstacle_;
    const FlagUID fluid_;
 
-   boost::function<bool(pe::BodyID)> movingBodySelectorFct_;
+   std::function<bool(pe::BodyID)> movingBodySelectorFct_;
 
    const bool optimizeForSmallObstacleFraction_;
 
diff --git a/src/pe_coupling/partially_saturated_cells_method/BodyAndVolumeFractionMapping.h b/src/pe_coupling/partially_saturated_cells_method/BodyAndVolumeFractionMapping.h
index 3a6ef85a0..9f28d42e6 100644
--- a/src/pe_coupling/partially_saturated_cells_method/BodyAndVolumeFractionMapping.h
+++ b/src/pe_coupling/partially_saturated_cells_method/BodyAndVolumeFractionMapping.h
@@ -34,7 +34,7 @@
 #include "pe_coupling/mapping/BodyBBMapping.h"
 #include "pe_coupling/utility/BodySelectorFunctions.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 namespace walberla {
 namespace pe_coupling {
@@ -108,7 +108,7 @@ public:
                                  const shared_ptr<pe::BodyStorage> & globalBodyStorage,
                                  const BlockDataID & bodyStorageID,
                                  const BlockDataID & bodyAndVolumeFractionFieldID,
-                                 const boost::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectRegularBodies,
+                                 const std::function<bool(pe::BodyID)> & mappingBodySelectorFct = selectRegularBodies,
                                  const real_t velocityUpdatingEpsilon = real_t(0),
                                  const real_t positionUpdatingEpsilon = real_t(0),
                                  const uint_t superSamplingDepth = uint_t(4) )
@@ -141,7 +141,7 @@ private:
    const BlockDataID bodyStorageID_;
    const BlockDataID bodyAndVolumeFractionFieldID_;
 
-   boost::function<bool(pe::BodyID)> mappingBodySelectorFct_;
+   std::function<bool(pe::BodyID)> mappingBodySelectorFct_;
 
    shared_ptr<BodyAndVolumeFractionField_T> updatedBodyAndVolumeFractionField_;
    std::map< walberla::id_t, Vector3< real_t > > lastUpdatedPositionMap_;
diff --git a/src/pe_coupling/utility/TimeStep.h b/src/pe_coupling/utility/TimeStep.h
index 6faf07fa6..684fb6bf6 100644
--- a/src/pe_coupling/utility/TimeStep.h
+++ b/src/pe_coupling/utility/TimeStep.h
@@ -32,7 +32,7 @@
 #include "pe/rigidbody/BodyIterators.h"
 #include "pe/synchronization/SyncForces.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <map>
 
@@ -47,7 +47,7 @@ public:
    explicit TimeStep( const shared_ptr<StructuredBlockStorage> & blockStorage,
                       const BlockDataID & bodyStorageID,
                       pe::cr::ICR & collisionResponse,
-                      const boost::function<void (void)> & synchronizeFunc,
+                      const std::function<void (void)> & synchronizeFunc,
                       const real_t timeStep = real_t(1), const uint_t intermediateSteps = uint_c(1) )
          : timeStep_( timeStep )
          , intermediateSteps_( ( intermediateSteps == 0 ) ? uint_c(1) : intermediateSteps )
@@ -147,7 +147,7 @@ protected:
    const BlockDataID &  bodyStorageID_;
 
    pe::cr::ICR & collisionResponse_;
-   boost::function<void (void)> synchronizeFunc_;
+   std::function<void (void)> synchronizeFunc_;
 
 }; // class TimeStep
 
diff --git a/src/python_coupling/DictWrapper.impl.h b/src/python_coupling/DictWrapper.impl.h
index 57e7f5534..400eb2e7f 100644
--- a/src/python_coupling/DictWrapper.impl.h
+++ b/src/python_coupling/DictWrapper.impl.h
@@ -102,7 +102,7 @@ inline bool DictWrapper::has<DictWrapper >( const std::string & name )
 
 //===================================================================================================================
 //
-//  Getting boost::functions
+//  Getting std::functions
 //
 //===================================================================================================================
 
@@ -111,13 +111,13 @@ inline void runPythonObject( boost::python::object obj ) {
    obj();
 }
 template<>
-inline boost::function<void()> DictWrapper::get( const std::string & name ) {
+inline std::function<void()> DictWrapper::get( const std::string & name ) {
    boost::python::object obj ( d_[name] );
    return boost::bind( &runPythonObject, obj );
 }
 
 template<>
-inline bool DictWrapper::has<boost::function<void()> >( const std::string & name )
+inline bool DictWrapper::has<std::function<void()> >( const std::string & name )
 {
    if(! d_.has_key(name) )
       return false;
diff --git a/src/python_coupling/Manager.h b/src/python_coupling/Manager.h
index 5acfb0daa..b6294b6fb 100644
--- a/src/python_coupling/Manager.h
+++ b/src/python_coupling/Manager.h
@@ -71,8 +71,8 @@ namespace python_coupling {
    public:
       WALBERLA_BEFRIEND_SINGLETON;
 
-      typedef boost::function<void()> ExporterFunction;
-      typedef boost::function< boost::python::object ( IBlock&, BlockDataID ) > BlockDataToObjectFunction;
+      typedef std::function<void()> ExporterFunction;
+      typedef std::function< boost::python::object ( IBlock&, BlockDataID ) > BlockDataToObjectFunction;
 
 
       ~Manager();
diff --git a/src/python_coupling/helper/MplHelpers.h b/src/python_coupling/helper/MplHelpers.h
index ff5969f75..640f45637 100644
--- a/src/python_coupling/helper/MplHelpers.h
+++ b/src/python_coupling/helper/MplHelpers.h
@@ -61,7 +61,7 @@ struct NonCopyableWrap {};
 #define FunctionExporterClass( functionName, functionSignature ) \
    struct Exporter_##functionName \
    { \
-      typedef boost::function<  functionSignature > FunctionType;\
+      typedef std::function<  functionSignature > FunctionType;\
       Exporter_##functionName( const IBlock * block, ConstBlockDataID id )\
          : block_( block ), blockDataID_( id )\
       {}\
diff --git a/src/timeloop/PerformanceMeter.cpp b/src/timeloop/PerformanceMeter.cpp
index 1f4f5c13d..7af5f847d 100644
--- a/src/timeloop/PerformanceMeter.cpp
+++ b/src/timeloop/PerformanceMeter.cpp
@@ -51,7 +51,7 @@ namespace timeloop {
        timeloop.addFuncBeforeTimeStep( perfMeter.getBeforeFunction() );
     \endcode
     *******************************************************************************************************************/
-   boost::function<void () > PerformanceMeter::getBeforeFunction()
+   std::function<void () > PerformanceMeter::getBeforeFunction()
    {
       return boost::bind ( &PerformanceMeter::timingStart, this );
    }
@@ -64,7 +64,7 @@ namespace timeloop {
        timeloop.addFuncAfterTimeStep ( perfMeter.getAfterFunction() );
     \endcode
     *******************************************************************************************************************/
-   boost::function<void () > PerformanceMeter::getAfterFunction()
+   std::function<void () > PerformanceMeter::getAfterFunction()
    {
       return boost::bind ( &PerformanceMeter::timingEnd, this );
    }
diff --git a/src/timeloop/PerformanceMeter.h b/src/timeloop/PerformanceMeter.h
index d08a3fb1b..732121789 100644
--- a/src/timeloop/PerformanceMeter.h
+++ b/src/timeloop/PerformanceMeter.h
@@ -24,7 +24,7 @@
 #include "domain_decomposition/StructuredBlockStorage.h"
 
 #include <boost/bind.hpp>
-#include <boost/function.hpp>
+#include <functional>
 
 #include <iostream>
 #include <map>
@@ -72,7 +72,7 @@ namespace timeloop {
    class PerformanceMeter
    {
    public:
-      typedef boost::function< uint_t(const IBlock &) > CountFunction;
+      typedef std::function< uint_t(const IBlock &) > CountFunction;
 
 
       PerformanceMeter( StructuredBlockStorage & blockStorage );
@@ -86,8 +86,8 @@ namespace timeloop {
       void timingStart();
       void timingEnd();
 
-      boost::function<void () > getBeforeFunction();
-      boost::function<void () > getAfterFunction();
+      std::function<void () > getBeforeFunction();
+      std::function<void () > getAfterFunction();
 
       void clear();
       //@}
diff --git a/src/timeloop/SelectableFunctionCreators.h b/src/timeloop/SelectableFunctionCreators.h
index f00d5a3a0..b6762e469 100644
--- a/src/timeloop/SelectableFunctionCreators.h
+++ b/src/timeloop/SelectableFunctionCreators.h
@@ -26,7 +26,7 @@
 #include "domain_decomposition/BlockStorage.h"
 
 #include <boost/bind.hpp>
-#include <boost/function.hpp>
+#include <functional>
 #include <string>
 
 
@@ -38,7 +38,7 @@ namespace timeloop {
    template < typename FuncType >
    struct FuncCreator
    {
-      FuncCreator( boost::function< FuncType > fct,
+      FuncCreator( std::function< FuncType > fct,
                   const std::string& identifier            = std::string(),
                   const Set<SUID>&   requiredSelectors     = Set<SUID>::emptySet(),
                   const Set<SUID>&   incompatibleSelectors = Set<SUID>::emptySet() )
@@ -46,7 +46,7 @@ namespace timeloop {
          requiredSelectors_( requiredSelectors ), incompatibleSelectors_( incompatibleSelectors )
       {}
 
-      boost::function< FuncType > function_;
+      std::function< FuncType > function_;
       std::string                 identifier_;
       Set<SUID>                   requiredSelectors_;
       Set<SUID>                   incompatibleSelectors_;
@@ -58,7 +58,7 @@ namespace timeloop {
    {
       SelectableFunction() {}
 
-      SelectableFunction ( boost::function< FuncType > fct,
+      SelectableFunction ( std::function< FuncType > fct,
                            const std::string& identifier            = std::string(),
                            const Set<SUID>&   requiredSelectors     = Set<SUID>::emptySet(),
                            const Set<SUID>&   incompatibleSelectors = Set<SUID>::emptySet() )
@@ -72,14 +72,14 @@ namespace timeloop {
          return *this;
       }
 
-      selectable::SetSelectableObject< boost::function<FuncType>, SUID > selectableFunc_;
+      selectable::SetSelectableObject< std::function<FuncType>, SUID > selectableFunc_;
    };
 
 
    struct BeforeFunction : public SelectableFunction< void () >
    {
       BeforeFunction() {}
-      BeforeFunction(boost::function< void () > fct,
+      BeforeFunction(std::function< void () > fct,
                      const std::string& id      = std::string(),
                      const Set<SUID>&   req    = Set<SUID>::emptySet(),
                      const Set<SUID>&   incomp = Set<SUID>::emptySet())
@@ -97,7 +97,7 @@ namespace timeloop {
    struct AfterFunction : public SelectableFunction< void () >
    {
        AfterFunction() {}
-       AfterFunction(boost::function< void () > fct,
+       AfterFunction(std::function< void () > fct,
                      const std::string& id      = std::string(),
                      const Set<SUID>&   req    = Set<SUID>::emptySet(),
                      const Set<SUID>&   incomp = Set<SUID>::emptySet())
@@ -115,14 +115,14 @@ namespace timeloop {
    template< typename T >
    struct SweepOnBlock
    {
-      SweepOnBlock( boost::function< T* ( IBlock* const block ) > function,
+      SweepOnBlock( std::function< T* ( IBlock* const block ) > function,
                      const std::string& identifier            = std::string(),
                      const Set<SUID>&   required     = Set<SUID>::emptySet(),
                      const Set<SUID>&   incompatible = Set<SUID>::emptySet() ) :
       function_( function ), identifier_( identifier ),
       requiredSelectors_( required ), incompatibleSelectors_( incompatible ) {}
 
-      boost::function< T* ( IBlock* const block ) > function_;
+      std::function< T* ( IBlock* const block ) > function_;
 
       std::string                                   identifier_;
       Set<SUID>                                     requiredSelectors_;
diff --git a/src/timeloop/SweepTimeloop.h b/src/timeloop/SweepTimeloop.h
index 33daeb7b5..a9b4d6d2a 100644
--- a/src/timeloop/SweepTimeloop.h
+++ b/src/timeloop/SweepTimeloop.h
@@ -26,7 +26,7 @@
 #include "Timeloop.h"
 #include "domain_decomposition/StructuredBlockStorage.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 #include <map>
 
diff --git a/src/timeloop/Timeloop.h b/src/timeloop/Timeloop.h
index b576f79a3..e2cc55001 100644
--- a/src/timeloop/Timeloop.h
+++ b/src/timeloop/Timeloop.h
@@ -30,13 +30,13 @@
 #include "core/timing/TimingPool.h"
 #include "core/uid/SUID.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 
 namespace walberla {
 namespace timeloop {
 
-typedef boost::function<void ()> VoidFctNoArguments;
+typedef std::function<void ()> VoidFctNoArguments;
 
 
 //*******************************************************************************************************************
diff --git a/src/vtk/ChainedFilter.h b/src/vtk/ChainedFilter.h
index 43411c80d..573fff5c1 100644
--- a/src/vtk/ChainedFilter.h
+++ b/src/vtk/ChainedFilter.h
@@ -25,7 +25,7 @@
 #include "core/cell/CellSet.h"
 #include "domain_decomposition/StructuredBlockStorage.h"
 
-#include <boost/function.hpp>
+#include <functional>
 
 
 namespace walberla {
@@ -37,7 +37,7 @@ class ChainedFilter {
 
 public:
 
-   typedef boost::function< void ( CellSet& filteredCells, const IBlock& block, const StructuredBlockStorage& storage, const uint_t ghostLayers ) > CellFilter;
+   typedef std::function< void ( CellSet& filteredCells, const IBlock& block, const StructuredBlockStorage& storage, const uint_t ghostLayers ) > CellFilter;
 
    void addFilter( const CellFilter& filter ) { filters_.push_back( filter ); }
 
diff --git a/src/vtk/Initialization.h b/src/vtk/Initialization.h
index 697013031..b08caac6a 100644
--- a/src/vtk/Initialization.h
+++ b/src/vtk/Initialization.h
@@ -26,7 +26,7 @@
 #include "core/config/Config.h"
 #include "domain_decomposition/StructuredBlockStorage.h"
 
-#include <boost/function.hpp>
+#include <functional>
 #include <string>
 
 
@@ -37,7 +37,7 @@ namespace vtk {
 // For documentation see the documentation of function "initializeVTKOutput" in Initialization.cpp
 
 
-typedef boost::function< void () > OutputFunction;
+typedef std::function< void () > OutputFunction;
 
 struct SelectableOutputFunction {
 
@@ -76,7 +76,7 @@ void initializeVTKOutput( std::map< std::string, SelectableOutputFunction > & ou
                           const std::map< std::string, VTKOutput::CellFilter > & filters,
                           const std::map< std::string, VTKOutput::BeforeFunction > & beforeFunctions );
 
-typedef boost::function< void ( std::vector< shared_ptr< BlockCellDataWriterInterface > > & writers,
+typedef std::function< void ( std::vector< shared_ptr< BlockCellDataWriterInterface > > & writers,
                                 std::map< std::string, VTKOutput::CellFilter > &            filters,
                                 std::map< std::string, VTKOutput::BeforeFunction > &        beforeFunctions ) > RegisterVTKOutputFunction;
 
diff --git a/src/vtk/VTKOutput.h b/src/vtk/VTKOutput.h
index 71cec90a9..2f51b9b21 100644
--- a/src/vtk/VTKOutput.h
+++ b/src/vtk/VTKOutput.h
@@ -35,7 +35,7 @@
 
 #include <boost/filesystem/operations.hpp>
 #include <boost/filesystem/path.hpp>
-#include <boost/function.hpp>
+#include <functional>
 #include <boost/tuple/tuple.hpp>
 
 #include <fstream>
@@ -144,8 +144,8 @@ public:
                                                                      const bool continuousNumbering, const bool binary, const bool littleEndian, 
                                                                      const bool useMPIIO, const uint_t initialExecutionCount );
 
-   typedef boost::function< void () > BeforeFunction;
-   typedef boost::function< void ( CellSet& filteredCells, const IBlock& block,
+   typedef std::function< void () > BeforeFunction;
+   typedef std::function< void ( CellSet& filteredCells, const IBlock& block,
                                    const StructuredBlockStorage& storage, const uint_t ghostLayers ) >  CellFilter;
 
    ~VTKOutput();
diff --git a/tests/field/FieldTiming.cpp b/tests/field/FieldTiming.cpp
index 86fdb06f5..5e8fd3407 100644
--- a/tests/field/FieldTiming.cpp
+++ b/tests/field/FieldTiming.cpp
@@ -196,7 +196,7 @@ double initFieldRandom(DoubleField & field)
    return sum;
 }
 
-typedef boost::function<double (const DoubleField & field)> Func;
+typedef std::function<double (const DoubleField & field)> Func;
 void timeFunction( WcTimer & timer,  Func f, const DoubleField & field, double sum, double epsilon, int nrExecutions=30 )
 {
    for(int i=0 ; i < nrExecutions; ++i)
diff --git a/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp b/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp
index 4515cc13c..d28603a3f 100644
--- a/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp
+++ b/tests/lbm/boundary/SimpleDiffusionDirichlet.cpp
@@ -75,6 +75,7 @@
 #include <boost/lexical_cast.hpp>
 
 #include <stdexcept>
+#include <array>
 
 #include "gather/GnuPlotGraphWriter.h"
 #include "field/vtk/FlagFieldCellFilter.h"
@@ -240,6 +241,7 @@ public:
          piInv_(real_t(1)/math::PI),
          valid_(uint_c(std::ceil(omega*omega*omega*real_t(10)))),
          time_( time ),
+         expArray(),
          timestep_( uint_t(0u) ),
          E_max_(maxValue-minValue),
          E_mean_(maxValue-minValue)
@@ -265,7 +267,7 @@ private:
    const uint_t valid_;
    const uint_t time_;
 
-   real_t expArray[1000];
+   std::array<real_t,1000> expArray;
 
    uint_t timestep_;
    real_t E_max_;
diff --git a/tests/mesh/PeVTKMeshWriterTest.cpp b/tests/mesh/PeVTKMeshWriterTest.cpp
index 4c0f683dc..0737b841f 100644
--- a/tests/mesh/PeVTKMeshWriterTest.cpp
+++ b/tests/mesh/PeVTKMeshWriterTest.cpp
@@ -140,7 +140,7 @@ int main( int argc, char ** argv )
    cr.setRelaxationParameter( real_t(0.7) );
    cr.setGlobalLinearAcceleration( Vec3(0,0,5) );
 
-   boost::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 = boost::bind( pe::syncNextNeighbors<BodyTuple>, boost::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 9b0d149bc..64f03d42a 100644
--- a/tests/pe/DeleteBody.cpp
+++ b/tests/pe/DeleteBody.cpp
@@ -80,7 +80,7 @@ int main( int argc, char** argv )
     }
     WALBERLA_CHECK_UNEQUAL(firstStorage, secondStorage);
 
-    boost::function<void(void)> syncCall;
+    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 );
diff --git a/tests/pe/ShadowCopy.cpp b/tests/pe/ShadowCopy.cpp
index d0d3c119f..cbd4958e3 100644
--- a/tests/pe/ShadowCopy.cpp
+++ b/tests/pe/ShadowCopy.cpp
@@ -62,7 +62,7 @@ int main( int argc, char** argv )
 //   logging::Logging::instance()->includeLoggingToFile("ShadowCopy");
 
    bool syncShadowOwners = false;
-   boost::function<void(void)> syncCall;
+   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 );
diff --git a/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp b/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
index 8786074dd..cc700fde4 100644
--- a/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
+++ b/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
@@ -337,7 +337,7 @@ public:
    QuantityEvaluator( SweepTimeloop* timeloop,  StructuredBlockStorage & blocks,
                       const BlockDataID & bodyStorageID, const BlockDataID & forceFieldID, const BlockDataID & pdfFieldID,
                       const std::string & fileName, bool fileIO, const uint_t & numSpheres, const real_t & velExpected,
-                      const boost::function<Vector3<real_t> ()>  & evaluateMeanFluidVelocity ) :
+                      const std::function<Vector3<real_t> ()>  & evaluateMeanFluidVelocity ) :
       timeloop_( timeloop ), blocks_( blocks ), bodyStorageID_( bodyStorageID ), forceFieldID_( forceFieldID ),
       pdfFieldID_( pdfFieldID ), fileName_( fileName ), fileIO_( fileIO ),
       numSpheres_( numSpheres ), velExpected_( velExpected ), evaluateMeanFluidVelocity_( evaluateMeanFluidVelocity )
@@ -484,7 +484,7 @@ private:
    const uint_t numSpheres_;
    const real_t velExpected_;
 
-   boost::function<Vector3<real_t> ()> evaluateMeanFluidVelocity_;
+   std::function<Vector3<real_t> ()> evaluateMeanFluidVelocity_;
 
 
 };
@@ -1044,7 +1044,7 @@ int main( int argc, char **argv )
    /////////////////////////////////
 
    // drag correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t>&, const Vector3<real_t> &, real_t, real_t, real_t, real_t)> dragCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t>&, const Vector3<real_t> &, real_t, real_t, real_t, real_t)> dragCorrelationFunction;
    if( dragCorr == DragCorrelation::ErgunWenYu )
    {
       dragCorrelationFunction = pe_coupling::discrete_particle_methods::dragForceErgunWenYu;
@@ -1075,7 +1075,7 @@ int main( int argc, char **argv )
    }
 
    // lift correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftCorrelationFunction;
    if( liftCorr == LiftCorrelation::NoLift )
    {
       liftCorrelationFunction = pe_coupling::discrete_particle_methods::noLiftForce;
@@ -1090,7 +1090,7 @@ int main( int argc, char **argv )
    }
 
    // added mass correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassCorrelationFunction;
    if( addedMassCorr == AddedMassCorrelation::NoAM )
    {
       addedMassCorrelationFunction = pe_coupling::discrete_particle_methods::noAddedMassForce;
@@ -1105,7 +1105,7 @@ int main( int argc, char **argv )
    }
 
    // set up effective viscosity calculation
-   boost::function<real_t ( real_t, real_t)> effectiveViscosityFunction;
+   std::function<real_t ( real_t, real_t)> effectiveViscosityFunction;
    if( effVisc == EffectiveViscosity::None )
    {
       effectiveViscosityFunction = pe_coupling::discrete_particle_methods::calculateUnchangedEffectiveViscosity;
@@ -1137,7 +1137,7 @@ int main( int argc, char **argv )
    (*bodyVelocityTimeDerivativeEvaluator)();
 
    // function used to evaluate the interaction force between fluid and particles
-   boost::function<void(void)> dragAndPressureForceEvaluationFunction;
+   std::function<void(void)> dragAndPressureForceEvaluationFunction;
    if( dpm == DPMethod::GNS ) {
       if (interpol == Interpolation::INearestNeighbor) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -1202,7 +1202,7 @@ int main( int argc, char **argv )
 
 
    // function to evaluate the lift force contribution
-   boost::function<void(void)> liftForceEvaluationFunction;
+   std::function<void(void)> liftForceEvaluationFunction;
    if( interpol == Interpolation::INearestNeighbor )
    {
       if( dist == Distribution::DNearestNeighbor )
@@ -1262,7 +1262,7 @@ int main( int argc, char **argv )
    }
 
    // function to evaluate the added mass contribution
-   boost::function<void(void)> addedMassEvaluationFunction;
+   std::function<void(void)> addedMassEvaluationFunction;
    if( interpol == Interpolation::INearestNeighbor )
    {
       if( dist == Distribution::DNearestNeighbor )
@@ -1322,7 +1322,7 @@ int main( int argc, char **argv )
    }
 
    // function to evaluate lubrication forces
-   boost::function<void(void)> lubricationEvaluationFunction;
+   std::function<void(void)> lubricationEvaluationFunction;
    if( lubricationCutOffDistance > real_t(0) )
    {
       if( useLubricationCorrection )
@@ -1343,7 +1343,7 @@ int main( int argc, char **argv )
 
 
    // function to evaluate the mean fluid velocity
-   boost::function<Vector3<real_t> ()> evaluateMeanFluidVelocity = boost::bind(getGNSMeanFluidVelocity, blocks, pdfFieldID, svfFieldID, domainVolume);
+   std::function<Vector3<real_t> ()> evaluateMeanFluidVelocity = boost::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 8b4616f72..3ac3679f5 100644
--- a/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
+++ b/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
@@ -840,7 +840,7 @@ int main( int argc, char **argv )
    /////////////////////////////////
 
    // drag correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t>&, const Vector3<real_t> &, real_t, real_t, real_t, real_t)> dragCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t>&, const Vector3<real_t> &, real_t, real_t, real_t, real_t)> dragCorrelationFunction;
    if( dragCorr == DragCorrelation::ErgunWenYu )
    {
       dragCorrelationFunction = pe_coupling::discrete_particle_methods::dragForceErgunWenYu;
@@ -871,7 +871,7 @@ int main( int argc, char **argv )
    }
 
    // lift correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t, real_t )> liftCorrelationFunction;
    if( liftCorr == LiftCorrelation::NoLift )
    {
       liftCorrelationFunction = pe_coupling::discrete_particle_methods::noLiftForce;
@@ -886,7 +886,7 @@ int main( int argc, char **argv )
    }
 
    // added mass correlation function
-   boost::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassCorrelationFunction;
+   std::function<Vector3<real_t> ( const Vector3<real_t> &, const Vector3<real_t> &, real_t, real_t )> addedMassCorrelationFunction;
    if( addedMassCorr == AddedMassCorrelation::NoAM )
    {
       addedMassCorrelationFunction = pe_coupling::discrete_particle_methods::noAddedMassForce;
@@ -901,7 +901,7 @@ int main( int argc, char **argv )
    }
 
    // set up effective viscosity calculation
-   boost::function<real_t ( real_t, real_t)> effectiveViscosityFunction;
+   std::function<real_t ( real_t, real_t)> effectiveViscosityFunction;
    if( effVisc == EffectiveViscosity::None )
    {
       effectiveViscosityFunction = pe_coupling::discrete_particle_methods::calculateUnchangedEffectiveViscosity;
@@ -933,7 +933,7 @@ int main( int argc, char **argv )
    (*bodyVelocityTimeDerivativeEvaluator)();
 
    // function used to evaluate the interaction force between fluid and particles
-   boost::function<void(void)> dragAndPressureForceEvaluationFunction;
+   std::function<void(void)> dragAndPressureForceEvaluationFunction;
    if( dpm == DPMethod::GNS ) {
       if (interpol == Interpolation::INearestNeighbor) {
          if (dist == Distribution::DNearestNeighbor) {
@@ -998,7 +998,7 @@ int main( int argc, char **argv )
 
 
    // function to evaluate the lift force contribution
-   boost::function<void(void)> liftForceEvaluationFunction;
+   std::function<void(void)> liftForceEvaluationFunction;
    if( interpol == Interpolation::INearestNeighbor )
    {
       if( dist == Distribution::DNearestNeighbor )
@@ -1059,7 +1059,7 @@ int main( int argc, char **argv )
 
 
    // function to evaluate the added mass contribution
-   boost::function<void(void)> addedMassEvaluationFunction;
+   std::function<void(void)> addedMassEvaluationFunction;
    if( interpol == Interpolation::INearestNeighbor )
    {
       if( dist == Distribution::DNearestNeighbor )
@@ -1119,7 +1119,7 @@ int main( int argc, char **argv )
    }
 
    // function to evaluate lubrication forces
-   boost::function<void(void)> lubricationEvaluationFunction;
+   std::function<void(void)> lubricationEvaluationFunction;
    if( lubricationCutOffDistance > real_t(0) )
    {
       if( useLubricationCorrection )
diff --git a/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp b/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
index e47a1d4cb..4133741c7 100644
--- a/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
@@ -281,7 +281,7 @@ int main( int argc, char **argv )
 
    // connect to pe
    const real_t overlap = real_c( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::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/DragForceSphereMEM.cpp b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp
index 1e4bf71b5..c1d3d69a0 100644
--- a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp
@@ -516,7 +516,7 @@ int main( int argc, char **argv )
    SweepTimeloop timeloop( blocks->getBlockStorage(), timesteps );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
 
    blockforest::communication::UniformBufferedScheme< stencil::D3Q27 > scheme( blocks );
    scheme.addPackInfo( make_shared< field::communication::PackInfo< PdfField_T > >( pdfFieldID ) );
diff --git a/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
index e833f9a71..27626a2e5 100644
--- a/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
@@ -391,7 +391,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
diff --git a/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp b/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
index 2569114b6..d0d021395 100644
--- a/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
@@ -789,7 +789,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_c( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::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) );
@@ -940,7 +940,7 @@ int main( int argc, char **argv )
       << Sweep( pe_coupling::PDFReconstruction< LatticeModel_T, BoundaryHandling_T, Reconstructor_T >( blocks, boundaryHandlingID, bodyStorageID, globalBodyStorage, bodyFieldID,
                                                                                                        reconstructor, FormerMO_Flag, Fluid_Flag ), "PDF Restore" );
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    if( fullPDFSync )
    {
       blockforest::communication::UniformBufferedScheme< stencil::D3Q27 > scheme( blocks );
diff --git a/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp b/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
index 15d44380b..ef64aa7a8 100644
--- a/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
@@ -413,7 +413,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_c( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::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) );
@@ -524,7 +524,7 @@ int main( int argc, char **argv )
                                                                                                        reconstructor, FormerMO_Flag, Fluid_Flag  ), "PDF Restore" );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    if( fullPDFSync )
    {
       blockforest::communication::UniformBufferedScheme< stencil::D3Q27 > scheme( blocks );
diff --git a/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp b/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
index 6cfeb3dea..6ccc9f5c7 100644
--- a/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
@@ -546,7 +546,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::function<void(void)> syncCall;
+   std::function<void(void)> syncCall;
    if (!syncShadowOwners)
    {
       syncCall = boost::bind( pe::syncNextNeighbors<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
@@ -623,7 +623,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
@@ -670,9 +670,9 @@ int main( int argc, char **argv )
    }
 
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::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 0dfd102a5..1b0d57f8e 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
@@ -457,7 +457,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
 
    // create pe bodies
@@ -509,7 +509,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
@@ -530,11 +530,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);
-   boost::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
    shared_ptr<pe_coupling::ForceTorqueOnBodiesScaler> forceScaler = make_shared<pe_coupling::ForceTorqueOnBodiesScaler>(blocks, bodyStorageID, real_t(1));
-   boost::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
+   std::function<void(void)> setForceScalingFactorToHalf = boost::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 75b9ff72e..469892c98 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
@@ -677,7 +677,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
 
@@ -728,12 +728,12 @@ int main( int argc, char **argv )
 
    // force averaging functionality
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
    shared_ptr<pe_coupling::ForceTorqueOnBodiesScaler> forceScaler = make_shared<pe_coupling::ForceTorqueOnBodiesScaler>(blocks, bodyStorageID, real_t(0.5));
-   boost::function<void(void)> setForceScalingFactorToOne = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(1));
-   boost::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,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));
 
    if( averageForceTorqueOverTwoTimSteps ) {
       bodiesFTContainer2->store();
@@ -746,7 +746,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
index d93c8731e..7a0734d33 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
@@ -544,7 +544,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
 
    // create pe bodies
@@ -595,11 +595,11 @@ int main( int argc, char **argv )
 
    // force averaging functionality
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer1 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
+   std::function<void(void)> storeForceTorqueInCont1 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::store, bodiesFTContainer1);
    shared_ptr<pe_coupling::BodiesForceTorqueContainer> bodiesFTContainer2 = make_shared<pe_coupling::BodiesForceTorqueContainer>(blocks, bodyStorageID);
-   boost::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
+   std::function<void(void)> setForceTorqueOnBodiesFromCont2 = boost::bind(&pe_coupling::BodiesForceTorqueContainer::setOnBodies, bodiesFTContainer2);
    shared_ptr<pe_coupling::ForceTorqueOnBodiesScaler> forceScaler = make_shared<pe_coupling::ForceTorqueOnBodiesScaler>(blocks, bodyStorageID, real_t(1));
-   boost::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
+   std::function<void(void)> setForceScalingFactorToHalf = boost::bind(&pe_coupling::ForceTorqueOnBodiesScaler::resetScalingFactor,forceScaler,real_t(0.5));
 
    if( averageForceTorqueOverTwoTimSteps ) {
       bodiesFTContainer2->store();
@@ -610,7 +610,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
diff --git a/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp b/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
index 00ce16ed0..82fd10937 100644
--- a/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
@@ -289,7 +289,7 @@ int main(int argc, char **argv) {
       return EXIT_FAILURE;
    }
 
-   boost::function<void(void)> syncCall = boost::bind(pe::syncShadowOwners<BodyTypeTuple>,
+   std::function<void(void)> syncCall = boost::bind(pe::syncShadowOwners<BodyTypeTuple>,
                                                       boost::ref(blocks->getBlockForest()), bodyStorageID,
                                                       static_cast<WcTimingTree *>(NULL), overlap, false);
 
@@ -358,7 +358,7 @@ int main(int argc, char **argv) {
                   "PDF Restore");
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function<void()> commFunction;
+   std::function<void()> commFunction;
 
    blockforest::communication::UniformBufferedScheme<stencil::D3Q27> scheme(blocks);
    scheme.addPackInfo(make_shared<field::communication::PackInfo<PdfField_T> >(pdfFieldID));
diff --git a/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp b/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
index 1b8d4677e..e6d43a5d0 100644
--- a/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
@@ -303,7 +303,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_t( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::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) );
@@ -348,7 +348,7 @@ int main( int argc, char **argv )
    SweepTimeloop timeloop( blocks->getBlockStorage(), timesteps );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
diff --git a/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp b/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp
index 85cc5083e..2ff3f3c98 100644
--- a/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp
@@ -466,7 +466,7 @@ int main( int argc, char **argv )
    SweepTimeloop timeloop( blocks->getBlockStorage(), timesteps );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
 
    blockforest::communication::UniformBufferedScheme< stencil::D3Q27 > scheme( blocks );
    scheme.addPackInfo( make_shared< field::communication::PackInfo< PdfField_T > >( pdfFieldID ) );
diff --git a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp
index 79e3c2f49..1547b5baa 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp
@@ -455,7 +455,7 @@ int main( int argc, char **argv )
    SweepTimeloop timeloop( blocks->getBlockStorage(), timesteps );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
 
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< field::communication::PackInfo< PdfField_T > >( pdfFieldID ) );
diff --git a/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
index 563828ee3..7e0ad3250 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
@@ -502,7 +502,7 @@ int main( int argc, char **argv )
 
    // set up synchronization procedure
    const real_t overlap = real_c( 1.5 ) * dx;
-   boost::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 = boost::bind( pe::syncShadowOwners<BodyTypeTuple>, boost::ref(blocks->getBlockForest()), bodyStorageID, static_cast<WcTimingTree*>(NULL), overlap, false );
 
    // create pe bodies
 
@@ -568,7 +568,7 @@ int main( int argc, char **argv )
    ///////////////
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
    blockforest::communication::UniformBufferedScheme< Stencil_T > scheme( blocks );
    scheme.addPackInfo( make_shared< lbm::PdfFieldPackInfo< LatticeModel_T > >( pdfFieldID ) );
    commFunction = scheme;
diff --git a/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp
index 31921f2f0..f91b5566e 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp
@@ -402,7 +402,7 @@ int main( int argc, char **argv )
    SweepTimeloop timeloop( blocks->getBlockStorage(), timesteps );
 
    // setup of the LBM communication for synchronizing the pdf field between neighboring blocks
-   boost::function< void () > commFunction;
+   std::function< void () > commFunction;
 
    blockforest::communication::UniformBufferedScheme< stencil::D3Q27 > scheme( blocks );
    scheme.addPackInfo( make_shared< field::communication::PackInfo< PdfField_T > >( pdfFieldID ) );
-- 
GitLab