diff --git a/doc/Mainpage.dox b/doc/Mainpage.dox
index 29e5aa72b4a1d5e28f1cf093d2510cd622360ceb..b31a3a182fe3934b774ff486b71e419753505dc6 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 a908a07870502ecd8b95ec3ff852e626ad0e1c8f..b3d9facebb7fa5141cecf0388cd9d50d50ea603a 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 b7b71b453565767149a6a589c1a17606d5835157..098c8325bc970a53df3b24eb29776a3916a0605f 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 0a398e6aac077721e80c3166c3fb97b6e6e4fff5..7bb34ac518c8a5d157c0b0abf0d4c4e79ccfaace 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 e90725b3ee7d343f99cec3b91d6467657cfeb5f4..c1e8e466d6fb075480b289dbdc545b54013a9d25 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 56e069559cc2c8ae708511c02e83acbf646b8a2b..93fde81a781689e0b748ae2be17b78956ae40624 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 8d7e35e71604f38fdabcea1e91553aa1ed1e2104..ef789831e16d8bf53daf7aa1415ab622d8d04efa 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 01f9da609129d62a01882c3067be9ea67a5eac42..355099c08a31ec9a2e347619ae9c2c28d0f921c6 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 8c7cee3e920e39f396815ed85c99f8fe38f81148..f0993be59c8c682c18e0ed5207d86fd7f351be5e 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 8eb0d3560bd35ccacea69266e4487b6201ac53bf..15d386d540f0854f7db0867611a611ea976f35a2 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 1b64085dc2071437ceb73cca5a3c370aa5e98fc5..76056d6866479db8625431b72e49b7c87bcc06f8 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 5d6c7195221e56dffb3b0e61dbf60c83b7b1f95b..9c7b2b368ad9d0377cd3284be39132122cfeb752 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 a87d045f5e82377c1cb23841dc5ead36e6ed8840..bace6db7f1aa632f16c9d70de8f8ede1f8ffcd49 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 b2baaea511ad5fc30704f125e40f49e06a2117e0..009c3b087bef8d6556e071306846d210b548dd90 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 47b6345e6bc89249e523d7572d2f69f3a8a14962..874531d82a76904f3109fc6c5f24f4c3c2fb25f5 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 844a470a188d7cd7d9ab46802994bcafb479b618..8c956b5675bb57fd2b02e701dedb39d7beb78d54 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 80fbe6e1b79a495e18b2c7f737860e3707346e5f..aa65b79d6f60e8aa8fb98b2a6054b2a22b3c02f4 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 658011557d9ddbaebe3bccf8b222fbb89d7c8596..7b31e020ba98d5622486e35bbdba5d108e7c32e4 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 5d11be07dd4480bd2b297fcbb00b59eba50d570f..f17c6f8d30e10a924eaa09f35eef23b9cf2f90de 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 93a69bdc92c5cbc54646f955c4587e2972ae3454..b135767f8770416490266dcd3e8589de94955300 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 85c172f08333d6c877ddc5bea7a1f3fdd9942258..442fabe37095fa1ee7eb88d306f767cc7183cfdb 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 87be586c46380cb40d1c5aef76bd9b3da9751eb4..40ab2505ecaffd12710fe6116f87dd2fca404769 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 bead04555daebb41680d1641c4a63f2805c2076e..38d1d1b4f54b6c41db2d94fdc5e6f396a6704280 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 c4164b84cafe2c3ab3c6b60a2b64fce543d1a7cd..cb4bf97592b12d8ab326c936961242105a6b5e28 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 b85b15dd434c845ec9c1d2ff69409ba1f615b35f..b94a6669b100de1cbe8bb9a5c880b703967d05d1 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 a548e109eae8f584ca672fc4922a3612551bcb9f..42a54f5993cf18bb5a9ee2073eb940d919660cfd 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 f21f1adc0e924924fbcf05b84eb248a36b5e8682..e6eba77091c6ea9a72aa8f5659f82d76d5f04116 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 2572faeafdf783ebad352a11ff8f0f2f07348323..1baf317ccdfe314e18c8f01a275430de7acbbbe8 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 24246cbe11d72a9085a07ed9b3f0c83bcc7cda0d..121931250e48a482583ca3994f443d51bcb5489d 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 3190de2a2e7ad736ee2e483c4ef604f88137f4a3..6096c6552d3e21e63ec29a99efbefcfc0cfb20c3 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 ca1530f1d31d7f7c27a712855c1fc2471534fa28..bdeb9fd9d9e2d36c6d282cc57f833f99b231ac1b 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 1fc9353639a98c6b9fa548d32a2fb74c7fe47f92..225ffaa4f8dc6f6fb14580cb8f7b7736fe36b261 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 5e6009fe46fd6250340b064b20e86761a7224b11..6584537fadbdcab15609ca49889d695a8385f16d 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 9a6dfeb983e32fe76eca44685719f0089ed2fbad..550309e98d24f2da6cef26f3616d7c6867dd2d30 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 ec0dd72da83af712ba868b896bedfed5945adb29..5735beb152fb332ae5d007ad56115d339b6f5194 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 57f2688d9cc4b5193bcf8f955eec79ab6b36d2b4..cfa726e7c0dfedcc53af335072141b200db467c2 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 498e1ef3167d6b770bc0a92b8bafd4af90f02f06..a8197b2a1d150b557ee1a2df6d86b236285e306a 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 00e811fb4bdb9bec7e9e507e73c10a8146b1eb08..5ce3e9d558a5fec97c9e9448dd6589ea2fbdf5d2 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 c5988c44ab9a44890422bcaa360fd699d428cd15..31c2e0882b8b0bdc850c9e9888c36f2c8a4f6e10 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 5c5cd3aa6d4afaee594065bf6abd48c63e0d5d29..cf7f2d9b207d11ac281fbbe2746395fe55b9fb6a 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 01fa7fd6952cf65c8c4072a9da539975d539cac4..3dcd20a3cacc9b41052d03c48e00f1d0c86109f5 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 b0a6d2833006a4f141ee1b7fb3bd637870a5082f..8b6d006af9985162e787b0e4cd227cb13866c41d 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 7d9f7fd4c4a3314dd2edfcd030519bcc71b77085..75a94dd71a30935347496ca4c6e57e1846448537 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 9c09c50ce8d806b7d22f34aaf94e645782737485..b6f16ce676b7c093925a3f85933d6058cda22ecb 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 21e1af3da5c1a067099996ba19758488e0ac2600..71e5a59d133a4db338328977f4f95a5dbfb8e246 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 ec4a592ec28bce3566ed4d4d0513694438691886..487a09472017f58fdf60458a3c603a2f3ef3ebaf 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 40217acb6af675c5c45016c26906b86becb3b7b3..1b5bb4aac5b28621b4f22b77392e2463f8ce3488 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 89324fbe6df5c32e5ad31b7c567937e5ce3eb7a5..3a4c35a20e31b259cddd3fc0cfea4bf1d87d95d8 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 431f7ab02919fe5211ada039fb0b06d0abde0789..8499459199b54a655bf9ea78a5e5743bc8aa72fc 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 45598783c98337aa0d860837567982890177905e..7f99b1d1d47d7fb4e96713213f3ecababd718915 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 bd663162ec9a6b74ed586300d99dfbe597d838d0..dedd8367ff870eec0a81e0cfefc9c7707fe2a947 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 665a9a870a53f5042ad0e87cdf75ce1e5cdec20e..55881f65aa0e3c5e02cd0ea099093dd16ef45379 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 d645d91c7cd6a72e4df391179c4d04e9461075ed..0850d0231cc604b4e7f5a5c9a3caec059b819adf 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 4e49cd54bf5b7c8e5a773f52f6e101e1264d0dee..ed9e68e28cc7bff136a697d4b1716f3421f92a23 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 badd0d2aec7ee3e8e26343e05dad6ced9bf37240..51adfc7c3ed7f46c9f2983b33abad630936bcb20 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 38b271989310268cc71b4bb95dab361b515944bc..141ee743556edfb836c10755a77735ca04b46471 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 d24f1ad6ff87ba836f8b774f22faa86e4f3c05ca..f48b0328124c735e4c003f50e7cec475449c6edf 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 7ffba7d85b5a5381b873b00ddd112e47db959396..e4915c755efb69c49e0d9499db4e98f5ca1f90ad 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 052b08adbf6b7e339547c3c38b47b2399a928466..100d921ceb2f46b2f2095ec378c7709c67afe22a 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 ca6fcdb660bab88197c06c2cca7f39fb854ab9e3..17987b7a559a718caa932b876292d7ec5e3eb72c 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 c629bffd7345d93f2f668f02acccdaaeb5479db0..30f9914587ef2970e1522f5ae8d89eeef1601650 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 dfc1a8a1a53474c69aeb16b2ed451129c6a0a6c8..bf83f530573e4d027656eb44419774c55b10c6fd 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 adc5548867135cb3f51341b38bb8e782fc97d0ed..69cc1b83aaa91791655415292217a22915a32909 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 185ba4e5eb6dd45d2794d241c7e61e6123c52ecf..0267e80225ef58785794268c2e9f29e2fdb0f928 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 8eaad57e804d486830b0f3412e656f2733a66689..378af07f64685bed667819b0a2541d9b498ab7f5 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 19c8ae481117112506b8e962a59c6b672f6f3255..e0a0227a68b20141a27ec8b78e9ddd32eca5fcda 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 76653030a69ace66a58e9fd1e74d668c79f0c2c6..63b7e5a4f53c672b9fd2a03942dbc3743213e02a 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 bf1c7731f1a212a3346863b59a5895a15d4634c4..456d9b73b41d22b69f83ba5bcf586d5ee5163883 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 2f815a8eb6a356afac07f1136f745519a3d86d31..4f46eccf86c7b25a35a19231516d0cebe7b2cf21 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 0000000000000000000000000000000000000000..65f330c7052fe3e6276be5e44e343283f42a3fb6
--- /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 f52ac819c4899433938b0e26f8ef2178c454fe68..aaf7d7daf55ea5698822197817db048bdebee7a4 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 eda17800743954e702850d02d5559f0d2c993d2b..fb34a55908f6a721914f9fcde6fb8e4953f73589 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 527ddbf6ffce66c122a7a03923d0a5e2178184c7..417af0f24293989aee22a9f84499cde30f8d8a6e 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 9f5659a044f52d651a1e64b1d30269d1dd16cc90..427c5ea2a9aa79e6c32866779b4315056171fd88 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 4e0e9e3834046abd93613820e5f95353e9a0f134..3313cf87b05a6f00b1aa82237fd90bab7f76e3cb 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 7c614931a15b53286e2a72bd0f938f98d144f5c6..0a99487ef92f44a3b7b25134765727dfc994d501 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 4a41629c5b1577a391577d4d49b7e3ec49e61516..3be8e04530f9b725e2831de746ba8c1875143b98 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 49f92f97a9d3eec256ad75bed0cf5c03998032cc..012522b6005222f40cf92033a48804da0f28596e 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 ecc3cdef99ed8827390698130c32cf672087e13f..ce6d2d8113c69fde7724259fde28cbc46c5247ee 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 05a5bcdfb5431c95b73aae98ba90e61cea92da23..2fa2f059d78d303c7df34748860eca66f070363a 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 4760175e2973bea63bd59657440b034ff4053bac..022bc2dbc7c8c1f670ac868ea06685a9009981c4 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 c4adf726298f09b0cf53ab4bf47ca564aa45e5d4..584d44e4f5bb66ce8c2d55d7891992178776160e 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 783982bbc36c28ec1cf26e9c2fd41df976d0bc5d..53e15de8816e96d0e91bee393bb1242dce51c9c6 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 a515c26311b661735914e246b33bc0da25760cf5..ffb6c91a0690eaabb52bb7c45199b0255506deb3 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 2e11d6f9bbc63ffd2e1d39f473b5238e8251a930..996edb3e84a4589be73f31a5e5cd61e9d9517e45 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 d7ef0e797441b6f2eaaaaf2d6929f651210e6ac5..63345f54b0e57c527144cfdd7566871ea6fbb6d8 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 8512ba329abc09b97005d997a20429dceb0100a1..c67cac62c77b044ed564cf86767229d862b80f89 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 d6b3a9a44e0ca43b683146a7b107b73a49cb6101..408750a521d7d321a4be45303b5114dee9cdd56e 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 32bc79b988ad465e5a424e6440085c88f3eaf7be..a7a7996d7a71226f7fb46863be92343e5f6dcd5d 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 791e0880b4d4b5867ec5feafa12c604b187be80f..78ceb34de931b4e3df2b770d489e88c302dbd4fb 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 ccd227f754062c68bbb2d555e70845a7686c70c1..edfa5acfb8fd94e7510125d1ce3a86b52912689e 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 ecd81c82e06c7ab2fd16532dc133a430f355c1ac..e1f5774209d43abdba9d29e0060aacc586be3afa 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 55986823e32c7c5ed064b32066d16d7cfebf92bf..6e60e5f6f97a7438af1e7323030ab8d82aecd174 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 0b979bb0251a5f8079ea88e4ebcdecfc5c598c54..1dacea3264ec0487a9e7c4d4cfeb06b40375c6ec 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 31096e92c1dc272628497ae774945fa330d5f04e..e237e0dd31d83642f80663ed48b7c083498cad63 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 e5a8ad523bc938e5d3de6d52eb13db4a79a5f9f7..8eaf880fe6e80157b7199d37dbf5b75606925a53 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 6869da63051e1032c98370c1687ea670aa4e3911..182932591f79a60f66345ee4b1cbda80f77f8561 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 228d0d83ac625206f0078b0b072e15404ecc630a..824b43e811f87bc2d809ebb1156cf0c720dcd6c8 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 8b23a520512c716ef15243a8beaf8c5616c78664..a14fc38c543ae11787bd3ed28bda4f1ed1f1f803 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 4b3fae1127cfae9b6ab6b9c63d05aee8918ea949..644f29a1c063de596a9d15081778b2bd23ef784f 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 2f34fd7832d2b92e3ed7cfbc587fcfeeac0390f5..bf6297265c7b2174d56c55ab2ee8ae607758cbd8 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 234d337b72ad9ec068e35df3a04ccd0982366414..2dceba711fb75b932e5c91cfb7b194bbae19998f 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 710a760027922a051b08d587990a9c3e817c545b..424ef961278f839a79b251a7846d6599e4ac8d46 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 89b81fbdf9de8a387afad952884a95c28d8b581f..faa5a5f420f7c2f6f259b03f79cf01012c4748f7 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 5eb18c428a9dde0ae9760a2a5c82b5915fb357bb..9b0d149bc327ed2bdfc6c9f79e6eeacfb5c8a0ba 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 c2cb329ff9dd8c7867a18af8cc0965eb36da4ee1..6233d4a91b33418d3b0326e310809d2916b2de48 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 97f9d90344b8ebc5f3e1c849c0f896138256dee6..f0901d1b7039d9082dd6ed3569af9bf364d72f40 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 7ec32843969b0cda1bcd02ed6ee07d48774f19c0..931d14fd901d97a94059ee8397880b4d5e05ff5a 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 908b2b39325563310e7e3d8f4776f0156d5a0595..ae0472195dbabc287b251b2550f7677ecdfd0cd7 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 4063545fa0ddc942a767d0f918ac6fcf5da58607..1a01e29c6fbe01d8d30a080bf05f1cfa5f43a24d 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 79e9dc9cd4e25996e8f49a78ebdef783f8fa180b..aedbc3566f44d99ccc0cc5e7c8fec198b3211c90 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 c59352b27e9f02f32c5e9b3a13905a5139045919..0f3633a568c7355f83c30389bcedeb34db601ce5 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 d019b67aec05e99ced33ed0cf9cb8a7d02fbd074..9086a78828512884bf42036e5f3ef3e9babc5597 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 60a69cbef807dbc7a019c8160e5c3db7d0bd0464..0448c509ee0a370b07947bba1f3090c64f9c2b6d 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 6a0593474e21701abcd608c4f85716d7ca73e71b..f80114989ce5515267d5d8265105243700b6df10 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 0000000000000000000000000000000000000000..2b68d1b534dc31c88c165364066e68b45f5df927
--- /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 ef6a6aa207df5fc97812d6b9abbf0ce580636f33..cb8291d28632befc0e92a15ad47ec38f8258e8f6 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 2df26b61d3177f05bfc35d32e1c1e257da0f29d0..58926892dfa4786e5baaa3a9413bbf04df96390c 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 8c59d3e1da8baf147b1b2a88648cd8cbea6f8bf1..6fb932c020ceed6607248d076906dfeb790db2a5 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 389adbd157b4765fb3cb35f02af90577dcbd673e..dee15759db4c51d2f8c9ee88d66a2bfde8af081b 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 b709ae03e81c29d31883b0b6aad2682b85ccb28a..1661343557cd7a9018241c07c85d25637b13d928 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 07f1287108e808d31efdcc70a63d95ae7ac5c5e6..cd0095811a842b11aa2d3bc2d54d95c60d93a0b9 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 6eab05807e54329ef27b06f89280480287dde39d..728268de134ef3e58d74fbfcaf3c3756fbb02d1c 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 02245c300be3d8abb5e5dbe6cc0fa6f7a70e1864..c8ad534ffe4d84a832ba4e4986eacc1e62d72501 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 c276985c64d2fb5fd6870f39b100f9518a7996e3..fb40078fd1e4b121b02684800cf22d7c7537a2c0 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 bcbbc7b7ad4b81d25cf4c0cf41fb93691e525955..ab7123da2b10ac22081e798867e8584315fdc9d7 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 4e274d22d5b9f16575c6685f6df67bfae4a67dc4..b451b128841267d75fb3317116152b34c101f24e 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>
 //
 //======================================================================================================================