diff --git a/src/output/VTKWriter.cpp b/src/output/VTKWriter.cpp
index b5f9800a293fb6f9ee12dbb467c20bc3f58858ba..19a613610cd84689f5ef19d88d774dcb79dd38cd 100644
--- a/src/output/VTKWriter.cpp
+++ b/src/output/VTKWriter.cpp
@@ -606,14 +606,15 @@ VTKWriter::_write(const MeshType& mesh,
 
       Array<unsigned int> offsets(mesh.numberOfCells());
       unsigned int offset = 0;
-      for (CellId j = 0; j < mesh.numberOfCells(); ++j) {
-        const auto& cell_nodes = cell_to_node_matrix[j];
+      for (CellId cell_id = 0; cell_id < mesh.numberOfCells(); ++cell_id) {
+        const auto& cell_nodes = cell_to_node_matrix[cell_id];
         offset += degree * cell_nodes.size();
-        offsets[j] = offset;
+        offsets[cell_id] = offset;
       }
       _write_array(fout, "offsets", offsets, serialize_data_list);
 
       const auto& cell_to_face_matrix = mesh.connectivity().cellToFaceMatrix();
+      const auto& cell_type           = mesh.connectivity().cellType();
 
       Array<NodeId::base_type> nodes{offset};
       size_t index = 0;
@@ -624,8 +625,14 @@ VTKWriter::_write(const MeshType& mesh,
           nodes[index++] = cell_nodes[i_node];
         }
         if (degree == 2) {
-          for (size_t i_face = 0; i_face < cell_faces.size(); ++i_face) {
-            nodes[index++] = number_of_vertices + cell_faces[i_face];
+          if (cell_type[cell_id] == CellType::Triangle) {
+            for (size_t i_face = 0; i_face < cell_faces.size(); ++i_face) {
+              nodes[index++] = number_of_vertices + cell_faces[(i_face + 2) % 3];
+            }
+          } else {
+            for (size_t i_face = 0; i_face < cell_faces.size(); ++i_face) {
+              nodes[index++] = number_of_vertices + cell_faces[i_face];
+            }
           }
         }
       }