diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp
index 508f77a39123492376a5141662f4b3daa41476f9..9b7efc162c4d2d7b0ff912689b9f718eae39af5b 100644
--- a/src/utils/RandomEngine.cpp
+++ b/src/utils/RandomEngine.cpp
@@ -41,13 +41,7 @@ RandomEngine::destroy()
 
 RandomEngine::RandomEngine()
 {
-  uint64_t random_seed = std::random_device{}();
-  parallel::broadcast(random_seed, 0);
-
-  m_random_engine = std::default_random_engine(random_seed);
-
-  std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
-            << random_seed << rang::style::reset << '\n';
+  this->resetRandomSeed();
 }
 
 void
@@ -62,5 +56,8 @@ RandomEngine::setRandomSeed(const uint64_t random_seed)
 void
 RandomEngine::resetRandomSeed()
 {
-  m_instance = std::unique_ptr<RandomEngine>(new RandomEngine);
+  uint64_t random_seed = std::random_device{}();
+  parallel::broadcast(random_seed, 0);
+
+  this->setRandomSeed(random_seed);
 }
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7904eedc03c7a203667e5c604096a5cded6e136b..e112df5a6cff9d7a7a83696017e16dd79ddfb136 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -113,6 +113,7 @@ add_executable (mpi_unit_tests
   test_ItemValueUtils.cpp
   test_Messenger.cpp
   test_Partitioner.cpp
+  test_RandomEngine.cpp
   test_SubItemValuePerItem.cpp
   test_SubItemArrayPerItem.cpp
   )
diff --git a/tests/mpi_test_main.cpp b/tests/mpi_test_main.cpp
index 51a01b0cfa99b36995b8849fc1fdb94360d971ad..4c94634173799a17519b5d417bfc914a99e2e740 100644
--- a/tests/mpi_test_main.cpp
+++ b/tests/mpi_test_main.cpp
@@ -9,6 +9,7 @@
 #include <mesh/SynchronizerManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PETScWrapper.hpp>
+#include <utils/RandomEngine.hpp>
 #include <utils/pugs_config.hpp>
 
 #include <MeshDataBaseForTests.hpp>
@@ -57,6 +58,7 @@ main(int argc, char* argv[])
       std::cout.setstate(std::ios::badbit);
 
       SynchronizerManager::create();
+      RandomEngine::create();
       MeshDataManager::create();
       DiamondDualConnectivityManager::create();
       DiamondDualMeshManager::create();
@@ -89,6 +91,7 @@ main(int argc, char* argv[])
       DiamondDualMeshManager::destroy();
       DiamondDualConnectivityManager::destroy();
       MeshDataManager::destroy();
+      RandomEngine::destroy();
       SynchronizerManager::destroy();
     }
   }
diff --git a/tests/test_RandomEngine.cpp b/tests/test_RandomEngine.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..241b40dbe958b68ccf631fce2291affca9e1e29c
--- /dev/null
+++ b/tests/test_RandomEngine.cpp
@@ -0,0 +1,52 @@
+#include <catch2/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_all.hpp>
+
+#include <utils/Messenger.hpp>
+#include <utils/RandomEngine.hpp>
+
+#include <utils/pugs_config.hpp>
+
+// clazy:excludeall=non-pod-global-static
+
+TEST_CASE("RandomEngine", "[random]")
+{
+  SECTION("current state")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    REQUIRE(isSynchronized(random_engine));
+  }
+
+  SECTION("set seed")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    random_engine.setRandomSeed(1402339680);
+
+    REQUIRE(isSynchronized(random_engine));
+
+    REQUIRE(random_engine.getCurrentSeed() == 1402339680);
+  }
+
+  SECTION("reset seed")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    random_engine.resetRandomSeed();
+
+    REQUIRE(isSynchronized(random_engine));
+  }
+
+  SECTION("de-synchronize seeds")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    random_engine.resetRandomSeed();
+    auto& engine = random_engine.engine();
+
+    for (size_t i = 0; i < parallel::rank(); ++i) {
+      engine();
+    }
+
+    REQUIRE(((parallel::size() == 1) or not isSynchronized(random_engine)));
+
+    random_engine.resetRandomSeed();
+    REQUIRE(isSynchronized(random_engine));
+  }
+}
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
index b5316614d10c21cbe13bb5540cc0a13d7e4b4b24..9c03ba9213ece8947688036ca7d5554c8e38a279 100644
--- a/tests/test_main.cpp
+++ b/tests/test_main.cpp
@@ -9,6 +9,7 @@
 #include <mesh/SynchronizerManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PETScWrapper.hpp>
+#include <utils/RandomEngine.hpp>
 #include <utils/SLEPcWrapper.hpp>
 
 #include <MeshDataBaseForTests.hpp>
@@ -34,6 +35,7 @@ main(int argc, char* argv[])
       std::cout.setstate(std::ios::badbit);
 
       SynchronizerManager::create();
+      RandomEngine::create();
       MeshDataManager::create();
       DiamondDualConnectivityManager::create();
       DiamondDualMeshManager::create();
@@ -51,6 +53,7 @@ main(int argc, char* argv[])
       DiamondDualMeshManager::destroy();
       DiamondDualConnectivityManager::destroy();
       MeshDataManager::destroy();
+      RandomEngine::destroy();
       SynchronizerManager::destroy();
     }
   }