From c183c5cb299a4f820157ec0b37c1987b9917c803 Mon Sep 17 00:00:00 2001
From: Sebastian Eibl <sebastian.eibl@fau.de>
Date: Thu, 23 Mar 2017 16:28:52 +0100
Subject: [PATCH] reworked documentation & introduction of module page pe

---
 doc/Mainpage.dox                              |   7 +-
 src/core/math/MatrixMxN.h                     |   4 -
 src/core/math/Quaternion.h                    |   4 -
 src/core/math/RotationMatrix.h                |   4 -
 src/pe/BlockFunctions.h                       |   1 -
 src/pe/Config.h                               |   3 -
 src/pe/Materials.cpp                          |   5 -
 src/pe/Materials.h                            |  31 ----
 src/pe/Thresholds.h                           |   5 -
 src/pe/Types.h                                |   2 -
 src/pe/attachable/Attachable.cpp              |   2 -
 src/pe/attachable/Attachable.h                |   2 -
 src/pe/attachable/AttachableCast.h            |   1 -
 src/pe/attachable/AttachableStorage.h         |   2 -
 src/pe/basic.h                                |   1 -
 src/pe/bg/IBG.h                               |   1 -
 src/pe/bg/SimpleBG.h                          |   1 -
 src/pe/bg/SimpleBGDataHandling.h              |   1 -
 src/pe/ccd/CCDDataHandling.h                  |   1 -
 src/pe/ccd/HashGrids.cpp                      |   9 --
 src/pe/ccd/HashGrids.h                        |   2 -
 src/pe/ccd/HashGridsBodyTrait.h               |   2 -
 src/pe/ccd/HashGridsDataHandling.h            |   1 -
 src/pe/ccd/ICCD.h                             |   1 -
 src/pe/ccd/SimpleCCD.cpp                      |   1 -
 src/pe/ccd/SimpleCCD.h                        |   1 -
 src/pe/ccd/SimpleCCDDataHandling.h            |   1 -
 src/pe/collision/Collide.h                    |   4 -
 src/pe/communication/DynamicMarshalling.h     |   1 -
 src/pe/communication/Instantiate.h            |   1 -
 src/pe/communication/Marshalling.cpp          |   1 -
 src/pe/communication/Marshalling.h            |   1 -
 src/pe/communication/NotificationType.h       |   1 -
 src/pe/communication/PackNotification.h       |   1 -
 src/pe/communication/ParseMessage.h           |   1 -
 .../communication/RigidBodyCopyNotification.h |   2 -
 .../RigidBodyDeletionNotification.h           |   2 -
 .../RigidBodyForceNotification.h              |   2 -
 .../RigidBodyMigrationNotification.h          |   2 -
 .../RigidBodyNewShadowCopyNotification.h      |   2 -
 .../RigidBodyRemoteMigrationNotification.h    |   2 -
 .../RigidBodyRemovalInformationNotification.h |   2 -
 .../RigidBodyRemovalNotification.h            |   2 -
 .../RigidBodyUpdateNotification.h             |   2 -
 .../RigidBodyVelocityCorrectionNotification.h |   2 -
 .../RigidBodyVelocityUpdateNotification.h     |   2 -
 src/pe/communication/rigidbody/Box.cpp        |   1 -
 src/pe/communication/rigidbody/Box.h          |   1 -
 src/pe/communication/rigidbody/Capsule.cpp    |   1 -
 src/pe/communication/rigidbody/Capsule.h      |   1 -
 src/pe/communication/rigidbody/Sphere.cpp     |   1 -
 src/pe/communication/rigidbody/Sphere.h       |   1 -
 src/pe/communication/rigidbody/Union.h        |   1 -
 src/pe/contact/Contact.cpp                    |   1 -
 src/pe/contact/Contact.h                      |   7 -
 src/pe/contact/ContactFunctions.h             |   1 -
 src/pe/contact/ContactFunctions.impl.h        |   1 -
 src/pe/cr/DEM.cpp                             |   1 -
 src/pe/cr/DEM.h                               |   4 +-
 src/pe/cr/HCSITS.h                            |  10 +-
 src/pe/cr/HCSITS.impl.h                       |   1 -
 src/pe/cr/HCSITSBodyTrait.h                   |   1 -
 src/pe/cr/ICR.h                               |   1 -
 src/pe/cr/PlainIntegrator.cpp                 |   1 -
 src/pe/cr/PlainIntegrator.h                   |   1 -
 src/pe/debug/BodyData.h                       |   1 -
 src/pe/fcd/IFCD.h                             |   1 -
 src/pe/fcd/SimpleFCD.h                        |   1 -
 src/pe/fcd/SimpleFCDDataHandling.h            |   1 -
 src/pe/pe_module.dox                          |  78 ++++++++++
 src/pe/rigidbody/BodyIterators.h              |   1 -
 src/pe/rigidbody/BodyStorage.h                |   2 -
 src/pe/rigidbody/Box.cpp                      |   3 -
 src/pe/rigidbody/Box.h                        |   5 +-
 src/pe/rigidbody/BoxFactory.h                 |  18 +--
 src/pe/rigidbody/Capsule.cpp                  |   3 -
 src/pe/rigidbody/Capsule.h                    |   8 +-
 src/pe/rigidbody/CapsuleFactory.h             |   9 +-
 src/pe/rigidbody/GeomPrimitive.cpp            |   1 -
 src/pe/rigidbody/GeomPrimitive.h              |   2 -
 src/pe/rigidbody/MPIRigidBodyTrait.h          |   2 -
 src/pe/rigidbody/Node.h                       |   2 -
 src/pe/rigidbody/Owner.h                      |   1 -
 src/pe/rigidbody/Plane.cpp                    |   3 -
 src/pe/rigidbody/Plane.h                      |   6 +-
 src/pe/rigidbody/PlaneFactory.h               |  16 +--
 src/pe/rigidbody/RigidBody.cpp                |   3 -
 src/pe/rigidbody/RigidBody.h                  |   4 +-
 src/pe/rigidbody/SetBodyTypeIDs.h             |  17 ++-
 src/pe/rigidbody/Sphere.cpp                   |   3 -
 src/pe/rigidbody/Sphere.h                     |   6 +-
 src/pe/rigidbody/SphereFactory.h              |  19 +--
 src/pe/rigidbody/StorageDataHandling.h        |   1 -
 src/pe/rigidbody/Union.h                      |   8 +-
 src/pe/rigidbody/UnionFactory.h               |  74 ++++++++--
 src/pe/synchronization/RemoveAndNotify.h      |   1 -
 src/pe/utility/Distance.h                     |   9 +-
 tests/pe/BodyFlags.cpp                        |   1 -
 tests/pe/BodyIterators.cpp                    |   1 -
 tests/pe/BodyStorage.cpp                      |   1 -
 tests/pe/CMakeLists.txt                       |   3 +
 tests/pe/CheckVitalParameters.cpp             |   1 -
 tests/pe/CheckVitalParameters.h               |   1 -
 tests/pe/Collision.cpp                        |   1 -
 tests/pe/DeleteBody.cpp                       |   1 -
 tests/pe/DestroyBody.cpp                      |   1 -
 tests/pe/ForceSync.cpp                        |   1 -
 tests/pe/GJK_EPA.cpp                          |   1 -
 tests/pe/HCSITS.cpp                           |   1 -
 tests/pe/HashGrids.cpp                        |   1 -
 tests/pe/Marshalling.cpp                      |   1 -
 tests/pe/Material.cpp                         |   1 -
 tests/pe/Overlap.cpp                          |   1 -
 tests/pe/ParallelEquivalence.cpp              |   1 -
 tests/pe/ParseMessage.cpp                     |   1 -
 tests/pe/PeDocumentationSnippets.cpp          | 136 ++++++++++++++++++
 tests/pe/Refinement.cpp                       |   1 -
 tests/pe/RigidBody.cpp                        |   1 -
 tests/pe/SerializeDeserialize.cpp             |   1 -
 tests/pe/SetBodyTypeIDs.cpp                   |   1 -
 tests/pe/ShadowCopy.cpp                       |   1 -
 tests/pe/SimpleCCD.cpp                        |   1 -
 tests/pe/SyncEquivalence.cpp                  |   1 -
 tests/pe/Synchronization.cpp                  |   1 -
 tests/pe/SynchronizationDelete.cpp            |   1 -
 tests/pe/SynchronizationLargeBody.cpp         |   1 -
 tests/pe/Union.cpp                            |   1 -
 127 files changed, 352 insertions(+), 290 deletions(-)
 create mode 100644 src/pe/pe_module.dox
 create mode 100644 tests/pe/PeDocumentationSnippets.cpp

diff --git a/doc/Mainpage.dox b/doc/Mainpage.dox
index 29e5aa72b..b31a3a182 100644
--- a/doc/Mainpage.dox
+++ b/doc/Mainpage.dox
@@ -34,6 +34,11 @@ all the basic data strcutures and concepts of the framework.
 - \ref tutorial_lbm01 \n
   A full LBM simulation is built.
 
+\section TechDetails Technical Details
+
+- \ref TechDetailsPe \n
+  Technical Details about the pe physics module.
+   
 \section cite Please cite us
 
 If you use waLBerla in the preparation of a publication, please cite
@@ -43,7 +48,7 @@ which you should cite in addition if you use them.
 - Grid refinement: \cite schornbaum2016massively
 - PE coupling: \cite rettinger2016simulations, \cite rettinger2017comparative
 - Python interface: \cite bauer2015python
-   
+
 \htmlonly
 <!--
 <div>
diff --git a/src/core/math/MatrixMxN.h b/src/core/math/MatrixMxN.h
index a908a0787..b3d9faceb 100644
--- a/src/core/math/MatrixMxN.h
+++ b/src/core/math/MatrixMxN.h
@@ -50,11 +50,7 @@ namespace math {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\defgroup dense_matrix_MxN MatrixMxN
- * \ingroup core
- */
 /*!\brief Efficient implementation of a \f$ M \times N \f$ matrix.
- * \ingroup core
  *
  * The MatrixMxN class is the representation of a dynamic \f$ M \times N \f$ matrix with a total
  * of \f$ M \cdot N \f$ dynamically allocated elements. These elements can be directly accessed
diff --git a/src/core/math/Quaternion.h b/src/core/math/Quaternion.h
index b7b71b453..098c8325b 100644
--- a/src/core/math/Quaternion.h
+++ b/src/core/math/Quaternion.h
@@ -68,11 +68,7 @@ template< typename Type >       class Vector3;
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\defgroup quaternion Quaternion
- * \ingroup math
- */
 /*!\brief Efficient implementation of a quaternion.
- * \ingroup quaternion
  *
  * Quaternions are a superior way to deal with rotations and orientations. This quaternion
  * consists of 4 statically allocated elements, where the first element represents the real
diff --git a/src/core/math/RotationMatrix.h b/src/core/math/RotationMatrix.h
index 0a398e6aa..7bb34ac51 100644
--- a/src/core/math/RotationMatrix.h
+++ b/src/core/math/RotationMatrix.h
@@ -106,11 +106,7 @@ enum EulerRotation {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\defgroup dense_rotation_matrix RotationMatrix
- * \ingroup math
- */
 /*!\brief Efficient, generic implementation of a 3x3 rotation matrix.
- * \ingroup math
  *
  * The RotationMatrix class is the representation of a 3x3 rotation matrix with a total of 9
  * statically allocated elements of arbitrary type. The naming convention of the elements is
diff --git a/src/pe/BlockFunctions.h b/src/pe/BlockFunctions.h
index e90725b3e..c1e8e466d 100644
--- a/src/pe/BlockFunctions.h
+++ b/src/pe/BlockFunctions.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BlockFunctions.h
-//! \ingroup blockforest
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/Config.h b/src/pe/Config.h
index 56e069559..93fde81a7 100644
--- a/src/pe/Config.h
+++ b/src/pe/Config.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Config.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -35,7 +34,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Sleep mode threshold value.
- * \ingroup config
  *
  * This value specifies the threshold value for the sleep mode of a rigid body. In case the
  * motion of a rigid body drops below this threshold, the body is put to sleep and is not moved
@@ -52,7 +50,6 @@ const real_t sleepThreshold = real_c( 0 );
 
 //*************************************************************************************************
 /*!\brief Recency-weighted average bias value for the sleep mode \f$ [0..1] \f$.
- * \ingroup config
  *
  * The motion of a rigid body is calculated by a recency-weighted average. This value specifies
  * the bias value for the calculation. It controls how much significance is given to previous
diff --git a/src/pe/Materials.cpp b/src/pe/Materials.cpp
index 8d7e35e71..ef789831e 100644
--- a/src/pe/Materials.cpp
+++ b/src/pe/Materials.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Materials.cpp
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for materials
@@ -119,7 +118,6 @@ bool Material::activateMaterials()
 
 //*************************************************************************************************
 /*!\brief Creating a new custom material.
- * \ingroup materials
  *
  * \param name The name of the custom material.
  * \param density The density of the custom material \f$ (0..\infty) \f$.
@@ -235,7 +233,6 @@ MaterialID createMaterial( const std::string& name, real_t density, real_t cor,
 
 //*************************************************************************************************
 /*!\brief Creating a new anonymous custom material.
-// \ingroup materials
 //
 // \param density The density of the custom material \f$ (0..\infty) \f$.
 // \param cor The coefficient of restitution of the custom material \f$ [0..1] \f$.
@@ -273,7 +270,6 @@ MaterialID createMaterial( real_t density, real_t cor, real_t csf, real_t cdf, r
 
 //*************************************************************************************************
 /*!\brief Searching for a registered material.
- * \ingroup materials
  *
  * \param name The name of the material.
  * \return The MaterialID of the material if the material is found, \a invalid_material otherwise.
@@ -295,7 +291,6 @@ MaterialID Material::find( const std::string& name )
 
 //*************************************************************************************************
 /*!\brief Searching for registered materials with a prefix.
-// \ingroup materials
 //
 // \param prefix The prefix common to the names of the materials.
 // \return A std::vector object containing the MaterialIDs of all materials found.
diff --git a/src/pe/Materials.h b/src/pe/Materials.h
index 01f9da609..355099c08 100644
--- a/src/pe/Materials.h
+++ b/src/pe/Materials.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Materials.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for materials
@@ -46,11 +45,7 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\defgroup materials Materials
- * \ingroup pe
- */
 /*!\brief Rigid body material.
- * \ingroup materials
  *
  * A material specifies the properties of a rigid body: the density of the body, the coefficient
  * of restitution and the coefficients of static and dynamic friction.\n
@@ -413,7 +408,6 @@ inline real_t Material::getDampingT() const
 
 //*************************************************************************************************
 /*!\brief Returns the name of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The name of the given material.
@@ -428,7 +422,6 @@ inline const std::string& Material::getName( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the density of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The density of the given material.
@@ -443,7 +436,6 @@ inline real_t Material::getDensity( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the coefficient of restitution of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The coefficient of restitution of the given material.
@@ -458,7 +450,6 @@ inline real_t Material::getRestitution( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the composite coefficient of restitution for a collision between two rigid bodies.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -475,7 +466,6 @@ inline real_t Material::getRestitution( MaterialID material1, MaterialID materia
 
 //*************************************************************************************************
 /*!\brief Returns the coefficient of static friction of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The coefficient of static friction of the given material.
@@ -490,7 +480,6 @@ inline real_t Material::getStaticFriction( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the coefficient of static friction for a collision between two rigid bodies.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -507,7 +496,6 @@ inline real_t Material::getStaticFriction( MaterialID material1, MaterialID mate
 
 //*************************************************************************************************
 /*!\brief Returns the coefficient of dynamic friction of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The coefficient of dynamic friction of the given material.
@@ -522,7 +510,6 @@ inline real_t Material::getDynamicFriction( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the coefficient of dynamic friction for a collision between two rigid bodies.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -539,7 +526,6 @@ inline real_t Material::getDynamicFriction( MaterialID material1, MaterialID mat
 
 //*************************************************************************************************
 /*!\brief Returns the Poisson's ratio of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The Poisson's ratio of the given material.
@@ -554,7 +540,6 @@ inline real_t Material::getPoissonRatio( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the Young's modulus of the given material.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The Young's modulus of the given material.
@@ -569,7 +554,6 @@ inline real_t Material::getYoungModulus( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the (effective) Young's modulus for a collision between two rigid bodies.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -603,7 +587,6 @@ inline real_t Material::getYoungModulus( MaterialID material1, MaterialID materi
 
 //*************************************************************************************************
 /*!\brief Returns the stiffness in normal direction of the material's contact region.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The stiffness in normal direction of the contact region of the given material.
@@ -618,7 +601,6 @@ inline real_t Material::getStiffness( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the stiffness in normal direction of the contact between two materials.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -641,7 +623,6 @@ inline real_t Material::getStiffness( MaterialID material1, MaterialID material2
 
 //*************************************************************************************************
 /*!\brief Returns the damping coefficient in normal direction of the material's contact region.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The damping in normal direction of the contact region of the given material.
@@ -656,7 +637,6 @@ inline real_t Material::getDampingN( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the damping in normal direction of the contact between two materials.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -679,7 +659,6 @@ inline real_t Material::getDampingN( MaterialID material1, MaterialID material2
 
 //*************************************************************************************************
 /*!\brief Returns the damping coefficient in tangential direction of the material's contact region.
- * \ingroup materials
  *
  * \param material The material to be queried.
  * \return The damping in tangential direction of the contact region of the given material.
@@ -694,7 +673,6 @@ inline real_t Material::getDampingT( MaterialID material )
 
 //*************************************************************************************************
 /*!\brief Returns the damping in tangential direction of the contact between two materials.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -717,7 +695,6 @@ inline real_t Material::getDampingT( MaterialID material1, MaterialID material2
 
 //*************************************************************************************************
 /*!\brief Setting the coefficient of restitution between material \a material1 and \a material2.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -735,7 +712,6 @@ inline void Material::setRestitution( MaterialID material1, MaterialID material2
 
 //*************************************************************************************************
 /*!\brief Setting the coefficient of static friction between material \a material1 and \a material2.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -753,7 +729,6 @@ inline void Material::setStaticFriction( MaterialID material1, MaterialID materi
 
 //*************************************************************************************************
 /*!\brief Setting the coefficient of dynamic friction between material \a material1 and \a material2.
- * \ingroup materials
  *
  * \param material1 The material of the first colliding rigid body.
  * \param material2 The material of the second colliding rigid body.
@@ -779,7 +754,6 @@ inline void Material::setDynamicFriction( MaterialID material1, MaterialID mater
 
 //*************************************************************************************************
 /*!\brief Specification of the material iron.
- * \ingroup materials
  *
  * The Iron class represents the material iron. It is implemented as a veneer class for the
  * Material base class to set the properties of iron:
@@ -841,7 +815,6 @@ inline Iron::Iron()
 
 //*************************************************************************************************
 /*!\brief Specification of the material copper.
- * \ingroup materials
  *
  * The Copper class represents the material copper. It is implemented as a veneer class for
  * the Material base class to set the properties of iron:
@@ -903,7 +876,6 @@ inline Copper::Copper()
 
 //*************************************************************************************************
 /*!\brief Specification of the material granite.
- * \ingroup materials
  *
  * The Granite class represents the material granite. It is implemented as a veneer class for
  * the Material base class to set the properties of granite:
@@ -965,7 +937,6 @@ inline Granite::Granite()
 
 //*************************************************************************************************
 /*!\brief Specification of the material oak.
- * \ingroup materials
  *
  * The Oak class represents the material oak wood. It is implemented as a veneer class for the
  * Material base class to set the properties of oak wood:
@@ -1027,7 +998,6 @@ inline Oak::Oak()
 
 //*************************************************************************************************
 /*!\brief Specification of the material fir.
- * \ingroup materials
  *
  * The Fir class represents the material fir wood. It is implemented as a veneer class for the
  * Material base class to set the properties of fir wood:
@@ -1090,7 +1060,6 @@ inline Fir::Fir()
 
 //*************************************************************************************************
 /*!\brief ID for an invalid material.
- * \ingroup materials
  *
  * This MaterialID is returned by the getMaterial() function in case no material with the
  * specified name is returned. This value should not be used to create rigid bodies or in
diff --git a/src/pe/Thresholds.h b/src/pe/Thresholds.h
index 8c7cee3e9..f0993be59 100644
--- a/src/pe/Thresholds.h
+++ b/src/pe/Thresholds.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Types.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Numerical thresholds for the physics engine
@@ -36,7 +35,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Collection of numerical threshold values.
- * \ingroup pe
  *
  * The Thresholds class defines numerical floating point thresholds for the pe module.
  * The following thresholds can be used:
@@ -83,7 +81,6 @@ struct Thresholds
 //*************************************************************************************************
 /*! \cond internal */
 /*!\brief Thresholds<float> specialization.
- * \ingroup pe
  */
 template<>
 struct Thresholds<float>
@@ -131,7 +128,6 @@ public:
 //*************************************************************************************************
 /*! \cond internal */
 /*!\brief Thresholds<double> specialization.
- * \ingroup pe
  */
 template<>
 struct Thresholds<double>
@@ -179,7 +175,6 @@ public:
 //*************************************************************************************************
 /*! \cond internal */
 /*!\brief Thresholds<long double> specialization.
- * \ingroup pe
  */
 template<>
 struct Thresholds<long double>
diff --git a/src/pe/Types.h b/src/pe/Types.h
index 8eb0d3560..15d386d54 100644
--- a/src/pe/Types.h
+++ b/src/pe/Types.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Types.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -167,7 +166,6 @@ typedef std::vector<Material>  Materials;          //!< Vector for materials.
 
 //*************************************************************************************************
 /*!\brief Unique material ID.
- * \ingroup pe
  *
  * Every registered material has a unique MaterialID that can be used wherever the material is
  * required. The \b pe engine provides a couple of predefined materials (see the \ref materials
diff --git a/src/pe/attachable/Attachable.cpp b/src/pe/attachable/Attachable.cpp
index 1b64085dc..76056d686 100644
--- a/src/pe/attachable/Attachable.cpp
+++ b/src/pe/attachable/Attachable.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Attachable.cpp
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for the Attachable class
@@ -101,7 +100,6 @@ Attachable::~Attachable()
 
 //*************************************************************************************************
 /*!\brief Detaches the given attachable.
- * \ingroup core
  *
  * \param attachable The detachable to be detached.
  */
diff --git a/src/pe/attachable/Attachable.h b/src/pe/attachable/Attachable.h
index 5d6c71952..9c7b2b368 100644
--- a/src/pe/attachable/Attachable.h
+++ b/src/pe/attachable/Attachable.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Attachable.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the Attachable class
@@ -47,7 +46,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Attachable interface class.
- * \ingroup core
  *
  * The Attachable class is the base class for the Attachable concept of the physics engine.
  * Classes deriving from this interface class (which are simply called Attachables) can be
diff --git a/src/pe/attachable/AttachableCast.h b/src/pe/attachable/AttachableCast.h
index a87d045f5..bace6db7f 100644
--- a/src/pe/attachable/AttachableCast.h
+++ b/src/pe/attachable/AttachableCast.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file AttachableCast.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
diff --git a/src/pe/attachable/AttachableStorage.h b/src/pe/attachable/AttachableStorage.h
index b2baaea51..009c3b087 100644
--- a/src/pe/attachable/AttachableStorage.h
+++ b/src/pe/attachable/AttachableStorage.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file AttachableStorage.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -47,7 +46,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Attachable storage of the rigid body simulation world.
- * \ingroup core
  *
  * The AttachableStorage class stores all currently existing attachables in the simulation world
  * (see class World).
diff --git a/src/pe/basic.h b/src/pe/basic.h
index 47b6345e6..874531d82 100644
--- a/src/pe/basic.h
+++ b/src/pe/basic.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file basic.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file which includes common pe headers!
 //
diff --git a/src/pe/bg/IBG.h b/src/pe/bg/IBG.h
index 844a470a1..8c956b567 100644
--- a/src/pe/bg/IBG.h
+++ b/src/pe/bg/IBG.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file IBG.h
-//! \ingroup BatchGeneration
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/bg/SimpleBG.h b/src/pe/bg/SimpleBG.h
index 80fbe6e1b..aa65b79d6 100644
--- a/src/pe/bg/SimpleBG.h
+++ b/src/pe/bg/SimpleBG.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SimpleBG.h
-//! \ingroup BatchGeneration
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/bg/SimpleBGDataHandling.h b/src/pe/bg/SimpleBGDataHandling.h
index 658011557..7b31e020b 100644
--- a/src/pe/bg/SimpleBGDataHandling.h
+++ b/src/pe/bg/SimpleBGDataHandling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SimpleBGDataHandling.h
-//! \ingroup FineCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/ccd/CCDDataHandling.h b/src/pe/ccd/CCDDataHandling.h
index 5d11be07d..f17c6f8d3 100644
--- a/src/pe/ccd/CCDDataHandling.h
+++ b/src/pe/ccd/CCDDataHandling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SimpleCCDDataHandling.h
-//! \ingroup FineCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/ccd/HashGrids.cpp b/src/pe/ccd/HashGrids.cpp
index 93a69bdc9..b135767f8 100644
--- a/src/pe/ccd/HashGrids.cpp
+++ b/src/pe/ccd/HashGrids.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file HashGrids.cpp
-//! \ingroup CoarseCollisionDetection
 //! \author Klaus Iglberger
 //! \author Florian Schornbaum
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
@@ -1149,7 +1148,6 @@ bool HashGrids::powerOfTwo( size_t number )
 
 //*************************************************************************************************
 /*!\brief The initial number of cells in x-direction of a newly created hash grid.
- * \ingroup config
  *
  * This value represents the initial number of cells of a newly created hash grid in x-direction.
  * The larger the value (i.e. the greater the number of cells of every newly created hash grid),
@@ -1167,7 +1165,6 @@ const size_t HashGrids::xCellCount = 16;
 
 //*************************************************************************************************
 /*!\brief The initial number of cells in y-direction of a newly created hash grid.
- * \ingroup config
  *
  * This value represents the initial number of cells of a newly created hash grid in y-direction.
  * The larger the value (i.e. the greater the number of cells of every newly created hash grid),
@@ -1185,7 +1182,6 @@ const size_t HashGrids::yCellCount = 16;
 
 //*************************************************************************************************
 /*!\brief The initial number of cells in z-direction of a newly created hash grid.
- * \ingroup config
  *
  * This value represents the initial number of cells of a newly created hash grid in z-direction.
  * The larger the value (i.e. the greater the number of cells of every newly created hash grid),
@@ -1203,7 +1199,6 @@ const size_t HashGrids::zCellCount = 16;
 
 //*************************************************************************************************
 /*!\brief The initial storage capaciy of a newly created grid cell body container.
- * \ingroup config
  *
  * This value specifies the initial storage capacity reserved for every grid cell body container,
  * i.e., the number of bodies that can initially be assigned to a grid cell with the need to
@@ -1220,7 +1215,6 @@ const size_t HashGrids::cellVectorSize = 16;
 
 //*************************************************************************************************
 /*!\brief The initial storage capacity of the grid-global vector.
- * \ingroup config
  *
  * This value specifies the initial storage capacity of the grid-global vector that keeps track
  * of all body-occupied cells. As long as at least one body is assigned to a certain cell, this
@@ -1234,7 +1228,6 @@ const size_t HashGrids::occupiedCellsVectorSize = 256;
 
 //*************************************************************************************************
 /*!\brief The minimal ratio of cells to bodies that must be maintained at any time.
- * \ingroup config
  *
  * This \a minimalGridDensity specifies the minimal ratio of cells to bodies that is allowed
  * before a grid grows.\n
@@ -1253,7 +1246,6 @@ const size_t HashGrids::minimalGridDensity = 8;
 
 //*************************************************************************************************
 /*!\brief Activation threshold for the hierarchical hash grids coarse collision detection algorithm.
- * \ingroup config
  *
  * If the simulation only consists of a very small number of bodies, simply checking each body
  * against each other body proves to be faster than involving the far more complex mechanisms
@@ -1272,7 +1264,6 @@ const size_t HashGrids::gridActivationThreshold = 32;
 
 //*************************************************************************************************
 /*!\brief The constant factor by which the cell size of any two successive grids differs.
- * \ingroup config
  *
  * This factor specifies the size difference of two successive grid levels of the hierarchical
  * hash grids. The grid hierarchy is constructed such that the cell size of any two successive
diff --git a/src/pe/ccd/HashGrids.h b/src/pe/ccd/HashGrids.h
index 85c172f08..442fabe37 100644
--- a/src/pe/ccd/HashGrids.h
+++ b/src/pe/ccd/HashGrids.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ICCD.h
-//! \ingroup CoarseCollisionDetection
 //! \author Klaus Iglberger
 //! \author Florian Schornbaum
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
@@ -57,7 +56,6 @@ namespace ccd {
 
 //*************************************************************************************************
 /*!\brief Implementation of the 'Hierarchical Hash Grids' coarse collision detection algorithm.
- * \ingroup coarse_collision_detection
  *
  * The 'Hierarchical Hash Grids' coarse collision detection algorithm is based on a spatial
  * partitioning scheme that uses a hierarchy of uniform, hash storage based grids. Uniform grids
diff --git a/src/pe/ccd/HashGridsBodyTrait.h b/src/pe/ccd/HashGridsBodyTrait.h
index 87be586c4..40ab2505e 100644
--- a/src/pe/ccd/HashGridsBodyTrait.h
+++ b/src/pe/ccd/HashGridsBodyTrait.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file HashGridsBodyTrait.h
-//! \ingroup CoarseCollisionDetection
 //! \author Klaus Iglberger
 //! \author Florian Schornbaum
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
@@ -37,7 +36,6 @@ namespace ccd {
 
 //*************************************************************************************************
 /*!\brief Specialization of the BodyTrait class template for the 'hierarchical hash-grid' algorithm.
- * \ingroup coarse_collision_detection
  *
  * This specialization of the BodyTrait class template adapts rigid bodies to the hierarchical hash-grid
  * coarse collision detection algorithm.
diff --git a/src/pe/ccd/HashGridsDataHandling.h b/src/pe/ccd/HashGridsDataHandling.h
index bead04555..38d1d1b4f 100644
--- a/src/pe/ccd/HashGridsDataHandling.h
+++ b/src/pe/ccd/HashGridsDataHandling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file HashGridsDataHandling.h
-//! \ingroup CoarseCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/ccd/ICCD.h b/src/pe/ccd/ICCD.h
index c4164b84c..cb4bf9759 100644
--- a/src/pe/ccd/ICCD.h
+++ b/src/pe/ccd/ICCD.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ICCD.h
-//! \ingroup CoarseCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/ccd/SimpleCCD.cpp b/src/pe/ccd/SimpleCCD.cpp
index b85b15dd4..b94a6669b 100644
--- a/src/pe/ccd/SimpleCCD.cpp
+++ b/src/pe/ccd/SimpleCCD.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ICCD.h
-//! \ingroup CoarseCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/ccd/SimpleCCD.h b/src/pe/ccd/SimpleCCD.h
index a548e109e..42a54f599 100644
--- a/src/pe/ccd/SimpleCCD.h
+++ b/src/pe/ccd/SimpleCCD.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ICCD.h
-//! \ingroup CoarseCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/ccd/SimpleCCDDataHandling.h b/src/pe/ccd/SimpleCCDDataHandling.h
index f21f1adc0..e6eba7709 100644
--- a/src/pe/ccd/SimpleCCDDataHandling.h
+++ b/src/pe/ccd/SimpleCCDDataHandling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SimpleCCDDataHandling.h
-//! \ingroup FineCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/collision/Collide.h b/src/pe/collision/Collide.h
index 2572faeaf..1baf317cc 100644
--- a/src/pe/collision/Collide.h
+++ b/src/pe/collision/Collide.h
@@ -50,7 +50,6 @@ struct DoubleDispatch;
 
 //*************************************************************************************************
 /*!\brief Contact generation between two colliding rigid bodies.
- * \ingroup contact_generation
  *
  * \param s1 The first colliding rigid body.
  * \param s2 The second colliding rigid body.
@@ -140,7 +139,6 @@ bool collide( PlaneID p, SphereID s, Container& container )
 
 //*************************************************************************************************
 /*!\brief Contact generation between a Sphere and a Box.
- * \ingroup contact_generation
  *
  * \param s The colliding sphere.
  * \param b The colliding box.
@@ -1708,7 +1706,6 @@ bool collide( PlaneID p, BoxID b, Container& container )
 
 
 /*!\brief Contact generation between two colliding Capsule primitives.
- * \ingroup contact_generation
  *
  * \param c1 The first colliding capsule.
  * \param c2 The second colliding capsule.
@@ -1822,7 +1819,6 @@ bool collide( CapsuleID c1, CapsuleID c2, Container& container )
 
 //*************************************************************************************************
 /*!\brief Contact generation between a Capsule and a Plane.
- * \ingroup contact_generation
  *
  * \param c The colliding capsule.
  * \param p The colliding plane.
diff --git a/src/pe/communication/DynamicMarshalling.h b/src/pe/communication/DynamicMarshalling.h
index 24246cbe1..121931250 100644
--- a/src/pe/communication/DynamicMarshalling.h
+++ b/src/pe/communication/DynamicMarshalling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Marshalling.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/Instantiate.h b/src/pe/communication/Instantiate.h
index 3190de2a2..6096c6552 100644
--- a/src/pe/communication/Instantiate.h
+++ b/src/pe/communication/Instantiate.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Instantiate.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/Marshalling.cpp b/src/pe/communication/Marshalling.cpp
index ca1530f1d..bdeb9fd9d 100644
--- a/src/pe/communication/Marshalling.cpp
+++ b/src/pe/communication/Marshalling.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Marshalling.cpp
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/Marshalling.h b/src/pe/communication/Marshalling.h
index 1fc935363..225ffaa4f 100644
--- a/src/pe/communication/Marshalling.h
+++ b/src/pe/communication/Marshalling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Marshalling.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/NotificationType.h b/src/pe/communication/NotificationType.h
index 5e6009fe4..6584537fa 100644
--- a/src/pe/communication/NotificationType.h
+++ b/src/pe/communication/NotificationType.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file NotificationType.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the notification types
diff --git a/src/pe/communication/PackNotification.h b/src/pe/communication/PackNotification.h
index 9a6dfeb98..550309e98 100644
--- a/src/pe/communication/PackNotification.h
+++ b/src/pe/communication/PackNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file PackNotification.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for packNotification
 //
diff --git a/src/pe/communication/ParseMessage.h b/src/pe/communication/ParseMessage.h
index ec0dd72da..5735beb15 100644
--- a/src/pe/communication/ParseMessage.h
+++ b/src/pe/communication/ParseMessage.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ParseMessage.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Parsing of messages
diff --git a/src/pe/communication/RigidBodyCopyNotification.h b/src/pe/communication/RigidBodyCopyNotification.h
index 57f2688d9..cfa726e7c 100644
--- a/src/pe/communication/RigidBodyCopyNotification.h
+++ b/src/pe/communication/RigidBodyCopyNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyCopyNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyCopyNotification class
@@ -48,7 +47,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body copies.
- * \ingroup rigid_body
  *
  * The RigidBodyCopyNotification class is a wrapper class for marshaling and unmarshaling rigid body
  * copies. When receiving a copy notification a new shadow copy of the encapsulated body should be
diff --git a/src/pe/communication/RigidBodyDeletionNotification.h b/src/pe/communication/RigidBodyDeletionNotification.h
index 498e1ef31..a8197b2a1 100644
--- a/src/pe/communication/RigidBodyDeletionNotification.h
+++ b/src/pe/communication/RigidBodyDeletionNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyDeletionNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyDeletionNotification class
@@ -43,7 +42,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body deletion notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyDeletionNotification class is a wrapper class for marshaling and unmarshaling rigid body
  * deletion notifications. When receiving a deletion notification this indicates that the body
diff --git a/src/pe/communication/RigidBodyForceNotification.h b/src/pe/communication/RigidBodyForceNotification.h
index 00e811fb4..5ce3e9d55 100644
--- a/src/pe/communication/RigidBodyForceNotification.h
+++ b/src/pe/communication/RigidBodyForceNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyForceNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyForceNotification class
@@ -43,7 +42,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body force and torque contribution notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyForceNotification class is a wrapper class for marshaling and unmarshaling rigid body
  * force and torque contribution notifications. They may only be sent by processes registered
diff --git a/src/pe/communication/RigidBodyMigrationNotification.h b/src/pe/communication/RigidBodyMigrationNotification.h
index c5988c44a..31c2e0882 100644
--- a/src/pe/communication/RigidBodyMigrationNotification.h
+++ b/src/pe/communication/RigidBodyMigrationNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyMigrationNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyMigrationNotification class
@@ -43,7 +42,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body migration notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyMigrationNotification class is a wrapper class for marshaling and unmarshaling
  * rigid body migration notifications. When receiving a migration notification this indicates that
diff --git a/src/pe/communication/RigidBodyNewShadowCopyNotification.h b/src/pe/communication/RigidBodyNewShadowCopyNotification.h
index 5c5cd3aa6..cf7f2d9b2 100644
--- a/src/pe/communication/RigidBodyNewShadowCopyNotification.h
+++ b/src/pe/communication/RigidBodyNewShadowCopyNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyNewShadowCopyNotification.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyNewShadowCopyNotification class
 //
@@ -42,7 +41,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body new shadow copy notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyNewShadowCopyNotification class is a wrapper class for marshaling and unmarshaling
  * of rigid body new shadow copy notifications. This notification is send to the owner of a rigid
diff --git a/src/pe/communication/RigidBodyRemoteMigrationNotification.h b/src/pe/communication/RigidBodyRemoteMigrationNotification.h
index 01fa7fd69..3dcd20a3c 100644
--- a/src/pe/communication/RigidBodyRemoteMigrationNotification.h
+++ b/src/pe/communication/RigidBodyRemoteMigrationNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyRemoteMigrationNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyRemoteMigrationNotification classs
@@ -43,7 +42,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body remote migration notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyRemoteMigrationNotification class is a wrapper class for marshaling and unmarshaling
  * rigid body remote migration notifications. When receiving a remote migration notification this
diff --git a/src/pe/communication/RigidBodyRemovalInformationNotification.h b/src/pe/communication/RigidBodyRemovalInformationNotification.h
index b0a6d2833..8b6d006af 100644
--- a/src/pe/communication/RigidBodyRemovalInformationNotification.h
+++ b/src/pe/communication/RigidBodyRemovalInformationNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyRemovalInformationNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyRemovalNotification class
@@ -43,7 +42,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body removal notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyRemovalInformationNotification class is used to signal other processes that a
  * shadow copy was destroyed.
diff --git a/src/pe/communication/RigidBodyRemovalNotification.h b/src/pe/communication/RigidBodyRemovalNotification.h
index 7d9f7fd4c..75a94dd71 100644
--- a/src/pe/communication/RigidBodyRemovalNotification.h
+++ b/src/pe/communication/RigidBodyRemovalNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyRemovalNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyRemovalNotification class
@@ -43,7 +42,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body removal notifications.
- * \ingroup rigid_body
  *
  * The RigidBodyRemovalNotification class is a wrapper class for marshaling and unmarshaling rigid body
  * removal notifications. When receiving a removal notification this indicates that a shadow copy
diff --git a/src/pe/communication/RigidBodyUpdateNotification.h b/src/pe/communication/RigidBodyUpdateNotification.h
index 9c09c50ce..b6f16ce67 100644
--- a/src/pe/communication/RigidBodyUpdateNotification.h
+++ b/src/pe/communication/RigidBodyUpdateNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyUpdateNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyUpdateNotification class
@@ -44,7 +43,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body updates.
- * \ingroup rigid_body
  *
  * The RigidBodyUpdateNotification class is a wrapper class for marshalling and unmarshalling rigid
  * body updates. The class template should be the
diff --git a/src/pe/communication/RigidBodyVelocityCorrectionNotification.h b/src/pe/communication/RigidBodyVelocityCorrectionNotification.h
index 21e1af3da..71e5a59d1 100644
--- a/src/pe/communication/RigidBodyVelocityCorrectionNotification.h
+++ b/src/pe/communication/RigidBodyVelocityCorrectionNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyVelocityCorrectionNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyVelocityCorrectionNotification class
@@ -42,7 +41,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body velocity corrections.
- * \ingroup rigid_body
  *
  * The RigidBodyVelocityCorrectionNotification class is a wrapper class for marshalling and unmarshalling rigid body
  * velocity correction. It includes the system ID of the body the correction applies to and the linear and angular
diff --git a/src/pe/communication/RigidBodyVelocityUpdateNotification.h b/src/pe/communication/RigidBodyVelocityUpdateNotification.h
index ec4a592ec..487a09472 100644
--- a/src/pe/communication/RigidBodyVelocityUpdateNotification.h
+++ b/src/pe/communication/RigidBodyVelocityUpdateNotification.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBodyVelocityUpdateNotification.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the RigidBodyVelocityUpdateNotification class
@@ -42,7 +41,6 @@ namespace communication {
 
 //*************************************************************************************************
 /*!\brief Wrapper class for rigid body velocity updates.
- * \ingroup rigid_body
  *
  * The RigidBodyVelocityUpdateNotification class is a wrapper class for marshalling and unmarshalling rigid body
  * velocity updates. It includes linear and angular velocities.
diff --git a/src/pe/communication/rigidbody/Box.cpp b/src/pe/communication/rigidbody/Box.cpp
index 40217acb6..1b5bb4aac 100644
--- a/src/pe/communication/rigidbody/Box.cpp
+++ b/src/pe/communication/rigidbody/Box.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Box.cpp
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/rigidbody/Box.h b/src/pe/communication/rigidbody/Box.h
index 89324fbe6..3a4c35a20 100644
--- a/src/pe/communication/rigidbody/Box.h
+++ b/src/pe/communication/rigidbody/Box.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Box.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/rigidbody/Capsule.cpp b/src/pe/communication/rigidbody/Capsule.cpp
index 431f7ab02..849945919 100644
--- a/src/pe/communication/rigidbody/Capsule.cpp
+++ b/src/pe/communication/rigidbody/Capsule.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Capsule.cpp
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/rigidbody/Capsule.h b/src/pe/communication/rigidbody/Capsule.h
index 45598783c..7f99b1d1d 100644
--- a/src/pe/communication/rigidbody/Capsule.h
+++ b/src/pe/communication/rigidbody/Capsule.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Capsule.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/rigidbody/Sphere.cpp b/src/pe/communication/rigidbody/Sphere.cpp
index bd663162e..dedd8367f 100644
--- a/src/pe/communication/rigidbody/Sphere.cpp
+++ b/src/pe/communication/rigidbody/Sphere.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Sphere.cpp
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/rigidbody/Sphere.h b/src/pe/communication/rigidbody/Sphere.h
index 665a9a870..55881f65a 100644
--- a/src/pe/communication/rigidbody/Sphere.h
+++ b/src/pe/communication/rigidbody/Sphere.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Sphere.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/communication/rigidbody/Union.h b/src/pe/communication/rigidbody/Union.h
index d645d91c7..0850d0231 100644
--- a/src/pe/communication/rigidbody/Union.h
+++ b/src/pe/communication/rigidbody/Union.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Union.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Marshalling of objects for data transmission or storage.
diff --git a/src/pe/contact/Contact.cpp b/src/pe/contact/Contact.cpp
index 4e49cd54b..ed9e68e28 100644
--- a/src/pe/contact/Contact.cpp
+++ b/src/pe/contact/Contact.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Contact.cpp
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for the Contact class.
diff --git a/src/pe/contact/Contact.h b/src/pe/contact/Contact.h
index badd0d2ae..51adfc7c3 100644
--- a/src/pe/contact/Contact.h
+++ b/src/pe/contact/Contact.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Contact.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the Contact class.
@@ -47,11 +46,7 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\defgroup contact Contact
- * \ingroup core
- */
 /*!\brief Contact between rigid bodies.
- * \ingroup contact
  *
  * The Contact class is the base class for all types of contacts between rigid bodies in the
  * simulation system. Contacts between rigid bodies are classified depending on the relative
@@ -339,7 +334,6 @@ inline const Vec3 Contact::getRelVel() const
 
 //*************************************************************************************************
 /*!\brief Global output operator for contacts.
- * \ingroup contact
  *
  * \param os Reference to the output stream.
  * \param c Reference to a constant contact object.
@@ -371,7 +365,6 @@ inline std::ostream& operator<<( std::ostream& os, const Contact& c )
 
 //*************************************************************************************************
 /*!\brief Global output operator for contact handles.
- * \ingroup contact
  *
  * \param os Reference to the output stream.
  * \param c Constant contact handle.
diff --git a/src/pe/contact/ContactFunctions.h b/src/pe/contact/ContactFunctions.h
index 38b271989..141ee7435 100644
--- a/src/pe/contact/ContactFunctions.h
+++ b/src/pe/contact/ContactFunctions.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ContactFunctions.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
diff --git a/src/pe/contact/ContactFunctions.impl.h b/src/pe/contact/ContactFunctions.impl.h
index d24f1ad6f..f48b03281 100644
--- a/src/pe/contact/ContactFunctions.impl.h
+++ b/src/pe/contact/ContactFunctions.impl.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ContactFunctions.impl.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
diff --git a/src/pe/cr/DEM.cpp b/src/pe/cr/DEM.cpp
index 7ffba7d85..e4915c755 100644
--- a/src/pe/cr/DEM.cpp
+++ b/src/pe/cr/DEM.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file DEM.cpp
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for the DEM solver
diff --git a/src/pe/cr/DEM.h b/src/pe/cr/DEM.h
index 052b08adb..100d921ce 100644
--- a/src/pe/cr/DEM.h
+++ b/src/pe/cr/DEM.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file DEM.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the DEM solver
@@ -37,6 +36,9 @@ namespace walberla {
 namespace pe {
 namespace cr {
 
+/**
+ * \ingroup pe
+ */
 class DEM : public ICR
 {
 public:
diff --git a/src/pe/cr/HCSITS.h b/src/pe/cr/HCSITS.h
index ca6fcdb66..17987b7a5 100644
--- a/src/pe/cr/HCSITS.h
+++ b/src/pe/cr/HCSITS.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file HCSITS.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the hard contact solver
@@ -58,11 +57,12 @@ namespace cr {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Specialization of the collision system for the hard contact solvers.
- * \ingroup core
+/**
+ * \ingroup pe
+ * \brief Particular implementation of the collision resoution for the hard contacts.
  *
- * This specialization of the CollisionSystem class template adapts the collision system of the
- * rigid body simulation world to the requirements of the hard contact solvers.
+ * The following code example illustrates the setup of the solver:
+ * \snippet PeDocumentationSnippets.cpp Setup HCSITS
  */
 class HardContactSemiImplicitTimesteppingSolvers
    : public ICR
diff --git a/src/pe/cr/HCSITS.impl.h b/src/pe/cr/HCSITS.impl.h
index c629bffd7..30f991458 100644
--- a/src/pe/cr/HCSITS.impl.h
+++ b/src/pe/cr/HCSITS.impl.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file HCSITS.impl.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for the hard contact solver
diff --git a/src/pe/cr/HCSITSBodyTrait.h b/src/pe/cr/HCSITSBodyTrait.h
index dfc1a8a1a..bf83f5305 100644
--- a/src/pe/cr/HCSITSBodyTrait.h
+++ b/src/pe/cr/HCSITSBodyTrait.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file HCSITSBodyTrait.h
-//! \ingroup pe
 //! \author Tobias Preclik
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the hard contact solver
diff --git a/src/pe/cr/ICR.h b/src/pe/cr/ICR.h
index adc554886..69cc1b83a 100644
--- a/src/pe/cr/ICR.h
+++ b/src/pe/cr/ICR.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ICR.h
-//! \ingroup CollisionResponse
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/cr/PlainIntegrator.cpp b/src/pe/cr/PlainIntegrator.cpp
index 185ba4e5e..0267e8022 100644
--- a/src/pe/cr/PlainIntegrator.cpp
+++ b/src/pe/cr/PlainIntegrator.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file PlainIntegrator.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for the Plain Integrator solver
diff --git a/src/pe/cr/PlainIntegrator.h b/src/pe/cr/PlainIntegrator.h
index 8eaad57e8..378af07f6 100644
--- a/src/pe/cr/PlainIntegrator.h
+++ b/src/pe/cr/PlainIntegrator.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file PlainIntegrator.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the Plain Integrator solver
diff --git a/src/pe/debug/BodyData.h b/src/pe/debug/BodyData.h
index 19c8ae481..e0a0227a6 100644
--- a/src/pe/debug/BodyData.h
+++ b/src/pe/debug/BodyData.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyData.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/fcd/IFCD.h b/src/pe/fcd/IFCD.h
index 76653030a..63b7e5a4f 100644
--- a/src/pe/fcd/IFCD.h
+++ b/src/pe/fcd/IFCD.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file IFCD.h
-//! \ingroup FineCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/fcd/SimpleFCD.h b/src/pe/fcd/SimpleFCD.h
index bf1c7731f..456d9b73b 100644
--- a/src/pe/fcd/SimpleFCD.h
+++ b/src/pe/fcd/SimpleFCD.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file IFCD.h
-//! \ingroup FineCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/fcd/SimpleFCDDataHandling.h b/src/pe/fcd/SimpleFCDDataHandling.h
index 2f815a8eb..4f46eccf8 100644
--- a/src/pe/fcd/SimpleFCDDataHandling.h
+++ b/src/pe/fcd/SimpleFCDDataHandling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SimpleFCDDataHandling.h
-//! \ingroup FineCollisionDetection
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/pe_module.dox b/src/pe/pe_module.dox
new file mode 100644
index 000000000..65f330c70
--- /dev/null
+++ b/src/pe/pe_module.dox
@@ -0,0 +1,78 @@
+namespace walberla {
+namespace pe {
+
+/**
+\defgroup pe pe - Rigid Body Dynamics
+
+\section gtn Good to Know
+
+\subsection CreationMethods What geometries are supported?
+   - Box created via createBox()
+   - Capsule created via createCapsule()
+   - Plane created via createPlane()
+   - Sphere created via createSphere()
+   - Union created via createUnion()
+
+\subsection SyncMethods What synchronization functions are available?
+Please check the documentation of each individual method for more information.
+   - syncNextNeighbors()
+   - syncShadowOwners()
+
+\subsection CCD What coarse collision detection functions are available?
+Please check the documentation of each individual function for more information.
+   - ccd::SimpleCCD created via createSimpleCCDDataHandling()
+   - ccd::HashGrids created via createHashGridsDataHandling()
+
+\subsection FCD What fine collision detection functions are available?
+Please check the documentation of each individual function for more information.
+   - fcd::SimpleFCD create via createSimpleFCDDataHandling() (analytic contact detection)
+
+\subsection CRSolvers What collision resolution solvers are available?
+Please check the documentation of each individual solver for more information.
+   - cr::DEM (soft contact solver)
+   - cr::HardContactSemiImplicitTimesteppingSolvers (hard contact solver)
+
+\subsection BodyFlags Global, Communicating and InfiniteMass flags
+These flags are given during the creation process of the rigid body. They can be retrieved with
+RigidBody::isGlobal(), RigidBody::isCommunicating() and RigidBody::hasInfiniteMass().
+
+The **global** flag decides if the rigid body is stored in the global body storage or in one of the
+block local body storages. If the body is stored in the global body storage it will receive a
+global system id. Infinitely large bodies like planes are always global.
+
+The **communicating** flag decides if the body takes part in the synchronization process, e.g. it spawns
+shadow copies and updates already existent shadow copies. Bodies which do not move throughout
+the simulation can be made non communicating.
+\attention There will be no shadow copies of non communicating bodies even if they overlap a
+subdomain boundary. To overcome this drawback you can set **syncNonCommunicatingBodies**
+to **true** once in your sync call (syncNextNeighbors() or syncShadowOwners()).
+
+The **infiniteMass** flag decides if the body is "considered" by the collision resolution system. It still
+influences other rigid bodies but will not be moved itself. Rigid bodies with the **infiniteMass**
+flag set can still have a static velocity and will move accordingly.
+
+\subsection BodyNotFoundError "Object with id: xxx not found in shadowStorage! Cannot transfer ownership!"
+Most likely one of your bodies got too fast. The process of migrating a rigid body to a new process is:
+   1. overlap new subdomain
+   2. sync
+   3. move center of mass into the new subdomain
+   4. sync
+
+If a rigid body gets fast enough to move its center of mass into a new subdomain without first creating
+a shadow copy you will receive that error message.
+
+\subsection UnionContacts Contacts Involving Unions
+Collision detection for unions is done by colliding each of its subbodies separately.
+The contacts generated involves the **subbodies**. With this approach you can use different
+material parameters for every subbody and the solver component can retrieve the material
+of every collision partner by retrieving the material of Contact::getBody1(), Contact::getBody2().
+
+\attention To get the correct mass and inertia of a union during collision resolution
+you should call RigidBody::getTopSuperBody() and then RigidBody::getMass()
+(RigidBody::getInertia()) using the returned rigid body.
+
+\section CommonFunctions Important Classes and Functions
+**/
+
+}
+}
diff --git a/src/pe/rigidbody/BodyIterators.h b/src/pe/rigidbody/BodyIterators.h
index f52ac819c..aaf7d7daf 100644
--- a/src/pe/rigidbody/BodyIterators.h
+++ b/src/pe/rigidbody/BodyIterators.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyIterators.h
-//! \ingroup pe
 //! \author Florian Schornbaum <florian.schornbaum@fau.de>
 //! \author Christoph Rettinger <christoph.rettinger@fau.de>
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
diff --git a/src/pe/rigidbody/BodyStorage.h b/src/pe/rigidbody/BodyStorage.h
index eda178007..fb34a5590 100644
--- a/src/pe/rigidbody/BodyStorage.h
+++ b/src/pe/rigidbody/BodyStorage.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyStorage.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -54,7 +53,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Body storage of the rigid body simulation world.
- * \ingroup pe
  *
  * A BodyStorage is a data structure for storing rigid bodies. It supports efficient insertion and
  * deletion operations.
diff --git a/src/pe/rigidbody/Box.cpp b/src/pe/rigidbody/Box.cpp
index 527ddbf6f..417af0f24 100644
--- a/src/pe/rigidbody/Box.cpp
+++ b/src/pe/rigidbody/Box.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Box.cpp
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -345,7 +344,6 @@ void Box::calcInertia()
 
 //*************************************************************************************************
 /*!\brief Global output operator for boxes.
- * \ingroup box
  *
  * \param os Reference to the output stream.
  * \param b Reference to a constant box object.
@@ -365,7 +363,6 @@ std::ostream& operator<<( std::ostream& os, const Box& b )
 
 //*************************************************************************************************
 /*!\brief Global output operator for box handles.
- * \ingroup box
  *
  * \param os Reference to the output stream.
  * \param b Constant box handle.
diff --git a/src/pe/rigidbody/Box.h b/src/pe/rigidbody/Box.h
index 9f5659a04..427c5ea2a 100644
--- a/src/pe/rigidbody/Box.h
+++ b/src/pe/rigidbody/Box.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Box.h
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -49,7 +48,9 @@ namespace pe {
 //
 //=================================================================================================
 
-/*!\brief Box geometry.
+/**
+ * \ingroup pe
+ * \brief Box geometry.
  *
  * The Box class represents the geometric primitive box, which is one of the basic geometric
  * primitives of the \b pe physics module. The class is derived from the GeomPrimitive base class,
diff --git a/src/pe/rigidbody/BoxFactory.h b/src/pe/rigidbody/BoxFactory.h
index 4e0e9e383..3313cf87b 100644
--- a/src/pe/rigidbody/BoxFactory.h
+++ b/src/pe/rigidbody/BoxFactory.h
@@ -38,8 +38,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Setup of a new Box.
- * \ingroup rigidbody
+/**
+ * \ingroup pe
+ * \brief Setup of a new Box.
  *
  * \param globalStorage process local global storage
  * \param blocks storage of all the blocks on this process
@@ -60,17 +61,8 @@ namespace pe {
  * and consists of the material \a material.
  *
  * The following code example illustrates the setup of a box:
-
-   \code
-   // Creating the iron box 1 with a side lengths of 2.5 at the global position (2,3,4).
-   // Note that the box is
-   // automatically added to the simulation world and is immediately part of the entire
-   // simulation. The function returns a handle to the newly created box, which can
-   // be used to for instance rotate the box around the global y-axis.
-   BoxID box = createBox( globalStorage, blocks, storageID, 1, Vec3(2,3,4), Vec3(2.5,2.5,2.5) );
-   if (box != NULL)
-       box->rotate( 0.0, PI/3.0, 0.0 );
-   \endcode
+ * \snippet PeDocumentationSnippets.cpp Create a Box
+ *
  */
 BoxID createBox(       BodyStorage& globalStorage, BlockStorage& blocks, BlockDataID storageID,
                        id_t uid, const Vec3& gpos, const Vec3& lengths,
diff --git a/src/pe/rigidbody/Capsule.cpp b/src/pe/rigidbody/Capsule.cpp
index 7c614931a..0a99487ef 100644
--- a/src/pe/rigidbody/Capsule.cpp
+++ b/src/pe/rigidbody/Capsule.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Capsule.cpp
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -270,7 +269,6 @@ void Capsule::print( std::ostream& os, const char* tab ) const
 
 //*************************************************************************************************
 /*!\brief Global output operator for capsules.
- * \ingroup capsule
  *
  * \param os Reference to the output stream.
  * \param c Reference to a constant capsule object.
@@ -290,7 +288,6 @@ std::ostream& operator<<( std::ostream& os, const Capsule& c )
 
 //*************************************************************************************************
 /*!\brief Global output operator for capsule handles.
- * \ingroup capsule
  *
  * \param os Reference to the output stream.
  * \param c Constant capsule handle.
diff --git a/src/pe/rigidbody/Capsule.h b/src/pe/rigidbody/Capsule.h
index 4a41629c5..3be8e0453 100644
--- a/src/pe/rigidbody/Capsule.h
+++ b/src/pe/rigidbody/Capsule.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Capsule.h
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -51,10 +50,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Capsule geometry.
- * \ingroup rigidbody
- *
- * \section capsule_general General
+/**
+ * \ingroup pe
+ * \brief Capsule geometry.
  *
  * The Capsule class represents the geometric primitive capsule, which is one of the basic
  * geometric primitives of the \b pe physics module. The class is derived from the GeomPrimitive
diff --git a/src/pe/rigidbody/CapsuleFactory.h b/src/pe/rigidbody/CapsuleFactory.h
index 49f92f97a..012522b60 100644
--- a/src/pe/rigidbody/CapsuleFactory.h
+++ b/src/pe/rigidbody/CapsuleFactory.h
@@ -38,8 +38,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Setup of a new Capsule.
- * \ingroup rigidbody
+/**
+ * \ingroup pe
+ * \brief Setup of a new Capsule.
  *
  * \param globalStorage process local global storage
  * \param blocks storage of all the blocks on this process
@@ -54,6 +55,10 @@ namespace pe {
  * \param communicating specifies if the capsule should take part in synchronization (syncNextNeighbour, syncShadowOwner)
  * \param infiniteMass specifies if the capsule has infinite mass and will be treated as an obstacle
  * \return Handle for the new capsule.
+ *
+ * The following code example illustrates the setup of a capsule:
+
+   \snippet PeDocumentationSnippets.cpp Create a Capsule
  */
 CapsuleID createCapsule(   BodyStorage& globalStorage, BlockStorage& blocks, BlockDataID storageID,
                            id_t uid, const Vec3& gpos, const real_t radius, const real_t length,
diff --git a/src/pe/rigidbody/GeomPrimitive.cpp b/src/pe/rigidbody/GeomPrimitive.cpp
index ecc3cdef9..ce6d2d811 100644
--- a/src/pe/rigidbody/GeomPrimitive.cpp
+++ b/src/pe/rigidbody/GeomPrimitive.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file GeomPrimitive.cpp
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Source file for the GeomPrimitive class
diff --git a/src/pe/rigidbody/GeomPrimitive.h b/src/pe/rigidbody/GeomPrimitive.h
index 05a5bcdfb..2fa2f059d 100644
--- a/src/pe/rigidbody/GeomPrimitive.h
+++ b/src/pe/rigidbody/GeomPrimitive.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file GeomPrimitive.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //! \brief Header file for the GeomPrimitive class
@@ -43,7 +42,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Base class for all primitive geometries.
- * \ingroup rigidbody
  *
  * The GeomPrimitive class is the abstract basis for all geometric primitives of the rigid body
  * physics module. The class provides the common data members and the common functionality for
diff --git a/src/pe/rigidbody/MPIRigidBodyTrait.h b/src/pe/rigidbody/MPIRigidBodyTrait.h
index 4760175e2..022bc2dbc 100644
--- a/src/pe/rigidbody/MPIRigidBodyTrait.h
+++ b/src/pe/rigidbody/MPIRigidBodyTrait.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file MPIRigidBodyTrait.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
@@ -40,7 +39,6 @@ namespace pe{
 
 //*************************************************************************************************
 /*!\brief Base class for a specialization of the RigidBodyTrait class template for MPI parallel solvers.
- * \ingroup rigidbody
  *
  * This class adds functionality to track which process owns the rigid body and which processes
  * have remote copies of the body in case it is owned by this process.
diff --git a/src/pe/rigidbody/Node.h b/src/pe/rigidbody/Node.h
index c4adf7262..584d44e4f 100644
--- a/src/pe/rigidbody/Node.h
+++ b/src/pe/rigidbody/Node.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Node.h
-//! \ingroup pe
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -41,7 +40,6 @@ namespace pe {
 
 //*************************************************************************************************
 /*!\brief Node for the 'Union Find' algorithm.
- * \ingroup batch_generation
  *
  * This specialization of the BodyTrait class template adapts rigid bodies to the 'Union Find'
  * batch generation algorithm. In this algorithm, rigid bodies act as nodes in a graph and
diff --git a/src/pe/rigidbody/Owner.h b/src/pe/rigidbody/Owner.h
index 783982bbc..53e15de88 100644
--- a/src/pe/rigidbody/Owner.h
+++ b/src/pe/rigidbody/Owner.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Owner.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/rigidbody/Plane.cpp b/src/pe/rigidbody/Plane.cpp
index a515c2631..ffb6c91a0 100644
--- a/src/pe/rigidbody/Plane.cpp
+++ b/src/pe/rigidbody/Plane.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Plane.cpp
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -566,7 +565,6 @@ void Plane::print( std::ostream& os, const char* tab ) const
 
 //*************************************************************************************************
 /*!\brief Global output operator for planes.
- * \ingroup plane
  *
  * \param os Reference to the output stream.
  * \param p Reference to a constant plane object.
@@ -586,7 +584,6 @@ std::ostream& operator<<( std::ostream& os, const Plane& p )
 
 //*************************************************************************************************
 /*!\brief Global output operator for plane handles.
- * \ingroup plane
  *
  * \param os Reference to the output stream.
  * \param p Constant plane handle.
diff --git a/src/pe/rigidbody/Plane.h b/src/pe/rigidbody/Plane.h
index 2e11d6f9b..996edb3e8 100644
--- a/src/pe/rigidbody/Plane.h
+++ b/src/pe/rigidbody/Plane.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Plane.h
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -42,8 +41,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Plane geometry.
- * \ingroup rigidbody
+/**
+ * \ingroup pe
+ * \brief Plane geometry.
  *
  * The Plane class represents the geometric primitive plane, which is one of the basic geometric
  * primitives of the pe module. The class is derived from the GeomPrimitive base
diff --git a/src/pe/rigidbody/PlaneFactory.h b/src/pe/rigidbody/PlaneFactory.h
index d7ef0e797..63345f54b 100644
--- a/src/pe/rigidbody/PlaneFactory.h
+++ b/src/pe/rigidbody/PlaneFactory.h
@@ -38,8 +38,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Setup of a new plane.
- * \ingroup rigidbody
+/**
+ * \ingroup pe
+ * \brief Setup of a new Plane.
  *
  * \param globalStorage process local global storage
  * \param uid The user-specific ID of the plane.
@@ -51,12 +52,11 @@ namespace pe {
  * This function creates a plane primitive in the simulation system. The plane with
  * user-specific ID \a uid is placed at the global position \a gpos, oriented with \a normal
  * and consists of the material \a material
-
- * The following code example illustrates the setup of a sphere:
-
-   \code
-   PlaneID plane = createPlane( globalStorage, 1, Vec3(2,3,4), Vec3(2,3,4) );
-   \endcode
+ *
+ * The following code example illustrates the setup of a plane:
+ *
+ * \snippet PeDocumentationSnippets.cpp Create a Plane
+ *
  */
 PlaneID createPlane( BodyStorage& globalStorage,
                      id_t uid, Vec3 normal, const Vec3& gpos,
diff --git a/src/pe/rigidbody/RigidBody.cpp b/src/pe/rigidbody/RigidBody.cpp
index 8512ba329..c67cac62c 100644
--- a/src/pe/rigidbody/RigidBody.cpp
+++ b/src/pe/rigidbody/RigidBody.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBody.cpp
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -193,7 +192,6 @@ bool RigidBody::checkInvariants()
 
 //*************************************************************************************************
 /*!\brief Global output operator for rigid bodies.
- * \ingroup rigid_body
  *
  * \param os Reference to the output stream.
  * \param b Reference to a constant rigid body object.
@@ -213,7 +211,6 @@ std::ostream& operator<<( std::ostream& os, const RigidBody& b )
 
 //*************************************************************************************************
 /*!\brief Global output operator for rigid body handles.
- * \ingroup rigid_body
  *
  * \param os Reference to the output stream.
  * \param b Constant rigid body handle.
diff --git a/src/pe/rigidbody/RigidBody.h b/src/pe/rigidbody/RigidBody.h
index d6b3a9a44..408750a52 100644
--- a/src/pe/rigidbody/RigidBody.h
+++ b/src/pe/rigidbody/RigidBody.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBody.h
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -47,6 +46,9 @@ namespace pe{
 template <typename BodyTypeTuple>
 class Union;
 
+/**
+ * \ingroup pe
+ */
 class RigidBody : public Node
                 , public ccd::HashGridsBodyTrait
                 , public cr::HCSITSBodyTrait
diff --git a/src/pe/rigidbody/SetBodyTypeIDs.h b/src/pe/rigidbody/SetBodyTypeIDs.h
index 32bc79b98..a7a7996d7 100644
--- a/src/pe/rigidbody/SetBodyTypeIDs.h
+++ b/src/pe/rigidbody/SetBodyTypeIDs.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SetBodyTypeIDs.h
-//! \ingroup RigidBody
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
@@ -31,6 +30,22 @@ namespace pe {
 
 template < typename BodyTypeTuple >
 struct SetBodyTypeIDs{
+   /**
+    * \ingroup pe
+    * \brief Initial setup of static type ids.
+    *
+    * \tparam BodyTypeTuple boost::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.
+    * 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 );
diff --git a/src/pe/rigidbody/Sphere.cpp b/src/pe/rigidbody/Sphere.cpp
index 791e0880b..78ceb34de 100644
--- a/src/pe/rigidbody/Sphere.cpp
+++ b/src/pe/rigidbody/Sphere.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Sphere.cpp
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -218,7 +217,6 @@ void Sphere::print( std::ostream& os, const char* tab ) const
 
 //*************************************************************************************************
 /*!\brief Global output operator for spheres.
- * \ingroup sphere
  *
  * \param os Reference to the output stream.
  * \param s Reference to a constant sphere object.
@@ -238,7 +236,6 @@ std::ostream& operator<<( std::ostream& os, const Sphere& s )
 
 //*************************************************************************************************
 /*!\brief Global output operator for sphere handles.
- * \ingroup sphere
  *
  * \param os Reference to the output stream.
  * \param s Constant sphere handle.
diff --git a/src/pe/rigidbody/Sphere.h b/src/pe/rigidbody/Sphere.h
index ccd227f75..edfa5acfb 100644
--- a/src/pe/rigidbody/Sphere.h
+++ b/src/pe/rigidbody/Sphere.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Sphere.h
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -50,8 +49,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Base class for the sphere geometry.
- * \ingroup sphere
+/**
+ * \ingroup pe
+ * \brief Base class for the sphere geometry.
  *
  * The Sphere class represents the base class for the sphere geometry. It provides
  * the basic functionality of a sphere. For a full description of the sphere geometry,
diff --git a/src/pe/rigidbody/SphereFactory.h b/src/pe/rigidbody/SphereFactory.h
index ecd81c82e..e1f577420 100644
--- a/src/pe/rigidbody/SphereFactory.h
+++ b/src/pe/rigidbody/SphereFactory.h
@@ -38,8 +38,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Setup of a new sphere.
- * \ingroup rigidbody
+/**
+ * \ingroup pe
+ * \brief Setup of a new Sphere.
  *
  * \param globalStorage process local global storage
  * \param blocks storage of all the blocks on this process
@@ -60,17 +61,9 @@ namespace pe {
  * and consists of the material \a material.
  *
  * The following code example illustrates the setup of a sphere:
-
-   \code
-   // Creating the iron sphere 1 with a radius of 2.5 at the global position (2,3,4).
-   // Note that the sphere is
-   // automatically added to the simulation world and is immediately part of the entire
-   // simulation. The function returns a handle to the newly created sphere, which can
-   // be used to for instance rotate the sphere around the global y-axis.
-   SphereID sphere = createSphere( globalStorage, blocks, storageID, 1, Vec3(2,3,4), 2.5 );
-   if (SphereID != NULL)
-       sphere->rotate( 0.0, PI/3.0, 0.0 );
-   \endcode
+ *
+ * \snippet PeDocumentationSnippets.cpp Create a Sphere
+ *
  */
 SphereID createSphere( BodyStorage& globalStorage, BlockStorage& blocks, BlockDataID storageID,
                        id_t uid, const Vec3& gpos, real_t radius,
diff --git a/src/pe/rigidbody/StorageDataHandling.h b/src/pe/rigidbody/StorageDataHandling.h
index 55986823e..6e60e5f6f 100644
--- a/src/pe/rigidbody/StorageDataHandling.h
+++ b/src/pe/rigidbody/StorageDataHandling.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyStorageDataHandling.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/rigidbody/Union.h b/src/pe/rigidbody/Union.h
index 0b979bb02..1dacea326 100644
--- a/src/pe/rigidbody/Union.h
+++ b/src/pe/rigidbody/Union.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Union.h
-//! \ingroup RigidBody
 //! \author Klaus Iglberger
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
@@ -53,8 +52,9 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Base class for the sphere geometry.
- * \ingroup sphere
+/**
+ * \ingroup pe
+ * \brief Base class for the sphere geometry.
  *
  * The Sphere class represents the base class for the sphere geometry. It provides
  * the basic functionality of a sphere. For a full description of the sphere geometry,
@@ -1094,7 +1094,6 @@ void Union<BodyTypeTuple>::print( std::ostream& os, const char* tab ) const
 
 //*************************************************************************************************
 /*!\brief Global output operator for unions.
- * \ingroup union
  *
  * \param os Reference to the output stream.
  * \param u Reference to a constant union object.
@@ -1115,7 +1114,6 @@ std::ostream& operator<<( std::ostream& os, const Union<BodyTypeTuple>& u )
 
 //*************************************************************************************************
 /*!\brief Global output operator for union handles.
- * \ingroup union
  *
  * \param os Reference to the output stream.
  * \param u Constant union handle.
diff --git a/src/pe/rigidbody/UnionFactory.h b/src/pe/rigidbody/UnionFactory.h
index 31096e92c..e237e0dd3 100644
--- a/src/pe/rigidbody/UnionFactory.h
+++ b/src/pe/rigidbody/UnionFactory.h
@@ -39,14 +39,16 @@ namespace pe {
 
 //=================================================================================================
 //
-//  BOX SETUP FUNCTIONS
+//  UNION SETUP FUNCTIONS
 //
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\brief Setup of a new Union.
- * \ingroup rigidbody
+/**
+ * \ingroup pe
+ * \brief Setup of a new Union.
  *
+ * \tparam BodyTypeTuple boost::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
@@ -56,15 +58,20 @@ namespace pe {
  * \param communicating specifies if the union should take part in synchronization (syncNextNeighbour, syncShadowOwner)
  * \param infiniteMass specifies if the union has infinite mass and will be treated as an obstacle
  * \return Handle for the new union.
- * \exception std::invalid_argument Invalid box radius.
- * \exception std::invalid_argument Invalid global box position.
+ * \exception std::runtime_error Union TypeID not initalized!
+ *
+ * The code example illustrates the setup of a Union. For convenience the following typedefs were made.
+ * You can adapt them to your needs.
+ * \snippet PeDocumentationSnippets.cpp Definition of Union Types
+ * \snippet PeDocumentationSnippets.cpp Create a Union
  */
 template <typename BodyTypeTuple>
 Union<BodyTypeTuple>* createUnion(   BodyStorage& globalStorage, BlockStorage& blocks, BlockDataID storageID,
                                      id_t uid, const Vec3& gpos,
                                      bool global = false, bool communicating = true, bool infiniteMass = false )
 {
-   WALBERLA_ASSERT_UNEQUAL( Union<BodyTypeTuple>::getStaticTypeID(), std::numeric_limits<id_t>::max(), "Union TypeID not initalized!");
+   if (Union<BodyTypeTuple>::getStaticTypeID() == std::numeric_limits<id_t>::max())
+      throw std::runtime_error("Union TypeID not initalized!");
 
    Union<BodyTypeTuple>* bd = NULL;
 
@@ -103,22 +110,34 @@ Union<BodyTypeTuple>* createUnion(   BodyStorage& globalStorage, BlockStorage& b
    return bd;
 }
 
+//*************************************************************************************************
+/**
+ * \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
+ * \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
+ * \exception std::invalid_argument Invalid side length
+ * \see createBox for more details
+ */
 template <typename BodyTypeTuple>
 BoxID createBox( Union<BodyTypeTuple>* un,
                  id_t uid, const Vec3& gpos, const Vec3& lengths,
-                 MaterialID material,
-                 bool global, bool communicating, bool infiniteMass )
+                 MaterialID material = Material::find("iron"),
+                 bool global = false, bool communicating = true, bool infiniteMass = false )
 {
    if (Box::getStaticTypeID() == std::numeric_limits<id_t>::max())
       throw std::runtime_error("Box TypeID not initalized!");
 
    // union not on this process/block -> terminate creation
    if (un == NULL)
-      throw std::invalid_argument( "createSphere: Union argument is NULL" );
+      throw std::invalid_argument( "createBox: Union argument is NULL" );
 
    // main union not on this process/block -> terminate creation
    if ( un->isRemote() )
-      throw std::logic_error( "createSphere: Union is remote" );
+      throw std::logic_error( "createBox: Union is remote" );
 
    // Checking the side lengths
    if( lengths[0] <= real_t(0) || lengths[1] <= real_t(0) || lengths[2] <= real_t(0) )
@@ -157,22 +176,36 @@ BoxID createBox( Union<BodyTypeTuple>* un,
    return box;
 }
 
+//*************************************************************************************************
+/**
+ * \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
+ * \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
+ * \exception std::invalid_argument Invalid capsule radius
+ * \exception std::invalid_argument Invalid capsule length
+ *
+ * \see createCapsule for more details
+ */
 template <typename BodyTypeTuple>
 CapsuleID createCapsule( Union<BodyTypeTuple>* un,
                          id_t uid, const Vec3& gpos, const real_t radius, const real_t length,
-                         MaterialID material,
-                         bool global, bool communicating, bool infiniteMass )
+                         MaterialID material = Material::find("iron"),
+                         bool global = false, bool communicating = true, bool infiniteMass = false )
 {
    if (Capsule::getStaticTypeID() == std::numeric_limits<id_t>::max())
       throw std::runtime_error("Capsule TypeID not initalized!");
 
    // union not on this process/block -> terminate creation
    if (un == NULL)
-      throw std::invalid_argument( "createSphere: Union argument is NULL" );
+      throw std::invalid_argument( "createCapsule: Union argument is NULL" );
 
    // main union not on this process/block -> terminate creation
    if ( un->isRemote() )
-      throw std::logic_error( "createSphere: Union is remote" );
+      throw std::logic_error( "createCapsule: Union is remote" );
 
    // Checking the radius
    if( radius <= real_c(0) )
@@ -207,6 +240,19 @@ CapsuleID createCapsule( Union<BodyTypeTuple>* un,
    return capsule;
 }
 
+//*************************************************************************************************
+/**
+ * \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
+ * \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
+ * \exception std::invalid_argument Invalid sphere radius
+ *
+ * \see createSphere for more details
+ */
 template <typename BodyTypeTuple>
 SphereID createSphere( Union<BodyTypeTuple>* un,
                        id_t uid, const Vec3& gpos, real_t radius,
diff --git a/src/pe/synchronization/RemoveAndNotify.h b/src/pe/synchronization/RemoveAndNotify.h
index e5a8ad523..8eaf880fe 100644
--- a/src/pe/synchronization/RemoveAndNotify.h
+++ b/src/pe/synchronization/RemoveAndNotify.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RemoveAndNotify.h
-//! \ingroup pe
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/src/pe/utility/Distance.h b/src/pe/utility/Distance.h
index 6869da630..182932591 100644
--- a/src/pe/utility/Distance.h
+++ b/src/pe/utility/Distance.h
@@ -45,11 +45,7 @@ namespace pe {
 //=================================================================================================
 
 //*************************************************************************************************
-/*!\defgroup distance_calculation Distance calculation functions
- * \ingroup pe
- *
- * These functions can be used to calculate the distance between two rigid bodies (surface to surface).
- */
+//* These functions can be used to calculate the distance between two rigid bodies (surface to surface).
 //*************************************************************************************************
 
 
@@ -65,7 +61,6 @@ inline real_t getSurfaceDistance( ConstPlaneID p1   , ConstPlaneID p2    );
 
 //*************************************************************************************************
 /*!\brief Distance calculation between two Sphere primitives.
- * \ingroup distance_calculation
  *
  * \param s1 The first sphere.
  * \param s2 The second sphere.
@@ -84,7 +79,6 @@ inline real_t getSurfaceDistance( ConstSphereID s1, ConstSphereID s2 )
 
 //*************************************************************************************************
 /*!\brief Distance calculation between a Sphere and a Plane.
- * \ingroup distance_calculation
  *
  * \param s The sphere.
  * \param p The plane.
@@ -102,7 +96,6 @@ inline real_t getSurfaceDistance( ConstSphereID s, ConstPlaneID p )
 
 //*************************************************************************************************
 /*!\brief Distance calculation between two Plane primitives.
- * \ingroup distance_calculation
  *
  * \param p1 The first plane.
  * \param p2 The second plane.
diff --git a/tests/pe/BodyFlags.cpp b/tests/pe/BodyFlags.cpp
index 228d0d83a..824b43e81 100644
--- a/tests/pe/BodyFlags.cpp
+++ b/tests/pe/BodyFlags.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyFlags.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/BodyIterators.cpp b/tests/pe/BodyIterators.cpp
index 8b23a5205..a14fc38c5 100644
--- a/tests/pe/BodyIterators.cpp
+++ b/tests/pe/BodyIterators.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyIterators.cpp
-//! \ingroup pe_tests
 //! \author Florian Schornbaum <florian.schornbaum@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/BodyStorage.cpp b/tests/pe/BodyStorage.cpp
index 4b3fae112..644f29a1c 100644
--- a/tests/pe/BodyStorage.cpp
+++ b/tests/pe/BodyStorage.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file BodyStorage.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/CMakeLists.txt b/tests/pe/CMakeLists.txt
index 2f34fd783..bf6297265 100644
--- a/tests/pe/CMakeLists.txt
+++ b/tests/pe/CMakeLists.txt
@@ -26,6 +26,9 @@ waLBerla_execute_test( NAME   PE_DELETEBODY_SO COMMAND $<TARGET_FILE:PE_DELETEBO
 waLBerla_compile_test( NAME   PE_DESTROYBODY FILES DestroyBody.cpp DEPENDS core blockforest  )
 waLBerla_execute_test( NAME   PE_DESTROYBODY )
 
+waLBerla_compile_test( NAME   PE_DOCUMENTATIONSNIPPETS FILES PeDocumentationSnippets.cpp DEPENDS core  )
+waLBerla_execute_test( NAME   PE_DOCUMENTATIONSNIPPETS )
+
 waLBerla_compile_test( NAME   PE_FORCESYNC FILES ForceSync.cpp DEPENDS core blockforest  )
 waLBerla_execute_test( NAME   PE_FORCESYNC )
 
diff --git a/tests/pe/CheckVitalParameters.cpp b/tests/pe/CheckVitalParameters.cpp
index 234d337b7..2dceba711 100644
--- a/tests/pe/CheckVitalParameters.cpp
+++ b/tests/pe/CheckVitalParameters.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file CheckVitalParameters.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/CheckVitalParameters.h b/tests/pe/CheckVitalParameters.h
index 710a76002..424ef9612 100644
--- a/tests/pe/CheckVitalParameters.h
+++ b/tests/pe/CheckVitalParameters.h
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file CheckVitalParameters.h
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/Collision.cpp b/tests/pe/Collision.cpp
index 89b81fbdf..faa5a5f42 100644
--- a/tests/pe/Collision.cpp
+++ b/tests/pe/Collision.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Collision.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/DeleteBody.cpp b/tests/pe/DeleteBody.cpp
index 5eb18c428..9b0d149bc 100644
--- a/tests/pe/DeleteBody.cpp
+++ b/tests/pe/DeleteBody.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Destroy.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/DestroyBody.cpp b/tests/pe/DestroyBody.cpp
index c2cb329ff..6233d4a91 100644
--- a/tests/pe/DestroyBody.cpp
+++ b/tests/pe/DestroyBody.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Destroy.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/ForceSync.cpp b/tests/pe/ForceSync.cpp
index 97f9d9034..f0901d1b7 100644
--- a/tests/pe/ForceSync.cpp
+++ b/tests/pe/ForceSync.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ForceSync.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/GJK_EPA.cpp b/tests/pe/GJK_EPA.cpp
index 7ec328439..931d14fd9 100644
--- a/tests/pe/GJK_EPA.cpp
+++ b/tests/pe/GJK_EPA.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file GJK_EPA.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/HCSITS.cpp b/tests/pe/HCSITS.cpp
index 908b2b393..ae0472195 100644
--- a/tests/pe/HCSITS.cpp
+++ b/tests/pe/HCSITS.cpp
@@ -15,7 +15,6 @@
 //
 //! \file HCSITS.cpp
 //! \brief checks equality of hash grids and simple ccd
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/HashGrids.cpp b/tests/pe/HashGrids.cpp
index 4063545fa..1a01e29c6 100644
--- a/tests/pe/HashGrids.cpp
+++ b/tests/pe/HashGrids.cpp
@@ -15,7 +15,6 @@
 //
 //! \file HashGrids.cpp
 //! \brief checks equality of hash grids and simple ccd
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/Marshalling.cpp b/tests/pe/Marshalling.cpp
index 79e9dc9cd..aedbc3566 100644
--- a/tests/pe/Marshalling.cpp
+++ b/tests/pe/Marshalling.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Marshalling.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/Material.cpp b/tests/pe/Material.cpp
index c59352b27..0f3633a56 100644
--- a/tests/pe/Material.cpp
+++ b/tests/pe/Material.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Material.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/Overlap.cpp b/tests/pe/Overlap.cpp
index d019b67ae..9086a7882 100644
--- a/tests/pe/Overlap.cpp
+++ b/tests/pe/Overlap.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Overlap.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/ParallelEquivalence.cpp b/tests/pe/ParallelEquivalence.cpp
index 60a69cbef..0448c509e 100644
--- a/tests/pe/ParallelEquivalence.cpp
+++ b/tests/pe/ParallelEquivalence.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ParallelEquivalence.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/ParseMessage.cpp b/tests/pe/ParseMessage.cpp
index 6a0593474..f80114989 100644
--- a/tests/pe/ParseMessage.cpp
+++ b/tests/pe/ParseMessage.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ParseMessage.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/PeDocumentationSnippets.cpp b/tests/pe/PeDocumentationSnippets.cpp
new file mode 100644
index 000000000..2b68d1b53
--- /dev/null
+++ b/tests/pe/PeDocumentationSnippets.cpp
@@ -0,0 +1,136 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file DocumentationSnippets.cpp
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+
+#include "blockforest/all.h"
+#include "core/all.h"
+#include "domain_decomposition/all.h"
+
+#include "pe/basic.h"
+#include "pe/rigidbody/BoxFactory.h"
+#include "pe/rigidbody/CapsuleFactory.h"
+#include "pe/rigidbody/SphereFactory.h"
+#include "pe/rigidbody/UnionFactory.h"
+#include "pe/ccd/SimpleCCDDataHandling.h"
+#include "pe/synchronization/SyncNextNeighbors.h"
+#include "pe/vtk/BodyVtkOutput.h"
+#include "pe/vtk/SphereVtkOutput.h"
+
+#include "CheckVitalParameters.h"
+
+#include "core/debug/TestSubsystem.h"
+#include "vtk/VTKOutput.h"
+
+#include <boost/tuple/tuple.hpp>
+
+#include <algorithm>
+#include <vector>
+
+using namespace walberla;
+using namespace walberla::pe;
+
+//! [Definition of Union Types]
+typedef boost::tuple<Box, Capsule, Sphere>  UnionTypeTuple;
+typedef Union< UnionTypeTuple >             UnionT;
+typedef UnionT*                             UnionID;
+//! [Definition of Union Types]
+
+//! [Definition BodyTypeTuple]
+typedef boost::tuple<Box, Capsule, Plane, Sphere, UnionT> BodyTypeTuple ;
+//! [Definition BodyTypeTuple]
+
+int main( int argc, char ** argv )
+{
+   walberla::debug::enterTestMode();
+
+   walberla::MPIManager::instance()->initializeMPI( &argc, &argv );
+
+   shared_ptr<BodyStorage> globalBodyStorage = make_shared<BodyStorage>();
+
+   // create blocks
+   shared_ptr< StructuredBlockForest > forest = blockforest::createUniformBlockGrid(
+            uint_c( 1), uint_c( 1), uint_c( 1), // number of blocks in x,y,z direction
+            uint_c( 1), uint_c( 1), uint_c( 1), // how many cells per block (x,y,z)
+            real_c(10),                         // dx: length of one cell in physical coordinates
+            0,                                  // max blocks per process
+            false, false,                       // include metis / force metis
+            false, false, false );                 // full periodicity
+
+   //! [Definition Setup TypeIds]
+   SetBodyTypeIDs<BodyTypeTuple>::execute();
+   //! [Definition Setup TypeIds]
+
+   auto storageID           = forest->addBlockData(createStorageDataHandling<BodyTypeTuple>(), "Storage");
+   auto ccdID               = forest->addBlockData(ccd::createHashGridsDataHandling( globalBodyStorage, storageID ), "CCD");
+   auto fcdID               = forest->addBlockData(fcd::createSimpleFCDDataHandling<BodyTypeTuple>(), "FCD");
+
+   //! [Setup HCSITS]
+   cr::HCSITS hcsits(globalBodyStorage, forest->getBlockStoragePointer(), storageID, ccdID, fcdID);
+   hcsits.setMaxIterations           ( uint_c(10) );
+   hcsits.setRelaxationModel         ( cr::HCSITS::InelasticGeneralizedMaximumDissipationContact );
+   hcsits.setRelaxationParameter     ( real_t(0.7) );
+   hcsits.setErrorReductionParameter ( real_t(0.8) );
+   hcsits.setGlobalLinearAcceleration( Vec3(0,0,-1) );
+   //! [Setup HCSITS]
+
+   //! [Create a Box]
+   // Creating the iron box 1 with a side lengths of 2.5 at the global position (2,3,4).
+   // Note that the box is
+   // automatically added to the simulation world and is immediately part of the entire
+   // simulation. The function returns a handle to the newly created box, which can
+   // be used to for instance rotate the box around the global y-axis.
+   BoxID box = createBox( *globalBodyStorage, forest->getBlockStorage(), storageID, 1, Vec3(2,3,4), Vec3(2.5,2.5,2.5) );
+   if (box != NULL)
+      box->rotate( 0.0, math::PI/3.0, 0.0 );
+   //! [Create a Box]
+
+   //! [Create a Capsule]
+   // Create a capsule and rotate it after successfull creation.
+   CapsuleID capsule = createCapsule( *globalBodyStorage, forest->getBlockStorage(), storageID, 1, Vec3(2,3,4), real_t(1), real_t(1) );
+   if (capsule != NULL)
+      capsule->rotate( 0.0, math::PI/3.0, 0.0 );
+   //! [Create a Capsule]
+
+   //! [Create a Plane]
+   // Create a plane
+   PlaneID plane = createPlane( *globalBodyStorage, 1, Vec3(2,3,4), Vec3(2,3,4) );
+   //! [Create a Plane]
+   WALBERLA_UNUSED( plane );
+
+   //! [Create a Sphere]
+   // Create a sphere and rotate it after successfull creation.
+   SphereID sphere = createSphere( *globalBodyStorage, forest->getBlockStorage(), storageID, 1, Vec3(2,3,4), real_t(1) );
+   if (sphere != NULL)
+      sphere->rotate( 0.0, math::PI/3.0, 0.0 );
+   //! [Create a Sphere]
+
+   //! [Create a Union]
+   // Create a union and add a box, capsule and sphere.
+   UnionID un = createUnion<UnionTypeTuple>( *globalBodyStorage, forest->getBlockStorage(), storageID, 1, Vec3(2,3,4) );
+   if (un != NULL)
+   {
+      createBox    ( un, 1, Vec3(2,3,4), Vec3(2.5,2.5,2.5) );
+      createCapsule( un, 1, Vec3(3,3,4), real_t(1), real_t(1) );
+      createSphere ( un, 1, Vec3(4,3,4), real_t(1) );
+   }
+   //! [Create a Union]
+
+   return EXIT_SUCCESS;
+}
diff --git a/tests/pe/Refinement.cpp b/tests/pe/Refinement.cpp
index ef6a6aa20..cb8291d28 100644
--- a/tests/pe/Refinement.cpp
+++ b/tests/pe/Refinement.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ParallelEquivalence.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/RigidBody.cpp b/tests/pe/RigidBody.cpp
index 2df26b61d..58926892d 100644
--- a/tests/pe/RigidBody.cpp
+++ b/tests/pe/RigidBody.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file RigidBody.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/SerializeDeserialize.cpp b/tests/pe/SerializeDeserialize.cpp
index 8c59d3e1d..6fb932c02 100644
--- a/tests/pe/SerializeDeserialize.cpp
+++ b/tests/pe/SerializeDeserialize.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Synchronization.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/SetBodyTypeIDs.cpp b/tests/pe/SetBodyTypeIDs.cpp
index 389adbd15..dee15759d 100644
--- a/tests/pe/SetBodyTypeIDs.cpp
+++ b/tests/pe/SetBodyTypeIDs.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SetBodyTypeIDs.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/ShadowCopy.cpp b/tests/pe/ShadowCopy.cpp
index b709ae03e..166134355 100644
--- a/tests/pe/ShadowCopy.cpp
+++ b/tests/pe/ShadowCopy.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ShadowCopy.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/SimpleCCD.cpp b/tests/pe/SimpleCCD.cpp
index 07f128710..cd0095811 100644
--- a/tests/pe/SimpleCCD.cpp
+++ b/tests/pe/SimpleCCD.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SimpleCCD.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/SyncEquivalence.cpp b/tests/pe/SyncEquivalence.cpp
index 6eab05807..728268de1 100644
--- a/tests/pe/SyncEquivalence.cpp
+++ b/tests/pe/SyncEquivalence.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SyncEquivalence.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/Synchronization.cpp b/tests/pe/Synchronization.cpp
index 02245c300..c8ad534ff 100644
--- a/tests/pe/Synchronization.cpp
+++ b/tests/pe/Synchronization.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file Synchronization.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/SynchronizationDelete.cpp b/tests/pe/SynchronizationDelete.cpp
index c276985c6..fb40078fd 100644
--- a/tests/pe/SynchronizationDelete.cpp
+++ b/tests/pe/SynchronizationDelete.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SynchronizationDelete.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/SynchronizationLargeBody.cpp b/tests/pe/SynchronizationLargeBody.cpp
index bcbbc7b7a..ab7123da2 100644
--- a/tests/pe/SynchronizationLargeBody.cpp
+++ b/tests/pe/SynchronizationLargeBody.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file SynchronizationLargeBody.cpp
-//! \ingroup pe_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
diff --git a/tests/pe/Union.cpp b/tests/pe/Union.cpp
index 4e274d22d..b451b1288 100644
--- a/tests/pe/Union.cpp
+++ b/tests/pe/Union.cpp
@@ -14,7 +14,6 @@
 //  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
 //
 //! \file ParallelEquivalence.cpp
-//! \ingroup pe2_tests
 //! \author Sebastian Eibl <sebastian.eibl@fau.de>
 //
 //======================================================================================================================
-- 
GitLab