diff --git a/src/output/VTKWriter.cpp b/src/output/VTKWriter.cpp
index d33c5e0d2b6f2eaeb5af453ce3c388336f03c61c..a7e588527a3a6fc375661e8a2c33cbf332ae3b71 100644
--- a/src/output/VTKWriter.cpp
+++ b/src/output/VTKWriter.cpp
@@ -431,6 +431,9 @@ VTKWriter::_write(const MeshType& mesh,
       std::visit([&, name = name](auto&& item_value) { return this->_write_cell_pvtu(fout, name, item_value); },
                  item_value_variant);
     }
+    if (parallel::size() > 1) {
+      fout << "<PDataArray type=\"UInt8\" Name=\"vtkGhostType\" NumberOfComponents=\"1\"/>\n";
+    }
     fout << "</PCellData>\n";
 
     for (size_t i_rank = 0; i_rank < parallel::size(); ++i_rank) {
@@ -470,6 +473,15 @@ VTKWriter::_write(const MeshType& mesh,
                    auto&& item_value) { return this->_write_cell_data(fout, name, item_value, serialize_data_list); },
                  item_value_variant);
     }
+    if (parallel::size() > 1) {
+      CellValue<uint8_t> vtk_ghost_type{mesh.connectivity()};
+      auto cell_is_owned = mesh.connectivity().cellIsOwned();
+      parallel_for(
+        mesh.numberOfCells(),
+        PUGS_LAMBDA(const CellId cell_id) { vtk_ghost_type[cell_id] = cell_is_owned[cell_id] ? 0 : 1; });
+
+      _write_array(fout, "vtkGhostType", vtk_ghost_type.arrayView(), serialize_data_list);
+    }
     fout << "</CellData>\n";
     fout << "<PointData>\n";
     for (const auto& [name, item_value_variant] : output_named_item_data_set) {
@@ -659,7 +671,7 @@ VTKWriter::_write(const MeshType& mesh,
 
     fout << "<?xml version=\"1.0\"?>\n";
     fout << _getDateAndVersionComment();
-    fout << "<VTKFile type=\"Collection\" version=\"0.1\">\n";
+    fout << "<VTKFile type=\"Collection\" version=\"2.0\">\n";
 
     fout << "<Collection>\n";
     if (time.has_value()) {