diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp
index 05dfa43e5a22f5223fd6c1e8291302c5366f5015..14891477a2b804c4f0c8698fdfa51a8ea2470c8b 100644
--- a/src/utils/Messenger.cpp
+++ b/src/utils/Messenger.cpp
@@ -9,10 +9,10 @@ namespace parallel
 Messenger* Messenger::m_instance = nullptr;
 
 void
-Messenger::create(int& argc, char* argv[])
+Messenger::create(int& argc, char* argv[], bool parallel_output)
 {
   if (Messenger::m_instance == nullptr) {
-    Messenger::m_instance = new Messenger(argc, argv);
+    Messenger::m_instance = new Messenger(argc, argv, parallel_output);
   } else {
     throw UnexpectedError("Messenger already created");
   }
@@ -28,7 +28,7 @@ Messenger::destroy()
   }
 }
 
-Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[])
+Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[], bool parallel_output)
 {
 #ifdef PUGS_HAS_MPI
   MPI_Init(&argc, &argv);
@@ -66,7 +66,7 @@ Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[])
     return size;
   }();
 
-  if (m_rank != 0) {
+  if ((not parallel_output) and (m_rank != 0)) {
     // LCOV_EXCL_START
     std::cout.setstate(std::ios::badbit);
     std::cerr.setstate(std::ios::badbit);
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index ac79ee8490882a1bac8a9fd74db58b6cd8dccdb7..a04c664d7dcbe36817d2748a6f27e0b8d8dc3481 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -85,7 +85,7 @@ class Messenger
   };
 
   static Messenger* m_instance;
-  Messenger(int& argc, char* argv[]);
+  Messenger(int& argc, char* argv[], bool parallel_output);
 
 #ifdef PUGS_HAS_MPI
   MPI_Comm m_pugs_comm_world = MPI_COMM_WORLD;
@@ -406,7 +406,7 @@ class Messenger
   }
 
  public:
-  static void create(int& argc, char* argv[]);
+  static void create(int& argc, char* argv[], bool parallel_output = false);
   static void destroy();
 
   PUGS_INLINE
diff --git a/src/utils/PugsUtils.cpp b/src/utils/PugsUtils.cpp
index 104e70cddc5cc29d927583adde0ffa53afe72e95..3e759212cb13f0eb448ef19d34691a39883849b0 100644
--- a/src/utils/PugsUtils.cpp
+++ b/src/utils/PugsUtils.cpp
@@ -85,9 +85,10 @@ setDefaultOMPEnvironment()
 std::string
 initialize(int& argc, char* argv[])
 {
-  bool enable_fpe     = true;
-  bool enable_signals = true;
-  int nb_threads      = -1;
+  bool enable_fpe      = true;
+  bool enable_signals  = true;
+  int nb_threads       = -1;
+  bool parallel_output = false;
 
   ParallelChecker::Mode pc_mode = ParallelChecker::Mode::automatic;
   std::string pc_filename       = ParallelChecker::instance().filename();
@@ -132,6 +133,8 @@ initialize(int& argc, char* argv[])
     app.add_flag("--reproducible-sums,!--no-reproducible-sums", show_preamble,
                  "Special treatment of array sums to ensure reproducibility [default: true]");
 
+    app.add_flag("--parallel-output", parallel_output, "All MPI processes output to console [default: false]");
+
     std::map<std::string, ParallelChecker::Mode> pc_mode_map{{"auto", ParallelChecker::Mode::automatic},
                                                              {"write", ParallelChecker::Mode::write},
                                                              {"read", ParallelChecker::Mode::read}};
@@ -169,7 +172,8 @@ initialize(int& argc, char* argv[])
     SignalManager::setPauseForDebug(pause_on_error);
     ReproducibleSumManager::setReproducibleSums(reproducible_sums);
   }
-  parallel::Messenger::create(argc, argv);
+
+  parallel::Messenger::create(argc, argv, parallel_output);
 
   PETScWrapper::initialize(argc, argv);
   SLEPcWrapper::initialize(argc, argv);