From acc8a6ca2d7e81bf309189e702023e7042231bd8 Mon Sep 17 00:00:00 2001
From: Sebastian Eibl <sebastian.eibl@fau.de>
Date: Wed, 27 Mar 2019 16:33:47 +0100
Subject: [PATCH] replace boost::tuple with std::tuple in pe

---
 .../AMRSedimentSettling.cpp                   |  2 +-
 .../WorkloadEvaluation.cpp                    |  2 +-
 apps/benchmarks/DEM/DEM.cpp                   |  3 +-
 .../ForcesOnSphereNearPlaneInShearFlow.cpp    |  2 +-
 .../MotionSingleHeavySphere.cpp               |  2 +-
 .../PeriodicGranularGas.cpp                   |  7 ++-
 .../BidisperseFluidizedBedDPM.cpp             |  2 +-
 apps/tutorials/pe/01_ConfinedGas.cpp          |  4 +-
 apps/tutorials/pe/02_ConfinedGasExtended.cpp  |  3 +-
 src/mesh/pe/rigid_body/ConvexPolyhedron.h     |  2 +-
 src/pe/communication/DynamicMarshalling.h     |  2 +-
 src/pe/fcd/AnalyticCollisionDetection.h       |  2 +-
 src/pe/fcd/GJKEPACollideFunctor.h             |  2 +-
 src/pe/fcd/SimpleFCD.h                        |  3 +-
 src/pe/pe_module.dox                          |  2 +-
 src/pe/raytracing/Intersects.h                |  2 +-
 src/pe/rigidbody/Box.h                        |  2 +-
 src/pe/rigidbody/Capsule.h                    |  2 +-
 src/pe/rigidbody/CylindricalBoundary.h        |  2 +-
 src/pe/rigidbody/Ellipsoid.h                  |  2 +-
 src/pe/rigidbody/Plane.h                      |  2 +-
 src/pe/rigidbody/SetBodyTypeIDs.h             | 23 ++++---
 src/pe/rigidbody/Sphere.h                     |  2 +-
 src/pe/rigidbody/Squirmer.h                   |  2 +-
 src/pe/rigidbody/Union.h                      |  4 +-
 src/pe/rigidbody/UnionFactory.h               |  8 +--
 src/pe/utility/BodyCast.h                     | 63 ++++++++++---------
 src/pe/vtk/SphereVtkOutput.cpp                | 16 ++---
 tests/mesh/MeshMarshalling.cpp                |  7 ++-
 tests/mesh/PeVTKMeshWriterTest.cpp            |  3 +-
 tests/pe/BodyFlags.cpp                        |  6 +-
 tests/pe/BodyIterators.cpp                    |  2 +-
 tests/pe/Callback.cpp                         |  2 +-
 tests/pe/Collision.cpp                        |  4 +-
 tests/pe/CollisionTobiasGJK.cpp               | 10 +--
 tests/pe/CreateWorld.cpp                      |  2 +-
 tests/pe/DeleteBody.cpp                       |  2 +-
 tests/pe/DestroyBody.cpp                      |  2 +-
 tests/pe/DynamicRefinement.cpp                |  2 +-
 tests/pe/ForceSync.cpp                        |  4 +-
 tests/pe/HCSITS.cpp                           |  2 +-
 tests/pe/HashGrids.cpp                        |  2 +-
 tests/pe/LoadFromConfig.cpp                   |  2 +-
 tests/pe/Marshalling.cpp                      |  6 +-
 tests/pe/MinMaxRefinement.cpp                 |  4 +-
 tests/pe/ParallelEquivalence.cpp              |  4 +-
 tests/pe/PeDocumentationSnippets.cpp          |  6 +-
 tests/pe/Raytracing.cpp                       |  2 +-
 tests/pe/Refinement.cpp                       |  4 +-
 tests/pe/RefinementWithSpareProcesses.cpp     |  4 +-
 tests/pe/SerializeDeserialize.cpp             |  4 +-
 tests/pe/SetBodyTypeIDs.cpp                   | 10 +--
 tests/pe/ShadowCopy.cpp                       |  6 +-
 tests/pe/SimpleCCD.cpp                        |  2 +-
 tests/pe/SyncEquivalence.cpp                  |  2 +-
 tests/pe/Synchronization.cpp                  |  4 +-
 tests/pe/SynchronizationDelete.cpp            |  4 +-
 tests/pe/SynchronizationLargeBody.cpp         |  4 +-
 tests/pe/Union.cpp                            |  8 +--
 .../HinderedSettlingDynamicsDPM.cpp           |  2 +-
 .../SphereWallCollisionBehaviorDPM.cpp        |  2 +-
 .../geometry/PeIntersectionRatioTest.cpp      |  2 +-
 .../BodyAtBlockBoarderCheck.cpp               |  2 +-
 .../BodyMappingTest.cpp                       |  2 +-
 .../DragForceSphereMEM.cpp                    |  2 +-
 .../DragForceSphereMEMRefinement.cpp          |  2 +-
 ...lobalBodyAsBoundaryMEMStaticRefinement.cpp |  2 +-
 .../LubricationCorrectionMEM.cpp              |  2 +-
 .../PeriodicParticleChannelMEM.cpp            |  2 +-
 .../SegreSilberbergMEM.cpp                    |  2 +-
 .../SettlingSphereMEM.cpp                     |  2 +-
 .../SettlingSphereMEMDynamicRefinement.cpp    |  2 +-
 .../SettlingSphereMEMStaticRefinement.cpp     |  2 +-
 .../momentum_exchange_method/SquirmerTest.cpp |  2 +-
 .../TaylorCouetteFlowMEM.cpp                  |  2 +-
 .../TorqueSphereMEM.cpp                       |  2 +-
 .../DragForceSpherePSM.cpp                    |  2 +-
 .../DragForceSpherePSMRefinement.cpp          |  2 +-
 .../SegreSilberbergPSM.cpp                    |  2 +-
 .../TorqueSpherePSM.cpp                       |  2 +-
 .../BodiesForceTorqueContainerTest.cpp        |  2 +-
 .../pe_coupling/utility/PeSubCyclingTest.cpp  |  2 +-
 82 files changed, 178 insertions(+), 164 deletions(-)

diff --git a/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/AMRSedimentSettling.cpp b/apps/benchmarks/AdaptiveMeshRefinementFluidParticleCoupling/AMRSedimentSettling.cpp
index 4a8af6662..42cbcd961 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 0a4fef688..45b2d82e3 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 fb9de4611..d3a0decf7 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 de8dd9d31..52e9bf90a 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 fb355ddde..e7743f795 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 190b13e0d..1dfc02fd2 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 )
 {
@@ -164,11 +165,11 @@ int main( int argc, char ** argv )
    std::function<void(void)> syncCallWithoutTT;
    if (bNN)
    {
-      syncCallWithoutTT = std::bind( pe::syncNextNeighbors<BodyTuple>, boost::ref(*forest), storageID, &tt, real_c(0.1), false );
+      syncCallWithoutTT = std::bind( pe::syncNextNeighbors<BodyTuple>, std::ref(*forest), storageID, &tt, real_c(0.1), false );
       WALBERLA_LOG_INFO_ON_ROOT("Using NextNeighbor sync!");
    } else if (bSO)
    {
-      syncCallWithoutTT = std::bind( pe::syncShadowOwners<BodyTuple>, boost::ref(*forest), storageID, &tt, real_c(0.1), false );
+      syncCallWithoutTT = std::bind( pe::syncShadowOwners<BodyTuple>, std::ref(*forest), storageID, &tt, real_c(0.1), false );
       WALBERLA_LOG_INFO_ON_ROOT("Using ShadowOwner sync!");
    } else
    {
diff --git a/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp b/apps/showcases/BidisperseFluidizedBed/BidisperseFluidizedBedDPM.cpp
index c2f3e7a12..34cb30ae1 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 04728547d..6e0d1f7ab 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 2ada23757..b39cf5f3e 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 46e95afbd..48f7c8ff1 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 032708bff..7786dd4b1 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 2bf9513ba..0287f6d8d 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 051d5bcbc..c163ce145 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 ba5e45316..e61d39edd 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 0982c2dbb..58923b0b4 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 836ee8dc6..eea0f9719 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 cd6ab8662..5da39e784 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 ce6bb8cbe..c2d4c6b46 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 5d9b4c9d5..c56582c20 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 e723bc1b9..573d77348 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 996edb3e8..589d11038 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 a7a7996d7..a64c627c0 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 d062e616c..8efc9bcae 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 3dc76acad..5dcf205c4 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 fe6e0ce94..02ce734c1 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 eeff2ffe8..d4b4b98b8 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 93c14befb..2c5456f54 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 7ae03c088..2e68ed497 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 1ba1fcc21..8b9222a2b 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 e0a980387..04d44473b 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 dac328391..fa6db7e1c 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 e53b44a6a..ecfd52647 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 220c02602..ebcbb2cc3 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 e73d9ac35..e6d528d5a 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 c6915d86d..fb93470af 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 04937a603..08517239d 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 ea6adfbfc..b6729855a 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 b2deb57fa..0ca41dac6 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 454e915a6..40c0a1b6b 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 d19422354..f1e9f2e26 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 5b8deb155..dc33533eb 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 7d83456a0..8e1b2044f 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 1e22cd6fc..9a81900a7 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 8eaa11069..ed1fdce61 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 364005645..782d3235a 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 a8fd5bffe..c5e2d2a8e 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 e5067ab10..aed806bf5 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 e8f0f505a..25e925b8a 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 361cc322e..943526d15 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 9a6b93462..e4f1d4c80 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 4a6267aa7..4596f0005 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 6cc599994..72dc3af90 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 bf3f39c92..ff5ff3940 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 b1388dab5..3d0d5bc7e 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 f15dcd4c7..d17e2f0f1 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 646e6d239..3693e9ab8 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 6b649c298..1d9c48b2e 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 3846a2b55..28fdc39d1 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 91db8412e..ce0ea5e96 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 f3dc7905e..512f650d9 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 f40e6156d..f1ae8d8c0 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 1ad423385..496f7db51 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 c7ac8a324..e70fe7f8e 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 695b87400..59a224fe3 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 0c717fb15..3d07ede20 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 1f61e239c..ade3a8f05 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 b494339bb..a2b9a3105 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 f1b545ec0..db7d357fa 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 678aa5822..b130bb7d0 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 ca31d9392..c074a75ee 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 482bc1883..c1cc240d4 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 c7be45528..a8888df59 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 f0863496b..9e1407c26 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 1d3bab503..0c8a6ccac 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 b654d5dfa..7f6e65923 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 dd90350c7..c76d112cd 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 1fadccab9..969b81d62 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 bb890e698..092c0ea36 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 935a0c1d5..deb8f6896 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 c63f974e8..60a0e97be 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 bf84cbe06..11305884e 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 54268c111..0afcd7c9f 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
  *
-- 
GitLab