diff --git a/src/mesh/ItemArrayUtils.hpp b/src/mesh/ItemArrayUtils.hpp
index 618dc8c8e061e55f9db3950b7cff71b3b281b111..6025bd0f3b17763be3f4b6646ab6730be0d6de18 100644
--- a/src/mesh/ItemArrayUtils.hpp
+++ b/src/mesh/ItemArrayUtils.hpp
@@ -23,4 +23,27 @@ synchronize(ItemArray<DataType, item_type, ConnectivityPtr>& item_array)
   }
 }
 
+template <typename DataType, ItemType item_type, typename ConnectivityPtr>
+bool
+isSynchronized(ItemArray<const DataType, item_type, ConnectivityPtr> item_array)
+{
+  bool is_synchronized = true;
+
+  if (parallel::size() > 1) {
+    ItemArray<std::remove_const_t<DataType>, item_type> item_array_copy = copy(item_array);
+    synchronize(item_array_copy);
+    for (ItemIdT<item_type> item_id = 0; item_id < item_array_copy.numberOfItems(); ++item_id) {
+      for (size_t i = 0; i < item_array.sizeOfArrays(); ++i) {
+        if (item_array_copy[item_id][i] != item_array[item_id][i]) {
+          is_synchronized = false;
+        }
+      }
+    }
+
+    is_synchronized = parallel::allReduceAnd(is_synchronized);
+  }
+
+  return is_synchronized;
+}
+
 #endif   // ITEM_ARRAY_UTILS_HPP
diff --git a/src/mesh/ItemValueUtils.hpp b/src/mesh/ItemValueUtils.hpp
index ab39d5c5c6423dac3d8c7d3fd2c1cbeffd1a9809..b5151953c8bff1501124b027ef82c259c7bc17b7 100644
--- a/src/mesh/ItemValueUtils.hpp
+++ b/src/mesh/ItemValueUtils.hpp
@@ -304,4 +304,26 @@ synchronize(ItemValue<DataType, item_type, ConnectivityPtr>& item_value)
   }
 }
 
+template <typename DataType, ItemType item_type, typename ConnectivityPtr>
+bool
+isSynchronized(const ItemValue<DataType, item_type, ConnectivityPtr>& item_value)
+{
+  bool is_synchronized = true;
+
+  if (parallel::size() > 1) {
+    ItemValue<std::remove_const_t<DataType>, item_type> item_value_copy = copy(item_value);
+    synchronize(item_value_copy);
+    for (ItemIdT<item_type> item_id = 0; item_id < item_value_copy.numberOfItems(); ++item_id) {
+      if (item_value_copy[item_id] != item_value[item_id]) {
+        is_synchronized = false;
+        break;
+      }
+    }
+
+    is_synchronized = parallel::allReduceAnd(is_synchronized);
+  }
+
+  return is_synchronized;
+}
+
 #endif   // ITEM_VALUE_UTILS_HPP
diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp
index 998e6388678921576e45abfefc3e27d30d032e63..508f77a39123492376a5141662f4b3daa41476f9 100644
--- a/src/utils/RandomEngine.cpp
+++ b/src/utils/RandomEngine.cpp
@@ -4,6 +4,29 @@
 
 std::unique_ptr<RandomEngine> RandomEngine::m_instance;
 
+bool
+isSynchronized(const RandomEngine& random_engine)
+{
+  const uint64_t current_seed      = random_engine.getCurrentSeed();
+  const uint64_t parallel_max_seed = parallel::allReduceMax(current_seed);
+
+  return parallel::allReduceAnd(current_seed == parallel_max_seed);
+}
+
+uint64_t
+RandomEngine::getCurrentSeed() const
+{
+  std::ostringstream ostr;
+  ostr << m_random_engine;
+
+  std::istringstream istr(ostr.str());
+
+  uint64_t current_seed;
+  istr >> current_seed;
+
+  return current_seed;
+}
+
 void
 RandomEngine::create()
 {
@@ -18,23 +41,22 @@ RandomEngine::destroy()
 
 RandomEngine::RandomEngine()
 {
-  m_initial_seed = std::random_device{}();
-  parallel::broadcast(m_initial_seed, 0);
+  uint64_t random_seed = std::random_device{}();
+  parallel::broadcast(random_seed, 0);
 
-  m_random_engine = std::default_random_engine(m_initial_seed);
+  m_random_engine = std::default_random_engine(random_seed);
 
   std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
-            << m_initial_seed << rang::style::reset << '\n';
+            << random_seed << rang::style::reset << '\n';
 }
 
 void
 RandomEngine::setRandomSeed(const uint64_t random_seed)
 {
-  m_initial_seed  = random_seed;
-  m_random_engine = std::default_random_engine(m_initial_seed);
+  m_random_engine = std::default_random_engine(random_seed);
 
   std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
-            << m_initial_seed << rang::style::reset << '\n';
+            << random_seed << rang::style::reset << '\n';
 }
 
 void
diff --git a/src/utils/RandomEngine.hpp b/src/utils/RandomEngine.hpp
index 4df44d3c15f3066ca6b4d5f6310fb6db77f4869a..77af2e4970e7c98f5ceee6ef065cfa284c8d8627 100644
--- a/src/utils/RandomEngine.hpp
+++ b/src/utils/RandomEngine.hpp
@@ -12,7 +12,6 @@ class RandomEngine
  private:
   static std::unique_ptr<RandomEngine> m_instance;
 
-  uint64_t m_initial_seed;
   std::default_random_engine m_random_engine;
 
   RandomEngine();
@@ -21,8 +20,12 @@ class RandomEngine
   void setRandomSeed(const uint64_t random_seed);
   void resetRandomSeed();
 
+  friend bool isSynchronized(const RandomEngine& random_engine);
+
   static void create();
 
+  uint64_t getCurrentSeed() const;
+
   PUGS_INLINE
   std::default_random_engine&
   engine()