diff --git a/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/AMRSedimentSettling.cpp b/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/AMRSedimentSettling.cpp
index 4a8af6662a63f9bae4db677adac0a2472046f488..42cbcd96183881ed58ce5e718fedd0e9d371214b 100644
--- a/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/AMRSedimentSettling.cpp
+++ b/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/AMRSedimentSettling.cpp
@@ -109,7 +109,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_T;
 typedef boost::tuples::tuple< NoSlip_T, MO_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple<pe::Sphere, pe::Ellipsoid, pe::Plane> BodyTypeTuple;
+typedef std::tuple<pe::Sphere, pe::Ellipsoid, pe::Plane> BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/WorkloadEvaluation.cpp b/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/WorkloadEvaluation.cpp
index 0a4fef688ee44f1e0f1b4bf56be41f9b637cd2ef..45b2d82e3ddcbaed6f13c755947f8a7b5830e8d8 100644
--- a/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/WorkloadEvaluation.cpp
+++ b/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/WorkloadEvaluation.cpp
@@ -103,7 +103,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_CLI_T;
 typedef boost::tuples::tuple<MO_CLI_T >               BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple<pe::Sphere, pe::Ellipsoid, pe::Plane> BodyTypeTuple;
+typedef std::tuple<pe::Sphere, pe::Ellipsoid, pe::Plane> BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/apps/benchmarks/DEM/DEM.cpp b/apps/benchmarks/DEM/DEM.cpp
index fb9de46118aea30d7cebd0aa9455ed9b2b46b4e6..d3a0decf71375e78b2fa109d888f87a68e6e20c7 100644
--- a/apps/benchmarks/DEM/DEM.cpp
+++ b/apps/benchmarks/DEM/DEM.cpp
@@ -25,6 +25,7 @@
 #include <core/DataTypes.h>
 
 #include <string>
+#include <tuple>
 
 namespace walberla {
 
@@ -47,7 +48,7 @@ int main( int argc, char** argv )
    using namespace walberla;
    using namespace walberla::pe;
 
-   typedef boost::tuple<Sphere, Plane> BodyTuple ;
+   typedef std::tuple<Sphere, Plane> BodyTuple ;
 
    walberla::MPIManager::instance()->initializeMPI( &argc, &argv );
 
diff --git a/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp b/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
index de8dd9d31c658d7d4a670acc7c507fd975b56e99..52e9bf90a338dcdb7ee0528169b3182da8e61815 100644
--- a/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
+++ b/apps/benchmarks/ForcesOnSphereNearPlaneInShearFlow/ForcesOnSphereNearPlaneInShearFlow.cpp
@@ -98,7 +98,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_CLI_T;
 typedef boost::tuples::tuple< MO_SBB_T, MO_CLI_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp b/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
index fb355ddde53c979f3d608f69b524e087df878963..e7743f7959ecde538ce55734bbdc56da60371ac6 100644
--- a/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
+++ b/apps/benchmarks/MotionSingleHeavySphere/MotionSingleHeavySphere.cpp
@@ -101,7 +101,7 @@ typedef pe_coupling::CurvedQuadratic< LatticeModel_T, FlagField_T > MEM_MR_T;
 typedef boost::tuples::tuple< UBB_T, Outlet_T, MEM_BB_T, MEM_CLI_T, MEM_MR_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere>;
+using BodyTypeTuple = std::tuple<pe::Sphere>;
 
 ///////////
 // FLAGS //
diff --git a/apps/benchmarks/PeriodicGranularGas/PeriodicGranularGas.cpp b/apps/benchmarks/PeriodicGranularGas/PeriodicGranularGas.cpp
index bb69ca027d76ad7caefd56793052568c9518cf62..1dfc02fd2e20abf8443d2181a264f01cb2cab82d 100644
--- a/apps/benchmarks/PeriodicGranularGas/PeriodicGranularGas.cpp
+++ b/apps/benchmarks/PeriodicGranularGas/PeriodicGranularGas.cpp
@@ -33,12 +33,13 @@
 
 #include <functional>
 #include <memory>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 using namespace walberla::timing;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 int main( int argc, char ** argv )
 {
diff --git a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
index c2f3e7a12665bf780b9ff81febd5eddf22818a20..34cb30ae1d1530649f93ab9fd81a5c62cfb60ba5 100644
--- a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
+++ b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
@@ -101,7 +101,7 @@ typedef lbm::SimplePressure< LatticeModel_T, flag_t >                  Outflow_T
 typedef boost::tuples::tuple< NoSlip_T, Inflow_T, Outflow_T >          BoundaryConditions_T;
 typedef BoundaryHandling<FlagField_T, Stencil_T, BoundaryConditions_T> BoundaryHandling_T;
 
-typedef boost::tuple<pe::Plane, pe::Sphere> BodyTypeTuple ;
+typedef std::tuple<pe::Plane, pe::Sphere> BodyTypeTuple ;
 
 ///////////
 // FLAGS //
diff --git a/apps/tutorials/pe/01_ConfinedGas.cpp b/apps/tutorials/pe/01_ConfinedGas.cpp
index 04728547d021d01d076bb1606e4f48680367aeef..6e0d1f7ab989f149270fdd38abe29ce9b5ffb047 100644
--- a/apps/tutorials/pe/01_ConfinedGas.cpp
+++ b/apps/tutorials/pe/01_ConfinedGas.cpp
@@ -27,13 +27,15 @@
 #include <core/grid_generator/SCIterator.h>
 #include <core/logging/Logging.h>
 #include <core/math/Random.h>
+
+#include <tuple>
 //! [Includes]
 
 namespace walberla {
 using namespace walberla::pe;
 
 //! [BodyTypeTuple]
-typedef boost::tuple<Sphere, Plane> BodyTypeTuple ;
+typedef std::tuple<Sphere, Plane> BodyTypeTuple ;
 //! [BodyTypeTuple]
 
 int main( int argc, char ** argv )
diff --git a/apps/tutorials/pe/02_ConfinedGasExtended.cpp b/apps/tutorials/pe/02_ConfinedGasExtended.cpp
index 2ada237572406c3f30096ab887954a6218c30f45..b39cf5f3e636b8a654bf1f078c32fe306a3021d6 100644
--- a/apps/tutorials/pe/02_ConfinedGasExtended.cpp
+++ b/apps/tutorials/pe/02_ConfinedGasExtended.cpp
@@ -36,13 +36,14 @@
 #include <vtk/VTKOutput.h>
 
 #include <functional>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 using namespace walberla::timing;
 using namespace walberla::pe::raytracing;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 int main( int argc, char ** argv )
 {
diff --git a/src/mesh/pe/rigid_body/ConvexPolyhedron.h b/src/mesh/pe/rigid_body/ConvexPolyhedron.h
index 46e95afbda14c17c679ec2f34e98b8041387b8fc..48f7c8ff1c8c3b87cc8bf6333a8d1f3a26679499 100644
--- a/src/mesh/pe/rigid_body/ConvexPolyhedron.h
+++ b/src/mesh/pe/rigid_body/ConvexPolyhedron.h
@@ -140,7 +140,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct walberla::pe::SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/communication/DynamicMarshalling.h b/src/pe/communication/DynamicMarshalling.h
index 032708bff7ac44d5ece117697ea337097f6a1a66..7786dd4b1d19e213710b61e34e1b16c6ee626071 100644
--- a/src/pe/communication/DynamicMarshalling.h
+++ b/src/pe/communication/DynamicMarshalling.h
@@ -38,7 +38,7 @@
 
 #include "core/Abort.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 
 namespace walberla {
diff --git a/src/pe/fcd/AnalyticCollisionDetection.h b/src/pe/fcd/AnalyticCollisionDetection.h
index 2bf9513ba51cbf17b395ffbc3cba9b475fd05cf1..0287f6d8dd2f5a6231a472af6ca4024d835fb2c2 100644
--- a/src/pe/fcd/AnalyticCollisionDetection.h
+++ b/src/pe/fcd/AnalyticCollisionDetection.h
@@ -37,7 +37,7 @@
 #include "core/math/Shims.h"
 #include "geometry/GeometricalFunctions.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 namespace pe {
diff --git a/src/pe/fcd/GJKEPACollideFunctor.h b/src/pe/fcd/GJKEPACollideFunctor.h
index 051d5bcbcace3bb1b99aeb497b789ae4f7895c42..c163ce145dda14ed0f79005ed01988ce4ee27dd2 100644
--- a/src/pe/fcd/GJKEPACollideFunctor.h
+++ b/src/pe/fcd/GJKEPACollideFunctor.h
@@ -28,7 +28,7 @@
 #include "pe/rigidbody/Plane.h"
 #include "pe/rigidbody/Union.h"
 #include <pe/Thresholds.h>
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla{
 namespace pe{
diff --git a/src/pe/fcd/SimpleFCD.h b/src/pe/fcd/SimpleFCD.h
index ba5e45316692dc4929823c1af10833b7b60287f9..e61d39eddffbde35603fc4d8e9fb3718c658dccf 100644
--- a/src/pe/fcd/SimpleFCD.h
+++ b/src/pe/fcd/SimpleFCD.h
@@ -23,8 +23,7 @@
 #include "AnalyticCollisionDetection.h"
 #include "GenericFCD.h"
 
-#include <boost/type_traits/is_base_of.hpp>
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla{
 namespace pe{
diff --git a/src/pe/pe_module.dox b/src/pe/pe_module.dox
index 0982c2dbbd087f09e3518505c699a789eaacedb1..58923b0b452e0846b22bb6f7602dbc05c2da1f36 100644
--- a/src/pe/pe_module.dox
+++ b/src/pe/pe_module.dox
@@ -72,7 +72,7 @@ you should call RigidBody::getTopSuperBody() and then RigidBody::getMass()
 (RigidBody::getInertia()) using the returned rigid body.
 
 \subsection SyncCalls How can I dynamically switch between sync calls?
-You can bind the function to a boost function and call this one.
+You can bind the function to a std::function and call this one.
 \snippet 02_ConfinedGasExtended.cpp Bind Sync Call
 
 \section CommonFunctions Important Classes and Functions
diff --git a/src/pe/raytracing/Intersects.h b/src/pe/raytracing/Intersects.h
index 836ee8dc6af313d2b3b25841900cf61d1a927abc..eea0f9719ce4676dc62ef17f420614dcc349b97c 100644
--- a/src/pe/raytracing/Intersects.h
+++ b/src/pe/raytracing/Intersects.h
@@ -30,7 +30,7 @@
 #include "pe/rigidbody/Union.h"
 #include "pe/utility/BodyCast.h"
 #include <core/math/Utility.h>
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <pe/raytracing/Ray.h>
 
diff --git a/src/pe/rigidbody/Box.h b/src/pe/rigidbody/Box.h
index cd6ab866230a6fc09d0bbb14b49eed97a34e43c3..5da39e7845006907ab7fa7fb67e9707782c0e735 100644
--- a/src/pe/rigidbody/Box.h
+++ b/src/pe/rigidbody/Box.h
@@ -161,7 +161,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/Capsule.h b/src/pe/rigidbody/Capsule.h
index ce6bb8cbe513160efd30f723cfb952eedefdcc00..c2d4c6b46ae5105ddc760321ff3ccbff06e5fa6e 100644
--- a/src/pe/rigidbody/Capsule.h
+++ b/src/pe/rigidbody/Capsule.h
@@ -158,7 +158,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/CylindricalBoundary.h b/src/pe/rigidbody/CylindricalBoundary.h
index 5d9b4c9d5da23922f0858500e065b25ca884a6f0..c56582c20094d26ab85c5b00b6adff489b8b9f3c 100644
--- a/src/pe/rigidbody/CylindricalBoundary.h
+++ b/src/pe/rigidbody/CylindricalBoundary.h
@@ -113,7 +113,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/Ellipsoid.h b/src/pe/rigidbody/Ellipsoid.h
index e723bc1b9e5cdbe70530b500c2a7459381e1ddd9..573d773488bb950b74944915abafa343cdf6ad34 100644
--- a/src/pe/rigidbody/Ellipsoid.h
+++ b/src/pe/rigidbody/Ellipsoid.h
@@ -149,7 +149,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/Plane.h b/src/pe/rigidbody/Plane.h
index 996edb3e84a4589be73f31a5e5cd61e9d9517e45..589d11038aa1566861f49f866233901f1ff35703 100644
--- a/src/pe/rigidbody/Plane.h
+++ b/src/pe/rigidbody/Plane.h
@@ -166,7 +166,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/SetBodyTypeIDs.h b/src/pe/rigidbody/SetBodyTypeIDs.h
index a7a7996d7a71226f7fb46863be92343e5f6dcd5d..a64c627c0a960200dbfa963334e1f084ad3f9b21 100644
--- a/src/pe/rigidbody/SetBodyTypeIDs.h
+++ b/src/pe/rigidbody/SetBodyTypeIDs.h
@@ -23,39 +23,42 @@
 #include "core/UniqueID.h"
 #include "core/logging/Logging.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 namespace pe {
 
-template < typename BodyTypeTuple >
-struct SetBodyTypeIDs{
+template < typename BodyTypeTuple, int N = std::tuple_size<BodyTypeTuple>::value - 1 >
+struct SetBodyTypeIDs
+{
    /**
     * \ingroup pe
     * \brief Initial setup of static type ids.
     *
-    * \tparam BodyTypeTuple boost::tuple of all geometries used throughout the simulation
+    * \tparam BodyTypeTuple std::tuple of all geometries used throughout the simulation
     *
     * Each geometry has a unique type id which is used to identify the geometry.
     * These type ids have to be set at the start of the simulation using this function.
     * \note You have to call this function on all processes identically.
     *
-    * The template parameter is a boost::tuple of geometries used during the simulation.
+    * The template parameter is a std::tuple of geometries used during the simulation.
     * Since the tuple is used often a typedef is used.
     * \snippet PeDocumentationSnippets.cpp Definition BodyTypeTuple
     * The function call then looks like:
     * \snippet PeDocumentationSnippets.cpp Definition Setup TypeIds
     */
    static void execute(){
-      auto typeID = UniqueID<SetBodyTypeIDs<int> >::createGlobal();
-      BodyTypeTuple::head_type::setStaticTypeID( typeID );
+      auto typeID = UniqueID<SetBodyTypeIDs<int, 0> >::createGlobal();
+      using CastType = typename std::tuple_element<N, BodyTypeTuple>::type;
+      CastType::setStaticTypeID( typeID );
       WALBERLA_LOG_DETAIL_ON_ROOT("SetBodyTypeID " << typeID << " set.");
-      SetBodyTypeIDs<typename BodyTypeTuple::tail_type>::execute();
+      SetBodyTypeIDs<BodyTypeTuple, N - 1>::execute();
    }
 };
 
-template < >
-struct SetBodyTypeIDs< boost::tuples::null_type>{
+template < typename BodyTypeTuple >
+struct SetBodyTypeIDs< BodyTypeTuple, -1>
+{
    static void execute(){
    }
 };
diff --git a/src/pe/rigidbody/Sphere.h b/src/pe/rigidbody/Sphere.h
index d062e616c08c4770bb3533c232f8fd10e4dc8f24..8efc9bcaee38478d19e0795b0a8125d88d9c6416 100644
--- a/src/pe/rigidbody/Sphere.h
+++ b/src/pe/rigidbody/Sphere.h
@@ -158,7 +158,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/Squirmer.h b/src/pe/rigidbody/Squirmer.h
index 3dc76acad0ecd56c46f9d17f3027fbd3f4fd3d7e..5dcf205c4b850019653b2079b0b280c7a536c8d0 100644
--- a/src/pe/rigidbody/Squirmer.h
+++ b/src/pe/rigidbody/Squirmer.h
@@ -84,7 +84,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 
diff --git a/src/pe/rigidbody/Union.h b/src/pe/rigidbody/Union.h
index fe6e0ce94f1e975feaae4cea68b97aa6aa85ad1d..02ce734c1b99ecae9bf42179fadceaa5515beed3 100644
--- a/src/pe/rigidbody/Union.h
+++ b/src/pe/rigidbody/Union.h
@@ -43,7 +43,7 @@
 #include <iostream>
 #include <stdexcept>
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 namespace pe {
@@ -208,7 +208,7 @@ private:
 
    //** friend declaration
    /// needed to be able to set static type ids with setStaticTypeID
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 };
 //*************************************************************************************************
diff --git a/src/pe/rigidbody/UnionFactory.h b/src/pe/rigidbody/UnionFactory.h
index eeff2ffe8c578fe05924c8fea440afb89b33e5e2..d4b4b98b8f13d88199cb94f0c4b8ead8cc4d9494 100644
--- a/src/pe/rigidbody/UnionFactory.h
+++ b/src/pe/rigidbody/UnionFactory.h
@@ -50,7 +50,7 @@ namespace pe {
  * \ingroup pe
  * \brief Setup of a new Union.
  *
- * \tparam BodyTypeTuple boost::tuple of all geometries the Union should be able to contain
+ * \tparam BodyTypeTuple std::tuple of all geometries the Union should be able to contain
  * \param globalStorage process local global storage
  * \param blocks storage of all the blocks on this process
  * \param storageID BlockDataID of the BlockStorage block datum
@@ -116,7 +116,7 @@ Union<BodyTypeTuple>* createUnion(   BodyStorage& globalStorage, BlockStorage& b
  * \ingroup pe
  * \brief Setup of a new Box directly attached to a Union.
  *
- * \tparam BodyTypeTuple boost::tuple of all geometries the Union is able to contain
+ * \tparam BodyTypeTuple std::tuple of all geometries the Union is able to contain
  * \exception std::runtime_error    Box TypeID not initalized!
  * \exception std::invalid_argument createBox: Union argument is NULL
  * \exception std::logic_error      createBox: Union is remote
@@ -180,7 +180,7 @@ BoxID createBox( Union<BodyTypeTuple>* un,
  * \ingroup pe
  * \brief Setup of a new Capsule directly attached to a Union.
  *
- * \tparam BodyTypeTuple boost::tuple of all geometries the Union is able to contain
+ * \tparam BodyTypeTuple std::tuple of all geometries the Union is able to contain
  * \exception std::runtime_error    Capsule TypeID not initalized!
  * \exception std::invalid_argument createCapsule: Union argument is NULL
  * \exception std::logic_error      createCapsule: Union is remote
@@ -242,7 +242,7 @@ CapsuleID createCapsule( Union<BodyTypeTuple>* un,
  * \ingroup pe
  * \brief Setup of a new Sphere directly attached to a Union.
  *
- * \tparam BodyTypeTuple boost::tuple of all geometries the Union is able to contain
+ * \tparam BodyTypeTuple std::tuple of all geometries the Union is able to contain
  * \exception std::runtime_error    Sphere TypeID not initalized!
  * \exception std::invalid_argument createSphere: Union argument is NULL
  * \exception std::logic_error      createSphere: Union is remote
diff --git a/src/pe/utility/BodyCast.h b/src/pe/utility/BodyCast.h
index 93c14befb3c6d4d719296855e3b2024832690c31..2c5456f5440e92f5fbffb88e68d026d9055d2e74 100644
--- a/src/pe/utility/BodyCast.h
+++ b/src/pe/utility/BodyCast.h
@@ -23,55 +23,56 @@
 #include <core/DataTypes.h>
 #include <pe/rigidbody/RigidBody.h>
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 namespace pe {
 
-template < typename TypeList, typename Functor, typename ReturnType >
+template < typename TypeList, typename Functor, typename ReturnType, int N = std::tuple_size<TypeList>::value - 1 >
 class SingleCast
 {
 public:
-   static ReturnType execute(const id_t typeID, Functor& func){
-      static_assert(boost::is_base_of<RigidBody, typename TypeList::head_type>::value, "only downcasting allowed!");
-      if (TypeList::head_type::getStaticTypeID() == typeID)
+   static ReturnType execute(const id_t typeID, Functor& func)
+   {
+      using CastBodyType = typename std::tuple_element<N, TypeList>::type;
+      static_assert(std::is_base_of<RigidBody, CastBodyType>::value, "only downcasting allowed!");
+      if (CastBodyType::getStaticTypeID() == typeID)
       {
-         typedef typename TypeList::head_type CastBodyType;
          CastBodyType* bd = NULL;
          return func( static_cast<CastBodyType *>( bd ) );
       } else
       {
-         return SingleCast<typename TypeList::tail_type, Functor, ReturnType>::execute(typeID, func);
+         return SingleCast<TypeList, Functor, ReturnType, N - 1>::execute(typeID, func);
       }
    }
 
    static ReturnType execute(RigidBody* bd, Functor& func){
-      static_assert(boost::is_base_of<RigidBody, typename TypeList::head_type>::value, "only downcasting allowed!");
-      if (TypeList::head_type::getStaticTypeID() == bd->getTypeID())
+      using CastBodyType = typename std::tuple_element<N, TypeList>::type;
+      static_assert(std::is_base_of<RigidBody, CastBodyType>::value, "only downcasting allowed!");
+      if (CastBodyType::getStaticTypeID() == bd->getTypeID())
       {
-         typedef typename TypeList::head_type CastBodyType;
          return func( static_cast<CastBodyType *>(bd) );
       } else
       {
-         return SingleCast<typename TypeList::tail_type, Functor, ReturnType>::execute(bd, func);
+         return SingleCast<TypeList, Functor, ReturnType, N - 1>::execute(bd, func);
       }
    }
 
    static ReturnType execute(const RigidBody* bd, Functor& func){
-      static_assert(boost::is_base_of<RigidBody, typename TypeList::head_type>::value, "only downcasting allowed!");
-      if (TypeList::head_type::getStaticTypeID() == bd->getTypeID())
+      using CastBodyType = typename std::tuple_element<N, TypeList>::type;
+      static_assert(std::is_base_of<RigidBody, CastBodyType>::value, "only downcasting allowed!");
+      if (CastBodyType::getStaticTypeID() == bd->getTypeID())
       {
-         typedef typename TypeList::head_type CastBodyType;
          return func( static_cast<const CastBodyType *>(bd) );
       } else
       {
-         return SingleCast<typename TypeList::tail_type, Functor, ReturnType>::execute(bd, func);
+         return SingleCast<TypeList, Functor, ReturnType, N - 1>::execute(bd, func);
       }
    }
 };
 
-template < typename Functor, typename ReturnType >
-struct SingleCast< boost::tuples::null_type, Functor, ReturnType >{
+template < typename TypeList, typename Functor, typename ReturnType >
+struct SingleCast< TypeList, Functor, ReturnType, -1 >{
    static ReturnType execute(const id_t typeID, Functor& /*func*/)
    {
       WALBERLA_ABORT("SingleCast: BodyType could not be determined (" << typeID << ")");
@@ -90,7 +91,11 @@ struct SingleCast< boost::tuples::null_type, Functor, ReturnType >{
    }
 };
 
-template < typename TypeListA, typename TypeListB, typename Functor, typename ReturnType >
+template < typename TypeListA,
+           typename TypeListB,
+           typename Functor,
+           typename ReturnType,
+           int N = std::tuple_size<TypeListA>::value - 1 >
 class DoubleCast
 {
 private:
@@ -118,40 +123,40 @@ private:
    };
 public:
    static ReturnType execute(RigidBody* a, RigidBody* b, Functor& func){
-      static_assert(boost::is_base_of<RigidBody, typename TypeListA::head_type>::value, "only downcasting allowed!");
-      if (TypeListA::head_type::getStaticTypeID() == a->getTypeID())
+      using CastBodyType = typename std::tuple_element<N, TypeListA>::type;
+      static_assert(std::is_base_of<RigidBody, CastBodyType>::value, "only downcasting allowed!");
+      if (CastBodyType::getStaticTypeID() == a->getTypeID())
       {
-         typedef typename TypeListA::head_type CastBodyType;
          SingleCastFunctor<CastBodyType> singleFunc( static_cast<CastBodyType *>(a), func);
          return SingleCast<TypeListB, SingleCastFunctor<CastBodyType>, ReturnType>::execute(b, singleFunc );
       } else
       {
-         return DoubleCast<typename TypeListA::tail_type, TypeListB, Functor, ReturnType>::execute(a, b, func);
+         return DoubleCast<TypeListA, TypeListB, Functor, ReturnType, N - 1>::execute(a, b, func);
       }
    }
 
    static ReturnType execute(const RigidBody* a, const RigidBody* b, Functor& func){
-      static_assert(boost::is_base_of<RigidBody, typename TypeListA::head_type>::value, "only downcasting allowed!");
-      if (TypeListA::head_type::getStaticTypeID() == a->getTypeID())
+      using CastBodyType = typename std::tuple_element<N, TypeListA>::type;
+      static_assert(std::is_base_of<RigidBody, CastBodyType>::value, "only downcasting allowed!");
+      if (CastBodyType::getStaticTypeID() == a->getTypeID())
       {
-         typedef typename TypeListA::head_type CastBodyType;
          SingleCastConstFunctor<CastBodyType> singleFunc( static_cast<CastBodyType *>(a), func);
          return SingleCast<TypeListB, SingleCastConstFunctor<CastBodyType>, ReturnType>::execute(b, singleFunc );
       } else
       {
-         return DoubleCast<typename TypeListA::tail_type, TypeListB, Functor, ReturnType>::execute(a, b, func);
+         return DoubleCast<TypeListA, TypeListB, Functor, ReturnType, N - 1>::execute(a, b, func);
       }
    }
 };
 
-template < typename TypeListB, typename Functor, typename ReturnType >
-struct DoubleCast< boost::tuples::null_type, TypeListB, Functor, ReturnType >{
+template < typename TypeListA, typename TypeListB, typename Functor, typename ReturnType >
+struct DoubleCast< TypeListA, TypeListB, Functor, ReturnType, -1 >{
    static ReturnType execute(RigidBody* a, RigidBody* /*b*/, Functor& /*func*/)
    {
       WALBERLA_ABORT("DoubleCast: Type of body " << a->getSystemID() << " could not be determined (" << a->getTypeID() << ")");
       return ReturnType();
    }
-   static ReturnType execute(const RigidBody* a, const RigidBody* b, Functor& /*func*/)
+   static ReturnType execute(const RigidBody* a, const RigidBody* /*b*/, Functor& /*func*/)
    {
       WALBERLA_ABORT("DoubleCast: Type of body " << a->getSystemID() << " could not be determined (" << a->getTypeID() << ")");
       return ReturnType();
diff --git a/src/pe/vtk/SphereVtkOutput.cpp b/src/pe/vtk/SphereVtkOutput.cpp
index 7ae03c08840e7ecd8d4ce3594f4eb17de918953f..2e68ed49736017add3b2e56eec6e369d7dc8610c 100644
--- a/src/pe/vtk/SphereVtkOutput.cpp
+++ b/src/pe/vtk/SphereVtkOutput.cpp
@@ -58,36 +58,36 @@ void SphereVtkOutput::configure()
       {
          if (body.getTypeID() == Sphere::getStaticTypeID() || body.getTypeID() == Squirmer::getStaticTypeID())
             bodies_.push_back( static_cast<Sphere const *> (&body) );
-         if (body.getTypeID() == Union<boost::tuple<Sphere> >::getStaticTypeID())
+         if (body.getTypeID() == Union<std::tuple<Sphere> >::getStaticTypeID())
          {
-            auto un = static_cast<Union<boost::tuple<Sphere> > const * > (&body);
+            auto un = static_cast<Union<std::tuple<Sphere> > const * > (&body);
             for( auto it2 = un->begin(); it2 != un->end(); ++it2 )
             {
                if (it2->getTypeID() == Sphere::getStaticTypeID())
                   bodies_.push_back( static_cast<ConstSphereID> (it2.getBodyID()) );
             }
          }
-         if (body.getTypeID() == Union<boost::tuple<Squirmer> >::getStaticTypeID())
+         if (body.getTypeID() == Union<std::tuple<Squirmer> >::getStaticTypeID())
          {
-            auto un = static_cast<Union<boost::tuple<Squirmer> > const * > (&body);
+            auto un = static_cast<Union<std::tuple<Squirmer> > const * > (&body);
             for( auto it2 = un->begin(); it2 != un->end(); ++it2 )
             {
                if (it2->getTypeID() == Squirmer::getStaticTypeID())
                   bodies_.push_back( static_cast<ConstSphereID> (it2.getBodyID()) );
             }
          }
-         if (body.getTypeID() == Union<boost::tuple<Sphere,Squirmer> >::getStaticTypeID())
+         if (body.getTypeID() == Union<std::tuple<Sphere,Squirmer> >::getStaticTypeID())
          {
-            auto un = static_cast<Union<boost::tuple<Sphere,Squirmer> > const * > (&body);
+            auto un = static_cast<Union<std::tuple<Sphere,Squirmer> > const * > (&body);
             for( auto it2 = un->begin(); it2 != un->end(); ++it2 )
             {
                if (it2->getTypeID() == Sphere::getStaticTypeID() || it2->getTypeID() == Squirmer::getStaticTypeID())
                   bodies_.push_back( static_cast<ConstSphereID> (it2.getBodyID()) );
             }
          }
-         if (body.getTypeID() == Union<boost::tuple<Squirmer,Sphere> >::getStaticTypeID())
+         if (body.getTypeID() == Union<std::tuple<Squirmer,Sphere> >::getStaticTypeID())
          {
-            auto un = static_cast<Union<boost::tuple<Squirmer,Sphere> > const * > (&body);
+            auto un = static_cast<Union<std::tuple<Squirmer,Sphere> > const * > (&body);
             for( auto it2 = un->begin(); it2 != un->end(); ++it2 )
             {
                if (it2->getTypeID() == Sphere::getStaticTypeID() || it2->getTypeID() == Squirmer::getStaticTypeID())
diff --git a/tests/mesh/MeshMarshalling.cpp b/tests/mesh/MeshMarshalling.cpp
index 1ba1fcc2125ae300a457d557c83bc2ee08c4a1ff..8b9222a2bb777e9a8fb6f7829f23ef6727def6d8 100644
--- a/tests/mesh/MeshMarshalling.cpp
+++ b/tests/mesh/MeshMarshalling.cpp
@@ -34,18 +34,19 @@
 #include "pe/rigidbody/SetBodyTypeIDs.h"
 #include "pe/Materials.h"
 
-#include <boost/tuple/tuple.hpp>
 #include <memory>
+#include <tuple>
+
 namespace walberla {
 using namespace walberla::pe;
 using namespace walberla::pe::communication;
 
-using UnionTypeTuple = boost::tuple<mesh::pe::ConvexPolyhedron>;
+using UnionTypeTuple = std::tuple<mesh::pe::ConvexPolyhedron>;
 using UnionT = Union<UnionTypeTuple>;
 using UnionID = UnionT *;
 using UnionPtr = std::unique_ptr<UnionT>;
 
-typedef boost::tuple<mesh::pe::ConvexPolyhedron, UnionT> BodyTuple ;
+typedef std::tuple<mesh::pe::ConvexPolyhedron, UnionT> BodyTuple ;
 
 std::vector<Vector3<real_t>> generateOctahedron( const real_t radius)
 {
diff --git a/tests/mesh/PeVTKMeshWriterTest.cpp b/tests/mesh/PeVTKMeshWriterTest.cpp
index e0a9803879ba80fedd63af3fd414eabaeb7d0105..04d44473b570d53fed525cbfa57783ecb79aeeff 100644
--- a/tests/mesh/PeVTKMeshWriterTest.cpp
+++ b/tests/mesh/PeVTKMeshWriterTest.cpp
@@ -46,12 +46,13 @@
 
 #include <functional>
 #include <random>
+#include <tuple>
 
 using namespace walberla;
 using namespace walberla::pe;
 using namespace walberla::mesh::pe;
 
-typedef boost::tuple<ConvexPolyhedron, Plane> BodyTuple ;
+typedef std::tuple<ConvexPolyhedron, Plane> BodyTuple ;
 
 std::vector<Vector3<real_t>> generatePointCloudCube()
 {
diff --git a/tests/pe/BodyFlags.cpp b/tests/pe/BodyFlags.cpp
index dac32839193613cd8029d289ead1311c382c8cb0..fa6db7e1c4ba4dd642099424c614c265fe693e4b 100644
--- a/tests/pe/BodyFlags.cpp
+++ b/tests/pe/BodyFlags.cpp
@@ -32,12 +32,12 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 int main( int argc, char ** argv )
 {
@@ -131,4 +131,4 @@ int main( int argc, char ** argv )
 int main( int argc, char* argv[] )
 {
   return walberla::main( argc, argv );
-}
\ No newline at end of file
+}
diff --git a/tests/pe/BodyIterators.cpp b/tests/pe/BodyIterators.cpp
index e53b44a6acb633cea157ebe0f4ba9187966f4748..ecfd526471b2617f606727b159344c1deb5f2d08 100644
--- a/tests/pe/BodyIterators.cpp
+++ b/tests/pe/BodyIterators.cpp
@@ -36,7 +36,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 int main( int argc, char **argv )
 {
diff --git a/tests/pe/Callback.cpp b/tests/pe/Callback.cpp
index 220c026024699df108d677caa908b8891bd4de69..ebcbb2cc3b443718dc05972d394a61e5fefc93e5 100644
--- a/tests/pe/Callback.cpp
+++ b/tests/pe/Callback.cpp
@@ -29,7 +29,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere> BodyTypeTuple ;
+typedef std::tuple<Sphere> BodyTypeTuple ;
 
 enum class State{ LOCALIZED0, SHADOW, MIGRATED, LOCALIZED1, REMOVED};
 State state;
diff --git a/tests/pe/Collision.cpp b/tests/pe/Collision.cpp
index e73d9ac3522cd3cd88e9cfa9f8d08e372d7c598f..e6d528d5adbeb5d48c9ba7156e214dc5999f6f3f 100644
--- a/tests/pe/Collision.cpp
+++ b/tests/pe/Collision.cpp
@@ -235,7 +235,7 @@ void CapsuleTest2()
 
 void UnionTest()
 {
-   using UnionT = Union<boost::tuple<Sphere> >;
+   using UnionT = Union<std::tuple<Sphere> >;
    UnionT  un1(120, 0, Vec3(0,0,0), Vec3(0,0,0), Quat(), false, true, false);
    UnionT  un2(121, 0, Vec3(real_t(1.5),0,0), Vec3(0,0,0), Quat(), false, true, false);
    auto sp1 = createSphere(&un1, 123, Vec3(0,0,0), 1);
@@ -253,7 +253,7 @@ void UnionTest()
                  Contact( sp1, sp2, Vec3(real_t(0.75), 0, 0), Vec3(-1, 0, 0), real_t(-0.5)) );
 }
 
-typedef boost::tuple<Box, Capsule, Plane, Sphere> BodyTuple ;
+typedef std::tuple<Box, Capsule, Plane, Sphere> BodyTuple ;
 
 int main( int argc, char** argv )
 {
diff --git a/tests/pe/CollisionTobiasGJK.cpp b/tests/pe/CollisionTobiasGJK.cpp
index c6915d86dab50cf32b232ae63ee5bc12a3c9a55c..fb93470af335fbf17b87fc87fcdcdb32a4727e6d 100644
--- a/tests/pe/CollisionTobiasGJK.cpp
+++ b/tests/pe/CollisionTobiasGJK.cpp
@@ -49,7 +49,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Box, Capsule, Plane, Sphere, Union<boost::tuple<Sphere>>, Union<boost::tuple<Sphere, Union<boost::tuple<Sphere>>>>, Ellipsoid> BodyTuple ;
+typedef std::tuple<Box, Capsule, Plane, Sphere, Union<std::tuple<Sphere>>, Union<std::tuple<Sphere, Union<std::tuple<Sphere>>>>, Ellipsoid> BodyTuple ;
 
 bool gjkEPAcollideHybrid(GeomPrimitive &geom1, GeomPrimitive &geom2, Vec3& normal, Vec3& contactPoint, real_t& penetrationDepth)
 {
@@ -356,20 +356,20 @@ void UnionTest(){
    Box box(179, 179, Vec3(0,0,0), Vec3(0,0,0), Quat(), Vec3(real_t(10),real_t(2), real_t(10)), iron, false, true, false);
 
 
-   using UnionT = Union<boost::tuple<Sphere>>;
+   using UnionT = Union<std::tuple<Sphere>>;
    auto unsub = std::make_unique<UnionT>(192, 192, Vec3(0,real_t(3.8),0), Vec3(0,0,0), Quat(), false, true, false);
 
    auto sp1 = createSphere(unsub.get(), 180, Vec3(-3,real_t(3.8),0), real_t(3.0));
    auto sp2 = createSphere(unsub.get(), 181, Vec3(3,real_t(3.8),0), real_t(3.0));
 
    //Create another union, and add sub union
-   Union<boost::tuple<Sphere, Union<boost::tuple<Sphere>>>> un(193, 193, Vec3(0, 0, 0), Vec3(0,0,0), Quat(), false, true, false);
+   Union<std::tuple<Sphere, Union<std::tuple<Sphere>>>> un(193, 193, Vec3(0, 0, 0), Vec3(0,0,0), Quat(), false, true, false);
    createSphere(&un, 182, Vec3(0,real_t(6),0), real_t(3.0));
    un.add(std::move(unsub));
 
 
    PossibleContacts pcs;
-   pcs.push_back(std::pair<Union<boost::tuple<Sphere,Union<boost::tuple<Sphere>>>>*, Box*>(&un, &box));
+   pcs.push_back(std::pair<Union<std::tuple<Sphere,Union<std::tuple<Sphere>>>>*, Box*>(&un, &box));
    Contacts& container = testFCD.generateContacts(pcs);
    WALBERLA_CHECK(container.size() == 2);
 
@@ -397,7 +397,7 @@ void UnionTest(){
    pcs.clear();
 
    //Vice Versa
-   pcs.push_back(std::pair<Box*, Union<boost::tuple<Sphere, Union<boost::tuple<Sphere>>>>* >(&box, &un));
+   pcs.push_back(std::pair<Box*, Union<std::tuple<Sphere, Union<std::tuple<Sphere>>>>* >(&box, &un));
    container = testFCD.generateContacts(pcs);
    WALBERLA_CHECK(container.size() == 2);
 
diff --git a/tests/pe/CreateWorld.cpp b/tests/pe/CreateWorld.cpp
index 04937a603fbdf37649ac86acbd576a9764833211..08517239d647dfd4d0ce8c20793e01b5c52cd6a0 100644
--- a/tests/pe/CreateWorld.cpp
+++ b/tests/pe/CreateWorld.cpp
@@ -30,7 +30,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 int main( int argc, char** argv )
 {
diff --git a/tests/pe/DeleteBody.cpp b/tests/pe/DeleteBody.cpp
index ea6adfbfcdf023fc14cdfeaf9911b6d0bec3acd9..b6729855a4b831c2ffd3b5a9459d893aa54ddf13 100644
--- a/tests/pe/DeleteBody.cpp
+++ b/tests/pe/DeleteBody.cpp
@@ -36,7 +36,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 int main( int argc, char** argv )
 {
diff --git a/tests/pe/DestroyBody.cpp b/tests/pe/DestroyBody.cpp
index b2deb57fa759e8b4dc634eb70ae0b1cd703725e1..0ca41dac6abe0d95893a297272f99f0994bb2fa3 100644
--- a/tests/pe/DestroyBody.cpp
+++ b/tests/pe/DestroyBody.cpp
@@ -34,7 +34,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 int main( int argc, char** argv )
 {
diff --git a/tests/pe/DynamicRefinement.cpp b/tests/pe/DynamicRefinement.cpp
index 454e915a6cff327b552efb604a85947da530693f..40c0a1b6b808db3a95a93a22e2a9c4e630c11dd3 100644
--- a/tests/pe/DynamicRefinement.cpp
+++ b/tests/pe/DynamicRefinement.cpp
@@ -33,7 +33,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 class ReGrid
 {
diff --git a/tests/pe/ForceSync.cpp b/tests/pe/ForceSync.cpp
index d19422354622bf1218d7fcd31a44d181a9bcbcae..f1e9f2e267373e79294652eaf8d75a63523f8262 100644
--- a/tests/pe/ForceSync.cpp
+++ b/tests/pe/ForceSync.cpp
@@ -33,7 +33,7 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <vector>
@@ -41,7 +41,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 int main( int argc, char ** argv )
 {
diff --git a/tests/pe/HCSITS.cpp b/tests/pe/HCSITS.cpp
index 5b8deb15585be7ba201afb9564fb67036251186d..dc33533eb62b4940d7a5dcddbfeb9f5792e35571 100644
--- a/tests/pe/HCSITS.cpp
+++ b/tests/pe/HCSITS.cpp
@@ -30,7 +30,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 void normalReactionTest(cr::HCSITS& cr, SphereID sp)
 {
diff --git a/tests/pe/HashGrids.cpp b/tests/pe/HashGrids.cpp
index 7d83456a0e735ceb88689e12feacfe74cda1a8ad..8e1b2044f228a4ce575d9e5419e3ff94d89ebe78 100644
--- a/tests/pe/HashGrids.cpp
+++ b/tests/pe/HashGrids.cpp
@@ -34,7 +34,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 int main( int argc, char** argv )
 {
diff --git a/tests/pe/LoadFromConfig.cpp b/tests/pe/LoadFromConfig.cpp
index 1e22cd6fc88044c70db2595935adebfb625143bb..9a81900a764b9ef16764a4b1f33ea937187e4079 100644
--- a/tests/pe/LoadFromConfig.cpp
+++ b/tests/pe/LoadFromConfig.cpp
@@ -27,7 +27,7 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
diff --git a/tests/pe/Marshalling.cpp b/tests/pe/Marshalling.cpp
index 8eaa11069bffe325b3f747e6ab3c1e1519fbc77a..ed1fdce61adc4c74990c90003b4d6f3d3877c3ed 100644
--- a/tests/pe/Marshalling.cpp
+++ b/tests/pe/Marshalling.cpp
@@ -32,18 +32,18 @@
 #include "pe/rigidbody/SetBodyTypeIDs.h"
 #include "pe/Materials.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 using namespace walberla::pe::communication;
 
-using UnionTypeTuple = boost::tuple<Sphere>;
+using UnionTypeTuple = std::tuple<Sphere>;
 using UnionT = Union<UnionTypeTuple>;
 using UnionID = UnionT *;
 using UnionPtr = std::unique_ptr<UnionT>;
 
-typedef boost::tuple<Box, Capsule, Sphere, Squirmer, UnionT, Ellipsoid> BodyTuple ;
+typedef std::tuple<Box, Capsule, Sphere, Squirmer, UnionT, Ellipsoid> BodyTuple ;
 
 void testBox()
 {
diff --git a/tests/pe/MinMaxRefinement.cpp b/tests/pe/MinMaxRefinement.cpp
index 3640056459becd13079590470f6b16291c96918e..782d3235a6c0018f6df0cc8bd92859e61cf17345 100644
--- a/tests/pe/MinMaxRefinement.cpp
+++ b/tests/pe/MinMaxRefinement.cpp
@@ -42,7 +42,7 @@
 #include "core/debug/TestSubsystem.h"
 #include "core/logging/Logging.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <limits>
@@ -51,7 +51,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 int main( int argc, char ** argv )
 {
diff --git a/tests/pe/ParallelEquivalence.cpp b/tests/pe/ParallelEquivalence.cpp
index a8fd5bffe87a2fe0afdbe1de42eb6e43e5679550..c5e2d2a8e5b5ad84c4829be2896f4f6fc24ffad9 100644
--- a/tests/pe/ParallelEquivalence.cpp
+++ b/tests/pe/ParallelEquivalence.cpp
@@ -31,7 +31,7 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <vector>
@@ -41,7 +41,7 @@ using namespace walberla::pe;
 
 int runs = 1000;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 struct BodyData
 {
diff --git a/tests/pe/PeDocumentationSnippets.cpp b/tests/pe/PeDocumentationSnippets.cpp
index e5067ab1056e12f2c8bcd0daf75b451ef4b2439b..aed806bf5306f5d87a1a867554a8e2320037c422 100644
--- a/tests/pe/PeDocumentationSnippets.cpp
+++ b/tests/pe/PeDocumentationSnippets.cpp
@@ -38,7 +38,7 @@
 #include "core/debug/TestSubsystem.h"
 #include "vtk/VTKOutput.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <vector>
@@ -47,13 +47,13 @@ namespace walberla {
 using namespace walberla::pe;
 
 //! [Definition of Union Types]
-typedef boost::tuple<Box, Capsule, Sphere>  UnionTypeTuple;
+typedef std::tuple<Box, Capsule, Sphere>  UnionTypeTuple;
 using UnionT = Union<UnionTypeTuple>;
 using UnionID = UnionT *;
 //! [Definition of Union Types]
 
 //! [Definition BodyTypeTuple]
-typedef boost::tuple<Box, Capsule, Plane, Sphere, UnionT> BodyTypeTuple ;
+typedef std::tuple<Box, Capsule, Plane, Sphere, UnionT> BodyTypeTuple ;
 //! [Definition BodyTypeTuple]
 
 int main( int argc, char ** argv )
diff --git a/tests/pe/Raytracing.cpp b/tests/pe/Raytracing.cpp
index e8f0f505a8313212c4895341a7ac7784234511d1..25e925b8acfba4148b9b7258cd8adc1a12a142fa 100644
--- a/tests/pe/Raytracing.cpp
+++ b/tests/pe/Raytracing.cpp
@@ -38,7 +38,7 @@ namespace walberla {
 using namespace walberla::pe;
 using namespace walberla::pe::raytracing;
 
-typedef boost::tuple<Box, Plane, Sphere, Capsule, Ellipsoid> BodyTuple ;
+typedef std::tuple<Box, Plane, Sphere, Capsule, Ellipsoid> BodyTuple ;
 
 void SphereIntersectsTest()
 {
diff --git a/tests/pe/Refinement.cpp b/tests/pe/Refinement.cpp
index 361cc322e069680d7911be277e5f3042bece498a..943526d15552da56f033ea22d735509c3c189291 100644
--- a/tests/pe/Refinement.cpp
+++ b/tests/pe/Refinement.cpp
@@ -35,7 +35,7 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <vector>
@@ -43,7 +43,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere, Plane> BodyTuple ;
+typedef std::tuple<Sphere, Plane> BodyTuple ;
 
 class SimpleLB
 {
diff --git a/tests/pe/RefinementWithSpareProcesses.cpp b/tests/pe/RefinementWithSpareProcesses.cpp
index 9a6b93462a6cab6feeb13bdd0b4c1b6e4299aeae..e4f1d4c80aec4bfc749908539f526a830e01c4fe 100644
--- a/tests/pe/RefinementWithSpareProcesses.cpp
+++ b/tests/pe/RefinementWithSpareProcesses.cpp
@@ -35,7 +35,7 @@
 #include "core/debug/TestSubsystem.h"
 #include "core/grid_generator/SCIterator.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <limits>
@@ -44,7 +44,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-typedef boost::tuple<Sphere> BodyTuple ;
+typedef std::tuple<Sphere> BodyTuple ;
 
 int main( int /*argc*/, char ** /*argv*/, const std::string& LBAlgorithm )
 {
diff --git a/tests/pe/SerializeDeserialize.cpp b/tests/pe/SerializeDeserialize.cpp
index 4a6267aa779522d08564a86a51376d92d43afaea..4596f000523db90361acfd09190ae09983870c5f 100644
--- a/tests/pe/SerializeDeserialize.cpp
+++ b/tests/pe/SerializeDeserialize.cpp
@@ -32,12 +32,12 @@
 #include "core/debug/TestSubsystem.h"
 #include "core/grid_generator/SCIterator.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 void createDump()
 {
diff --git a/tests/pe/SetBodyTypeIDs.cpp b/tests/pe/SetBodyTypeIDs.cpp
index 6cc5999945b74729741aaf0feb62c9a0df2a13f3..72dc3af9004e480e896eb52c845454c8b79b1c4a 100644
--- a/tests/pe/SetBodyTypeIDs.cpp
+++ b/tests/pe/SetBodyTypeIDs.cpp
@@ -45,7 +45,7 @@ private:
 };
 
 class A : public Base{
-    template <class T>
+    template <class T, int N>
     friend struct SetBodyTypeIDs;
 private:
     static id_t staticTypeID_;
@@ -57,7 +57,7 @@ public:
 };
 
 class B : public Base{
-    template <class T>
+    template <class T, int N>
     friend struct SetBodyTypeIDs;
 private:
     static id_t staticTypeID_;
@@ -69,7 +69,7 @@ public:
 };
 
 class C : public Base{
-   template <class T>
+   template <class T, int N>
    friend struct SetBodyTypeIDs;
 private:
     static id_t staticTypeID_;
@@ -114,7 +114,7 @@ int main( int argc, char** argv )
 
    walberla::MPIManager::instance()->initializeMPI( &argc, &argv );
 
-   typedef boost::tuple<A, B, C> BodyTuple ;
+   typedef std::tuple<A, B, C> BodyTuple ;
    SetBodyTypeIDs<BodyTuple>::execute();
 
    WALBERLA_CHECK_UNEQUAL(A::getStaticTypeID(), 100);
@@ -125,7 +125,7 @@ int main( int argc, char** argv )
    WALBERLA_CHECK_UNEQUAL(A::getStaticTypeID(), C::getStaticTypeID());
    WALBERLA_CHECK_UNEQUAL(B::getStaticTypeID(), C::getStaticTypeID());
 
-   typedef boost::tuple<Plane, Sphere, Box, Capsule, Union< boost::tuple<Sphere, Box> > > BodyTuple2 ;
+   typedef std::tuple<Plane, Sphere, Box, Capsule, Union< std::tuple<Sphere, Box> > > BodyTuple2 ;
    SetBodyTypeIDs<BodyTuple2>::execute();
    WALBERLA_CHECK_UNEQUAL(Plane::getStaticTypeID(), Sphere::getStaticTypeID());
    WALBERLA_CHECK_UNEQUAL(Plane::getStaticTypeID(), Box::getStaticTypeID());
diff --git a/tests/pe/ShadowCopy.cpp b/tests/pe/ShadowCopy.cpp
index bf3f39c921ad7878366d02b4454e2b2ae1f32540..ff5ff39404fd5c99dffff9fa3f4c9d5c0114c731 100644
--- a/tests/pe/ShadowCopy.cpp
+++ b/tests/pe/ShadowCopy.cpp
@@ -34,8 +34,8 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using UnionT = Union<boost::tuple<Sphere> >;
-typedef boost::tuple<Sphere, UnionT> BodyTuple ;
+using UnionT = Union<std::tuple<Sphere> >;
+typedef std::tuple<Sphere, UnionT> BodyTuple ;
 
 int main( int argc, char** argv )
 {
@@ -126,7 +126,7 @@ int main( int argc, char** argv )
    destroyBodyBySID( *globalBodyStorage, forest->getBlockStorage(), storageID, sid );
 
    WALBERLA_LOG_PROGRESS_ON_ROOT( " *** UNION *** ");
-   UnionT* un   = createUnion< boost::tuple<Sphere> >( *globalBodyStorage, forest->getBlockStorage(), storageID, 0, Vec3(2,2,2) );
+   UnionT* un   = createUnion< std::tuple<Sphere> >( *globalBodyStorage, forest->getBlockStorage(), storageID, 0, Vec3(2,2,2) );
    auto sp1 = createSphere(un, 10, Vec3(real_t(4.9),2,2), real_t(1));
    auto sp2 = createSphere(un, 11, Vec3(3,2,2), real_t(1.5));
    un->setPosition( Vec3( real_t(4.9), 2, 2) );
diff --git a/tests/pe/SimpleCCD.cpp b/tests/pe/SimpleCCD.cpp
index b1388dab5846c876b419940148acd58a6dc6583f..3d0d5bc7e11e844fd5b672fc0207639d8565c7a3 100644
--- a/tests/pe/SimpleCCD.cpp
+++ b/tests/pe/SimpleCCD.cpp
@@ -36,7 +36,7 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 int main( int argc, char** argv )
 {
diff --git a/tests/pe/SyncEquivalence.cpp b/tests/pe/SyncEquivalence.cpp
index f15dcd4c7bfa47bb74c1c77c3afd456ce0874a39..d17e2f0f19d3e14fc3c128f4a386711479726b23 100644
--- a/tests/pe/SyncEquivalence.cpp
+++ b/tests/pe/SyncEquivalence.cpp
@@ -44,7 +44,7 @@ namespace walberla {
 using namespace walberla::pe;
 using namespace walberla::timing;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 struct BodyData
 {
diff --git a/tests/pe/Synchronization.cpp b/tests/pe/Synchronization.cpp
index 646e6d2390fafa8066033ff23dee1a3467962ded..3693e9ab8e2ddb5479b3e8fdef6cb0b3360e974f 100644
--- a/tests/pe/Synchronization.cpp
+++ b/tests/pe/Synchronization.cpp
@@ -31,12 +31,12 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 void checkSphere(StructuredBlockForest& forest, BlockDataID storageID, walberla::id_t sid, Sphere& ref, const Vec3& newPos)
 {
diff --git a/tests/pe/SynchronizationDelete.cpp b/tests/pe/SynchronizationDelete.cpp
index 6b649c29872b57ce376a60c089a259ff0ad385dd..1d9c48b2e5f07e7ca54445ea3ed69be0f910d03a 100644
--- a/tests/pe/SynchronizationDelete.cpp
+++ b/tests/pe/SynchronizationDelete.cpp
@@ -31,12 +31,12 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 void integrate(StructuredBlockForest& forest, BlockDataID storageID, const real_t dt)
 {
diff --git a/tests/pe/SynchronizationLargeBody.cpp b/tests/pe/SynchronizationLargeBody.cpp
index 3846a2b55a9b61606c152f082a6f34af3cf46abb..28fdc39d15e18d392b677ea6306dacb3269e6a32 100644
--- a/tests/pe/SynchronizationLargeBody.cpp
+++ b/tests/pe/SynchronizationLargeBody.cpp
@@ -30,12 +30,12 @@
 
 #include "core/debug/TestSubsystem.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace walberla {
 using namespace walberla::pe;
 
-using BodyTuple = boost::tuple<Sphere> ;
+using BodyTuple = std::tuple<Sphere> ;
 
 // checkSphere without dx
 void checkSphere(StructuredBlockForest& forest, BlockDataID storageID, walberla::id_t sid, SphereID ref, const Vec3& newPos)
diff --git a/tests/pe/Union.cpp b/tests/pe/Union.cpp
index 91db8412e917ffb127d1432d8524a7c25a9526d6..ce0ea5e96f63cefbe3cc2421c9b348cd351f803f 100644
--- a/tests/pe/Union.cpp
+++ b/tests/pe/Union.cpp
@@ -36,7 +36,7 @@
 #include "core/debug/TestSubsystem.h"
 #include "vtk/VTKOutput.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 #include <algorithm>
 #include <vector>
@@ -44,8 +44,8 @@
 namespace walberla {
 using namespace walberla::pe;
 
-using UnionType = Union<boost::tuple<Sphere> > ;
-typedef boost::tuple<Sphere, Plane, UnionType> BodyTuple ;
+using UnionType = Union<std::tuple<Sphere> > ;
+typedef std::tuple<Sphere, Plane, UnionType> BodyTuple ;
 
 void SnowManFallingOnPlane()
 {
@@ -75,7 +75,7 @@ void SnowManFallingOnPlane()
 
    createPlane( *globalBodyStorage, 0, Vec3(0,0,1), Vec3(0,0,0) );
 
-   UnionType* un  = createUnion< boost::tuple<Sphere> >( *globalBodyStorage, forest->getBlockStorage(), storageID, 0, Vec3(5,5,5) );
+   UnionType* un  = createUnion< std::tuple<Sphere> >( *globalBodyStorage, forest->getBlockStorage(), storageID, 0, Vec3(5,5,5) );
    auto sp1       = createSphere(un, 10, Vec3(5,5,1), real_t(1));
    auto sp2       = createSphere(un, 11, Vec3(real_t(6.7),5,real_t(1.2)), real_t(1.1));
 
diff --git a/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp b/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
index f3dc7905e01378bffc4e39dea83ceb059758006e..512f650d9baa06ed758174667a501dd00f2ff225 100644
--- a/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
+++ b/tests/pe_coupling/discrete_particle_methods/HinderedSettlingDynamicsDPM.cpp
@@ -91,7 +91,7 @@ typedef lbm::NoSlip< LatticeModel_T, flag_t >                          NoSlip_T;
 using BoundaryConditions_T = boost::tuples::tuple<NoSlip_T>;
 typedef BoundaryHandling<FlagField_T, Stencil_T, BoundaryConditions_T> BoundaryHandling_T;
 
-typedef boost::tuple<pe::Plane, pe::Sphere> BodyTypeTuple ;
+typedef std::tuple<pe::Plane, pe::Sphere> BodyTypeTuple ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp b/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
index f40e6156de97586ebb7029e269caa4862a62e5b3..f1ae8d8c04f5b686129bfa5ade82c5d6bc50c85d 100644
--- a/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
+++ b/tests/pe_coupling/discrete_particle_methods/SphereWallCollisionBehaviorDPM.cpp
@@ -90,7 +90,7 @@ typedef lbm::NoSlip< LatticeModel_T, flag_t >                          NoSlip_T;
 using BoundaryConditions_T = boost::tuples::tuple<NoSlip_T>;
 typedef BoundaryHandling<FlagField_T, Stencil_T, BoundaryConditions_T> BoundaryHandling_T;
 
-typedef boost::tuple<pe::Plane, pe::Sphere> BodyTypeTuple ;
+typedef std::tuple<pe::Plane, pe::Sphere> BodyTypeTuple ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/geometry/PeIntersectionRatioTest.cpp b/tests/pe_coupling/geometry/PeIntersectionRatioTest.cpp
index 1ad423385b1bfc256c0812296e80151b50772a01..496f7db519c509f573c130c9b10a5c3ccaa79ae0 100644
--- a/tests/pe_coupling/geometry/PeIntersectionRatioTest.cpp
+++ b/tests/pe_coupling/geometry/PeIntersectionRatioTest.cpp
@@ -41,7 +41,7 @@ namespace pe_intersection_ratio_test
 
 using namespace walberla;
 
-typedef boost::tuple<pe::Sphere, pe::Plane, pe::Ellipsoid> BodyTypeTuple;
+typedef std::tuple<pe::Sphere, pe::Plane, pe::Ellipsoid> BodyTypeTuple;
 
 /*!\brief TODO
  */
diff --git a/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp b/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
index c7ac8a324c6d82134bd1153e9e6cb284a7908801..e70fe7f8e89f00298930db57617612056feee2fb 100644
--- a/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/BodyAtBlockBoarderCheck.cpp
@@ -95,7 +95,7 @@ typedef pe_coupling::SimpleBB< LatticeModel_T, FlagField_T >  MO_T;
 using BoundaryConditions_T = boost::tuples::tuple<MO_T>;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/BodyMappingTest.cpp b/tests/pe_coupling/momentum_exchange_method/BodyMappingTest.cpp
index 695b8740056f5cc91835f302c2816a2c53b67441..59a224fe3fb1de87fad8b71c5f4f5c04d91d3cb2 100644
--- a/tests/pe_coupling/momentum_exchange_method/BodyMappingTest.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/BodyMappingTest.cpp
@@ -77,7 +77,7 @@ typedef pe_coupling::SimpleBB< LatticeModel_T, FlagField_T >  MO_T;
 typedef boost::tuples::tuple< NoSlip_T, MO_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp
index 0c717fb156cb1075a37813f778fad4d57d96d352..3d07ede20cb85170b3d6fb3550b8bef909c18941 100644
--- a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEM.cpp
@@ -95,7 +95,7 @@ typedef pe_coupling::CurvedQuadratic< LatticeModel_T, FlagField_T >  MO_MR_T;
 typedef boost::tuples::tuple< MO_BB_T, MO_CLI_T, MO_MR_T >               BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp
index 1f61e239cc5dd21566990d042aedc9573c14d214..ade3a8f05483ef4553125f1c1a91d08cea04f7fc 100644
--- a/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/DragForceSphereMEMRefinement.cpp
@@ -103,7 +103,7 @@ typedef pe_coupling::CurvedLinear   < LatticeModel_T, FlagField_T > MO_CLI_T;
 typedef boost::tuples::tuple< MO_BB_T, MO_CLI_T >                        BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
index b494339bbeaa0c1c8c7af8e0e3185a741d5b70ea..a2b9a31056d80ef08eff3fa157d917a380f988c4 100644
--- a/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/GlobalBodyAsBoundaryMEMStaticRefinement.cpp
@@ -95,7 +95,7 @@ typedef pe_coupling::SimpleBB< LatticeModel_T, FlagField_T > MO_SBB_T;
 using BoundaryConditions_T = boost::tuples::tuple<MO_SBB_T>;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Plane>;
+using BodyTypeTuple = std::tuple<pe::Plane>;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp b/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
index f1b545ec0a58507829da881819909f000bf37467..db7d357fa7fe853213a3f21ac2d320ae2ba15a30 100644
--- a/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/LubricationCorrectionMEM.cpp
@@ -99,7 +99,7 @@ typedef boost::tuples::tuple< FreeSlip_T, MO_T > BoundaryConditions_T;
 
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple<pe::Sphere, pe::Plane> BodyTypeTuple ;
+typedef std::tuple<pe::Sphere, pe::Plane> BodyTypeTuple ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp b/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
index 678aa5822d5525967d045d2065f0e54aff873d2f..b130bb7d08f8abf6f26897b3928fd0f4a585894e 100644
--- a/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/PeriodicParticleChannelMEM.cpp
@@ -100,7 +100,7 @@ typedef pe_coupling::SimpleBB< LatticeModel_T, FlagField_T > MO_T;
 typedef boost::tuples::tuple< NoSlip_T, UBB_T, MO_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp b/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
index ca31d93920e212d15884fc0c77a152f55805fbfb..c074a75ee96925e4e083539e126b53f6c0b007d5 100644
--- a/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SegreSilberbergMEM.cpp
@@ -102,7 +102,7 @@ typedef pe_coupling::CurvedQuadratic< LatticeModel_T, FlagField_T >  MO_MR_T;
 typedef boost::tuples::tuple< NoSlip_T, MO_BB_T, MO_CLI_T, MO_MR_T >     BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
index 482bc1883b9335798770053d4d4e6889d1849779..c1cc240d498ce6e3ed28d15646107043af8604ad 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEM.cpp
@@ -98,7 +98,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_T;
 typedef boost::tuples::tuple< NoSlip_T, MO_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
index c7be4552827c666ede71acc30871042f2ae71cba..a8888df59ef3253447242070939982078bd70cef 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMDynamicRefinement.cpp
@@ -104,7 +104,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_T;
 typedef boost::tuples::tuple< NoSlip_T, MO_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
index f0863496bfc2b1a6c311447e1661de8e37cd1cd2..9e1407c26709a32c455559c12b45bc645a866226 100644
--- a/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SettlingSphereMEMStaticRefinement.cpp
@@ -100,7 +100,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_T;
 typedef boost::tuples::tuple< NoSlip_T, MO_T > BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp b/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
index 1d3bab503558cede6f0d84773ec7b717869157c2..0c8a6ccac228d5ce94d4d9fff0eff338bd5432fc 100644
--- a/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/SquirmerTest.cpp
@@ -97,7 +97,7 @@ typedef pe_coupling::SimpleBB<LatticeModel_T, FlagField_T> MO_BB_T;
 using BoundaryConditions_T = boost::tuples::tuple<MO_BB_T>;
 typedef BoundaryHandling<FlagField_T, Stencil_T, BoundaryConditions_T> BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Squirmer>;
+using BodyTypeTuple = std::tuple<pe::Squirmer>;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp b/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
index b654d5dfaacbad39af9e10ebd3e5d803b9c44d33..7f6e659236f8b76053af10a1ea419677c2a96b2f 100644
--- a/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/TaylorCouetteFlowMEM.cpp
@@ -89,7 +89,7 @@ typedef pe_coupling::CurvedLinear< LatticeModel_T, FlagField_T > MO_T;
 using BoundaryConditions_T = boost::tuples::tuple<MO_T>;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Capsule, pe::CylindricalBoundary > BodyTypeTuple;
+typedef std::tuple< pe::Capsule, pe::CylindricalBoundary > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp b/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp
index dd90350c7e9ed3075fafc438896c09a816492902..c76d112cd9020919f8f95b195c5d19146866c349 100644
--- a/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp
+++ b/tests/pe_coupling/momentum_exchange_method/TorqueSphereMEM.cpp
@@ -95,7 +95,7 @@ typedef pe_coupling::CurvedQuadratic< LatticeModel_T, FlagField_T >  MO_MR_T;
 typedef boost::tuples::tuple< MO_BB_T, MO_CLI_T, MO_MR_T >               BoundaryConditions_T;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp
index 1fadccab92c4c6c88aea97fe1bc902738e968459..969b81d6274883096db4df87531957f7b86f9d01 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSM.cpp
@@ -87,7 +87,7 @@ using FlagField_T = FlagField<flag_t>;
 typedef std::pair< pe::BodyID, real_t >                              BodyAndVolumeFraction_T;
 typedef GhostLayerField< std::vector< BodyAndVolumeFraction_T >, 1 > BodyAndVolumeFractionField_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp
index bb890e698f560b4d5b6a7c1445c7ed1b45ce5dc2..092c0ea36edee47a9ec298c80c638f3a44e93694 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/DragForceSpherePSMRefinement.cpp
@@ -102,7 +102,7 @@ typedef lbm::NoSlip< LatticeModel_T, flag_t > NoSlip_T;
 using BoundaryConditions_T = boost::tuples::tuple<NoSlip_T>;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
index 935a0c1d51ef9dfbc175772cb1a7540e617dcaf1..deb8f68963cca2bfa801bfa69e7456cf9aec3f16 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/SegreSilberbergPSM.cpp
@@ -100,7 +100,7 @@ typedef lbm::NoSlip< LatticeModel_T, flag_t > NoSlip_T;
 using BoundaryConditions_T = boost::tuples::tuple<NoSlip_T>;
 typedef BoundaryHandling< FlagField_T, Stencil_T, BoundaryConditions_T > BoundaryHandling_T;
 
-typedef boost::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
+typedef std::tuple< pe::Sphere, pe::Plane > BodyTypeTuple;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp b/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp
index c63f974e827b1b847716ee05c76a9590c6c89186..60a0e97be6fedc0da74921190a3b2f1330f73a9f 100644
--- a/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp
+++ b/tests/pe_coupling/partially_saturated_cells_method/TorqueSpherePSM.cpp
@@ -86,7 +86,7 @@ using FlagField_T = FlagField<flag_t>;
 typedef std::pair< pe::BodyID, real_t >                              BodyAndVolumeFraction_T;
 typedef GhostLayerField< std::vector< BodyAndVolumeFraction_T >, 1 > BodyAndVolumeFractionField_T;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 ///////////
 // FLAGS //
diff --git a/tests/pe_coupling/utility/BodiesForceTorqueContainerTest.cpp b/tests/pe_coupling/utility/BodiesForceTorqueContainerTest.cpp
index dcb3382e6be657496dea0ae4651e165ea643fc61..528bd5e54f82d2cac99f5b28423c9694f54b3705 100644
--- a/tests/pe_coupling/utility/BodiesForceTorqueContainerTest.cpp
+++ b/tests/pe_coupling/utility/BodiesForceTorqueContainerTest.cpp
@@ -40,7 +40,7 @@ namespace force_torque_container_test
 
 using namespace walberla;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 
 /*!\brief Test cases for the force torque container provided by the coupling module
diff --git a/tests/pe_coupling/utility/PeSubCyclingTest.cpp b/tests/pe_coupling/utility/PeSubCyclingTest.cpp
index ac538eaf4685d93a08d5381ba0d42a8cdd08473f..4e6a9f9c621a9e9512be8ab7d77b6b3522ce4285 100644
--- a/tests/pe_coupling/utility/PeSubCyclingTest.cpp
+++ b/tests/pe_coupling/utility/PeSubCyclingTest.cpp
@@ -41,7 +41,7 @@ namespace pe_sub_cycling_test
 
 using namespace walberla;
 
-using BodyTypeTuple = boost::tuple<pe::Sphere> ;
+using BodyTypeTuple = std::tuple<pe::Sphere> ;
 
 /*!\brief test case to check functionality of sub cycling in the pe time step provided by the coupling module
  *