diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index 21e17abf24600869b619a66415dc51714ec2cb70..ac79ee8490882a1bac8a9fd74db58b6cd8dccdb7 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -766,6 +766,15 @@ class Messenger
         CastArray cast_array = cast_value_to<CastType>::from(data);
         _broadcast_array(cast_array, root_rank);
       }
+    } else if constexpr (std::is_same_v<std::string, DataType>) {
+      Array s = convert_to_array(data);
+      broadcast(s, root_rank);
+      if (m_rank != root_rank) {
+        data.resize(s.size());
+        for (size_t i = 0; i < s.size(); ++i) {
+          data[i] = s[i];
+        }
+      }
     } else {
       static_assert(is_false_v<DataType>, "unexpected type of data");
     }
diff --git a/tests/test_Messenger.cpp b/tests/test_Messenger.cpp
index 4f76e250ddab60d81e1d49eacb1bcfc23425e317..4565614fbcd4e4dc387527b77ddb1be23b092e23 100644
--- a/tests/test_Messenger.cpp
+++ b/tests/test_Messenger.cpp
@@ -223,6 +223,18 @@ TEST_CASE("Messenger", "[mpi]")
       parallel::broadcast(value, 0);
       REQUIRE((value == mpi_check::tri_int{6, 2, 4}));
     }
+
+    {
+      std::string data;
+      if (parallel::rank() == 0) {
+        data = "foo";
+      } else {
+        data = "bar";
+      }
+
+      parallel::broadcast(data, 0);
+      REQUIRE(data == "foo");
+    }
   }
 
   SECTION("broadcast array")