diff --git a/Applications/ApplicationsLib/Simulation.cpp b/Applications/ApplicationsLib/Simulation.cpp
index e59f96856acff7e8f2a74742745c4ec9b94bd5db..5886a5cb76ceaef1d45a6bcad9efbc09d329e0a8 100644
--- a/Applications/ApplicationsLib/Simulation.cpp
+++ b/Applications/ApplicationsLib/Simulation.cpp
@@ -25,9 +25,16 @@
 #include "ProcessLib/TimeLoop.h"
 
 Simulation::Simulation(int argc, char* argv[])
-    : linear_solver_library_setup(argc, argv), test_definition{std::nullopt}
+    : linear_solver_library_setup(argc, argv),
+#if defined(USE_PETSC)
+      controller(vtkSmartPointer<vtkMPIController>::New()),
+#endif
+      test_definition{std::nullopt}
 {
 #if defined(USE_PETSC)
+    controller->Initialize(&argc, &argv, 1);
+    vtkMPIController::SetGlobalController(controller);
+
     {  // Can be called only after MPI_INIT.
         int mpi_rank;
         MPI_Comm_rank(PETSC_COMM_WORLD, &mpi_rank);
@@ -161,4 +168,7 @@ Simulation::~Simulation()
         InSituLib::Finalize();
     }
 #endif
+#if defined(USE_PETSC)
+    controller->Finalize(1);
+#endif
 }
diff --git a/Applications/ApplicationsLib/Simulation.h b/Applications/ApplicationsLib/Simulation.h
index aff6ff254e6f31fd4c6b7205fdcecb69d12e47c6..de1ea40647acc52a9f0f004b8aa03d915273a23f 100644
--- a/Applications/ApplicationsLib/Simulation.h
+++ b/Applications/ApplicationsLib/Simulation.h
@@ -10,6 +10,11 @@
  *
  */
 
+#ifdef USE_PETSC
+#include <vtkMPIController.h>
+#include <vtkSmartPointer.h>
+#endif
+
 #include "Applications/ApplicationsLib/LinearSolverLibrarySetup.h"
 #include "Applications/ApplicationsLib/TestDefinition.h"
 
@@ -39,6 +44,9 @@ public:
 
 private:
     ApplicationsLib::LinearSolverLibrarySetup linear_solver_library_setup;
+#if defined(USE_PETSC)
+    vtkSmartPointer<vtkMPIController> controller;
+#endif
     std::unique_ptr<ProjectData> project_data;
     std::optional<ApplicationsLib::TestDefinition> test_definition;
 };