diff --git a/ProcessLib/Output.cpp b/ProcessLib/Output.cpp
index fa94ca94ce7898da61b0a7a0456fb6584c8e3ad2..24c871b8f6a78fb7c1ff2441fc8e9fbd71fbf56c 100644
--- a/ProcessLib/Output.cpp
+++ b/ProcessLib/Output.cpp
@@ -86,25 +86,20 @@ newInstance(const BaseLib::ConfigTree &config, std::string const& output_directo
     return out;
 }
 
-void Output::
-initialize(Output::ProcessIter first, const Output::ProcessIter& last)
+void Output::addProcess(ProcessLib::Process const& process, const unsigned pcs_idx)
 {
-    for (unsigned pcs_idx = 0; first != last; ++first, ++pcs_idx)
-    {
-        auto const filename = _output_file_prefix
-                              + "_pcs_" + std::to_string(pcs_idx)
-                              + ".pvd";
-        _single_process_data.emplace(std::piecewise_construct,
-                std::forward_as_tuple(&**first),
-                std::forward_as_tuple(pcs_idx, filename));
-    }
+    auto const filename =
+        _output_file_prefix + "_pcs_" + std::to_string(pcs_idx) + ".pvd";
+    _single_process_data.emplace(std::piecewise_construct,
+                                 std::forward_as_tuple(&process),
+                                 std::forward_as_tuple(pcs_idx, filename));
 }
 
-void Output::
-doOutputAlways(Process const& process,
-               unsigned timestep,
-               const double t,
-               GlobalVector const& x)
+void Output::doOutputAlways(Process const& process,
+                            ProcessOutput const& process_output,
+                            unsigned timestep,
+                            const double t,
+                            GlobalVector const& x)
 {
     BaseLib::RunTime time_output;
     time_output.start();
@@ -122,33 +117,36 @@ doOutputAlways(Process const& process,
             + "_t_"  + std::to_string(t)
             + ".vtu";
     DBUG("output to %s", output_file_name.c_str());
-    process.output(output_file_name, timestep, x);
+    doProcessOutput(output_file_name, x, process.getMesh(),
+                    process.getDOFTable(), process.getProcessVariables(),
+                    process.getSecondaryVariables(), process_output);
     spd.pvd_file.addVTUFile(output_file_name, t);
 
     INFO("[time] Output took %g s.", time_output.elapsed());
 }
 
-void Output::
-doOutput(Process const& process,
-         unsigned timestep,
-         const double t,
-         GlobalVector const& x)
+void Output::doOutput(Process const& process,
+                      ProcessOutput const& process_output,
+                      unsigned timestep,
+                      const double t,
+                      GlobalVector const& x)
 {
     if (shallDoOutput(timestep, _repeats_each_steps))
-        doOutputAlways(process, timestep, t, x);
+        doOutputAlways(process, process_output, timestep, t, x);
 }
 
-void Output::
-doOutputLastTimestep(Process const& process,
-                     unsigned timestep,
-                     const double t,
-                     GlobalVector const& x)
+void Output::doOutputLastTimestep(Process const& process,
+                                  ProcessOutput const& process_output,
+                                  unsigned timestep,
+                                  const double t,
+                                  GlobalVector const& x)
 {
     if (!shallDoOutput(timestep, _repeats_each_steps))
-        doOutputAlways(process, timestep, t, x);
+        doOutputAlways(process, process_output, timestep, t, x);
 }
 
 void Output::doOutputNonlinearIteration(Process const& process,
+                                        ProcessOutput const& process_output,
                                         const unsigned timestep, const double t,
                                         GlobalVector const& x,
                                         const unsigned iteration) const
@@ -172,7 +170,9 @@ void Output::doOutputNonlinearIteration(Process const& process,
             + "_nliter_" + std::to_string(iteration)
             + ".vtu";
     DBUG("output iteration results to %s", output_file_name.c_str());
-    process.output(output_file_name, timestep, x);
+    doProcessOutput(output_file_name, x, process.getMesh(),
+                    process.getDOFTable(), process.getProcessVariables(),
+                    process.getSecondaryVariables(), process_output);
 
     INFO("[time] Output took %g s.", time_output.elapsed());
 }
diff --git a/ProcessLib/Output.h b/ProcessLib/Output.h
index a5284378f9eadf825b937733c5f0e6ed1e7baa72..8071b2cfadbdad0f1802c89b6d3cbdd2cccb01e5 100644
--- a/ProcessLib/Output.h
+++ b/ProcessLib/Output.h
@@ -13,6 +13,7 @@
 #include "BaseLib/ConfigTree.h"
 #include "MeshLib/IO/VtkIO/PVDFile.h"
 #include "Process.h"
+#include "ProcessOutput.h"
 
 namespace ProcessLib
 {
@@ -29,38 +30,33 @@ public:
     newInstance(const BaseLib::ConfigTree& config,
                 const std::string& output_directory);
 
-    using ProcessIter = std::vector<std::unique_ptr<ProcessLib::Process>>
-                        ::const_iterator;
-
-    //! Opens a PVD file for each process.
-    void initialize(ProcessIter first, const ProcessIter& last);
+    //! TODO doc. Opens a PVD file for each process.
+    void addProcess(ProcessLib::Process const& process, const unsigned pcs_idx);
 
     //! Writes output for the given \c process if it should be written in the
     //! given \c timestep.
-    void doOutput(
-            Process const& process, unsigned timestep,
-            const double t,
-            GlobalVector const& x);
+    void doOutput(Process const& process, ProcessOutput const& process_output,
+                  unsigned timestep, const double t, GlobalVector const& x);
 
     //! Writes output for the given \c process if it has not been written yet.
     //! This method is intended for doing output after the last timestep in order
     //! to make sure that its results are written.
-    void doOutputLastTimestep(
-            Process const& process, unsigned timestep,
-            const double t,
-            GlobalVector const& x);
+    void doOutputLastTimestep(Process const& process,
+                              ProcessOutput const& process_output,
+                              unsigned timestep, const double t,
+                              GlobalVector const& x);
 
     //! Writes output for the given \c process.
     //! This method will always write.
     //! It is intended to write output in error handling routines.
-    void doOutputAlways(
-            Process const& process, unsigned timestep,
-            const double t,
-            GlobalVector const& x);
+    void doOutputAlways(Process const& process,
+                        ProcessOutput const& process_output, unsigned timestep,
+                        const double t, GlobalVector const& x);
 
     //! Writes output for the given \c process.
     //! To be used for debug output after an iteration of the nonlinear solver.
     void doOutputNonlinearIteration(Process const& process,
+                                    ProcessOutput const& process_output,
                                     const unsigned timestep, const double t,
                                     GlobalVector const& x,
                                     const unsigned iteration) const;