diff --git a/src/main.cpp b/src/main.cpp
index aad67d58a5d228cdc502e9b024cfc497fef23291..cf382d69b491e85968d977e9023ac094d81c3bc2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,10 +1,10 @@
-#include <utils/PugsUtils.hpp>
-
 #include <language/PugsParser.hpp>
 #include <mesh/DiamondDualConnectivityManager.hpp>
 #include <mesh/DiamondDualMeshManager.hpp>
 #include <mesh/MeshDataManager.hpp>
 #include <mesh/SynchronizerManager.hpp>
+#include <utils/PugsUtils.hpp>
+#include <utils/RandomEngine.hpp>
 
 int
 main(int argc, char* argv[])
@@ -12,6 +12,7 @@ main(int argc, char* argv[])
   std::string filename = initialize(argc, argv);
 
   SynchronizerManager::create();
+  RandomEngine::create();
   MeshDataManager::create();
   DiamondDualConnectivityManager::create();
   DiamondDualMeshManager::create();
@@ -21,7 +22,10 @@ main(int argc, char* argv[])
   DiamondDualMeshManager::destroy();
   DiamondDualConnectivityManager::destroy();
   MeshDataManager::destroy();
+  RandomEngine::destroy();
   SynchronizerManager::destroy();
+
   finalize();
+
   return 0;
 }
diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index 7639963d4fc73094f2e79f64e9f9c9383426ac43..19feb273c4a6e2ad09818f467caa9f0f79636b35 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -12,6 +12,7 @@ add_library(
   Partitioner.cpp
   PETScWrapper.cpp
   PugsUtils.cpp
+  RandomEngine.cpp
   RevisionInfo.cpp
   SignalManager.cpp
   SLEPcWrapper.cpp)
diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..998e6388678921576e45abfefc3e27d30d032e63
--- /dev/null
+++ b/src/utils/RandomEngine.cpp
@@ -0,0 +1,44 @@
+
+#include <utils/Messenger.hpp>
+#include <utils/RandomEngine.hpp>
+
+std::unique_ptr<RandomEngine> RandomEngine::m_instance;
+
+void
+RandomEngine::create()
+{
+  m_instance = std::unique_ptr<RandomEngine>(new RandomEngine);
+}
+
+void
+RandomEngine::destroy()
+{
+  m_instance.reset();
+}
+
+RandomEngine::RandomEngine()
+{
+  m_initial_seed = std::random_device{}();
+  parallel::broadcast(m_initial_seed, 0);
+
+  m_random_engine = std::default_random_engine(m_initial_seed);
+
+  std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
+            << m_initial_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);
+
+  std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
+            << m_initial_seed << rang::style::reset << '\n';
+}
+
+void
+RandomEngine::resetRandomSeed()
+{
+  m_instance = std::unique_ptr<RandomEngine>(new RandomEngine);
+}
diff --git a/src/utils/RandomEngine.hpp b/src/utils/RandomEngine.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4df44d3c15f3066ca6b4d5f6310fb6db77f4869a
--- /dev/null
+++ b/src/utils/RandomEngine.hpp
@@ -0,0 +1,49 @@
+#ifndef RANDOM_ENGINE_HPP
+#define RANDOM_ENGINE_HPP
+
+#include <utils/PugsAssert.hpp>
+#include <utils/PugsMacros.hpp>
+
+#include <memory>
+#include <random>
+
+class RandomEngine
+{
+ private:
+  static std::unique_ptr<RandomEngine> m_instance;
+
+  uint64_t m_initial_seed;
+  std::default_random_engine m_random_engine;
+
+  RandomEngine();
+
+ public:
+  void setRandomSeed(const uint64_t random_seed);
+  void resetRandomSeed();
+
+  static void create();
+
+  PUGS_INLINE
+  std::default_random_engine&
+  engine()
+  {
+    return m_random_engine;
+  }
+
+  PUGS_INLINE
+  static RandomEngine&
+  instance()
+  {
+    Assert(m_instance.get() != nullptr, "undefined random engine instance");
+    return *m_instance;
+  }
+
+  static void destroy();
+
+  RandomEngine(const RandomEngine&) = delete;
+  RandomEngine(RandomEngine&&)      = delete;
+
+  ~RandomEngine() = default;
+};
+
+#endif   // RANDOM_ENGINE_HPP