diff --git a/src/core/timing/TimingTree.h b/src/core/timing/TimingTree.h
index e7fcda9607cce0ec230add8f41302db482bc8a47..32ed44549b97482bf4a06604588f5a7d2311f336 100644
--- a/src/core/timing/TimingTree.h
+++ b/src/core/timing/TimingTree.h
@@ -1,15 +1,15 @@
 //======================================================================================================================
 //
-//  This file is part of waLBerla. waLBerla is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -68,16 +68,19 @@ public:
    /// Resets the the timing hierarchy
    void reset();
 
-   //** Reduction ******************************************************************************************************
-   /*! \name Reduction */
-   //@{
    /// Collects all the timing data from different processes
-   TimingTree<TP> getReduced( ReduceType rt = REDUCE_TOTAL, int targetRank = 0 ) const;
+   ///
+   /// \param rt type of reduction used
+   /// \param targetRank
+   /// \param callSynchronize call synchronize() before doing the reduction
+   /// \return
+   ///
+   /// \attention Setting callSynchronize to false can lead to deadlocks during reduction if different ranks
+   ///            have different timing nodes! Setting it to true causes an additional communication.
+   TimingTree<TP> getReduced( ReduceType rt = REDUCE_TOTAL, int targetRank = 0, bool callSynchronize = true ) const;
 
    /// Adds entries which only exist on other processes. Has to be collectively called on all processes!
    void synchronize();
-   //@}
-   //*******************************************************************************************************************
 
    /// Returns the raw tree data structure
    const TimingNode<TP>& getRawData() const;
@@ -109,15 +112,15 @@ std::ostream& operator<<( std::ostream& os, const TimingTree<TP>& tt )
 
 template< typename TP >  // Timing policy
 TimingTree<TP>::TimingTree()
-   : current_(&root_)
+      : current_(&root_)
 {
 
 }
 
 template< typename TP >  // Timing policy
 TimingTree<TP>::TimingTree(const TimingTree<TP>& tt)
-   : root_(tt.root_)
-   , current_(&root_)
+      : root_(tt.root_)
+      , current_(&root_)
 {
    WALBERLA_ASSERT_EQUAL(tt.current_, &tt.root_, "Copying is only allowed for stopped TimingTrees!\nTimer still running: " << getCurrentTimerName() );
 }
@@ -133,8 +136,8 @@ TimingTree<TP>& TimingTree<TP>::operator=(const TimingTree<TP>& tt)
 template< typename TP >  // Timing policy
 void TimingTree<TP>::swap(TimingTree<TP>& tt)
 {
-    std::swap(current_, tt.current_);
-    std::swap(root_, tt.root_);
+   std::swap(current_, tt.current_);
+   std::swap(root_, tt.root_);
 }
 
 /// \param name timer name. '.' is not allowed in the timer name!
@@ -189,9 +192,13 @@ void TimingTree<TP>::reset()
 }
 
 template< typename TP >  // Timing policy
-TimingTree<TP> TimingTree<TP>::getReduced( ReduceType rt, int targetRank ) const
+TimingTree<TP> TimingTree<TP>::getReduced( ReduceType rt, int targetRank, bool callSynchronize ) const
 {
    TimingTree<TP> tt(*this);
+   if (callSynchronize)
+   {
+      tt.synchronize();
+   }
    reduceInplace( tt.root_, rt, targetRank );
    return tt;
 }