diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp
index 20fdc4842ce2b50ae5851107e104b2b52e93a26c..d631fcf3c1f612d154423cc9595248c153987059 100644
--- a/src/utils/Messenger.cpp
+++ b/src/utils/Messenger.cpp
@@ -50,3 +50,23 @@ Messenger::
   MPI_Finalize();
 #endif // PASTIS_HAS_MPI
 }
+
+
+void Messenger::barrier() const
+{
+#ifdef PASTIS_HAS_MPI
+  MPI_Barrier(MPI_COMM_WORLD);
+#endif // PASTIS_HAS_MPI
+}
+
+Array<int> Messenger::
+_broadcast(Array<int>& array, int root_rank) const
+{
+  int size = array.size();
+  MPI_Bcast(&size, 1,  MPI_INT, root_rank, MPI_COMM_WORLD);
+  if (commRank() != root_rank) {
+    array = Array<int>(size);
+  }
+  MPI_Bcast(&(array[0]), array.size(), MPI_INT, root_rank, MPI_COMM_WORLD);
+  return array;
+}
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index 94e551c9a9c618fa4b8f5d5c20358767ba3cc640..a0bd59328cbfa9f3486972072fc615eb9f5fd71c 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -4,6 +4,8 @@
 #include <PastisMacros.hpp>
 #include <PastisAssert.hpp>
 
+#include <Array.hpp>
+
 class Messenger
 {
  private:
@@ -12,6 +14,9 @@ class Messenger
 
   int m_rank{0};
   int m_size{1};
+
+  Array<int> _broadcast(Array<int>& array, int root_rank) const;
+
  public:
   static void create(int& argc, char* argv[]);
   static void destroy();
@@ -35,6 +40,20 @@ class Messenger
     return m_size;
   }
 
+  void barrier() const;
+
+  template <typename DataType>
+  PASTIS_INLINE
+  Array<DataType> broadcast(const Array<DataType>& array, int root_rank) const
+  {
+    if constexpr(std::is_same<DataType, int>()) {
+      Array<int> int_array = array;
+      return _broadcast(int_array, root_rank);
+    } else {
+      static_assert(std::is_same<DataType, int>(), "unexpected type of data");
+    }
+  }
+
   Messenger(const Messenger&) = delete;
   ~Messenger();
 };
@@ -59,5 +78,17 @@ const int& commSize()
   return messenger().size();
 }
 
+PASTIS_INLINE
+void barrier()
+{
+  return messenger().barrier();
+}
+
+template <typename DataType>
+PASTIS_INLINE
+Array<DataType> broadcast(const Array<DataType>& array, int root_rank)
+{
+  return messenger().broadcast(array, root_rank);
+}
 
 #endif // MESSENGER_HPP