diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp
index 2e0555aefa9de61051e7fb8d35e5592dbe42976b..44e7c5ae5faab3267a532417c878277544b3275e 100644
--- a/ProcessLib/Output/CreateOutput.cpp
+++ b/ProcessLib/Output/CreateOutput.cpp
@@ -98,6 +98,20 @@ std::unique_ptr<Output> createOutput(const BaseLib::ConfigTree& config,
 
     ProcessOutput process_output{output_variables, output_residuals};
 
+    std::vector<std::string> mesh_names_for_output;
+    //! \ogs_file_param{prj__time_loop__output__meshes}
+    if (auto const meshes_config = config.getConfigSubtreeOptional("meshes"))
+    {
+        //! \ogs_file_param{prj__time_loop__output__meshes__mesh}
+        for (auto mesh_config : meshes_config->getConfigParameterList("mesh"))
+        {
+            mesh_names_for_output.push_back(
+                mesh_config.getValue<std::string>());
+            INFO("Configure mesh '%s' for output.",
+                 mesh_names_for_output.back().c_str());
+        }
+    }
+
     auto fixed_output_times_ptr =
         //! \ogs_file_param{prj__time_loop__output__fixed_output_times}
         config.getConfigParameterOptional<std::vector<double>>(
@@ -117,7 +131,8 @@ std::unique_ptr<Output> createOutput(const BaseLib::ConfigTree& config,
                                     data_mode, output_iteration_results,
                                     std::move(repeats_each_steps),
                                     std::move(fixed_output_times),
-                                    std::move(process_output));
+                                    std::move(process_output),
+                                    std::move(mesh_names_for_output));
 }
 
 }  // namespace ProcessLib
diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp
index 9313ba9ffe644960c22334763f9c167c9d25b403..c015f4ecd0f91f7f19380f529390723f6a1e5a08 100644
--- a/ProcessLib/Output/Output.cpp
+++ b/ProcessLib/Output/Output.cpp
@@ -86,7 +86,8 @@ Output::Output(std::string output_directory, std::string prefix,
                bool const output_nonlinear_iteration_results,
                std::vector<PairRepeatEachSteps> repeats_each_steps,
                std::vector<double>&& fixed_output_times,
-               ProcessOutput&& process_output)
+               ProcessOutput&& process_output,
+               std::vector<std::string>&& mesh_names_for_output)
     : _output_directory(std::move(output_directory)),
       _output_file_prefix(std::move(prefix)),
       _output_file_compression(compress_output),
@@ -94,7 +95,8 @@ Output::Output(std::string output_directory, std::string prefix,
       _output_nonlinear_iteration_results(output_nonlinear_iteration_results),
       _repeats_each_steps(std::move(repeats_each_steps)),
       _fixed_output_times(std::move(fixed_output_times)),
-      _process_output(std::move(process_output))
+      _process_output(std::move(process_output)),
+      _mesh_names_for_output(mesh_names_for_output)
 {
 }
 
diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h
index d45d39135c7a08c099e2a71eff9b626cf82f6d2b..43c8f671d77bb264b5c9ce06c99496555b5a195e 100644
--- a/ProcessLib/Output/Output.h
+++ b/ProcessLib/Output/Output.h
@@ -44,7 +44,8 @@ public:
            bool const output_nonlinear_iteration_results,
            std::vector<PairRepeatEachSteps> repeats_each_steps,
            std::vector<double>&& fixed_output_times,
-           ProcessOutput&& process_output);
+           ProcessOutput&& process_output,
+           std::vector<std::string>&& mesh_names_for_output);
 
     //! TODO doc. Opens a PVD file for each process.
     void addProcess(ProcessLib::Process const& process, const int process_id);
@@ -118,6 +119,7 @@ private:
     bool shallDoOutput(unsigned timestep, double const t);
 
     ProcessOutput const _process_output;
+    std::vector<std::string> const _mesh_names_for_output;
 };