diff --git a/src/lumpedPointMotion/lumpedPointMovementWriter.C b/src/lumpedPointMotion/lumpedPointMovementWriter.C
index c8fcc888b47c15bca606030870072ef9baa06f2c..3cc17656a68d1e01b4c2a781400b09f357368553 100644
--- a/src/lumpedPointMotion/lumpedPointMovementWriter.C
+++ b/src/lumpedPointMotion/lumpedPointMovementWriter.C
@@ -55,7 +55,7 @@ void Foam::lumpedPointMovement::writeForcesAndMomentsVTP
     );
 
     format().xmlHeader()
-        .beginVTKFile(vtk::fileTag::POLY_DATA, "0.1");
+        .beginVTKFile<vtk::fileTag::POLY_DATA>();
 
     //
     // The 'spine' of lumped mass points
@@ -64,19 +64,20 @@ void Foam::lumpedPointMovement::writeForcesAndMomentsVTP
 
     {
         format()
-            .openTag(vtk::fileTag::PIECE)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POINTS, nPoints)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_VERTS,  nPoints)
-            .closeTag();
+            .tag
+            (
+                vtk::fileTag::PIECE,
+                vtk::fileAttr::NUMBER_OF_POINTS, nPoints,
+                vtk::fileAttr::NUMBER_OF_VERTS,  nPoints
+            );
 
         // 'points'
         {
-            const uint64_t payLoad = (nPoints*3* sizeof(float));
+            const uint64_t payLoad = vtk::sizeofData<float, 3>(nPoints);
 
             format()
                 .tag(vtk::fileTag::POINTS)
-                .openDataArray<float, 3>(vtk::dataArrayAttr::POINTS)
-                .closeTag();
+                .beginDataArray<float, 3>(vtk::dataArrayAttr::POINTS);
 
             format().writeSize(payLoad);
             vtk::writeList(format(), state().points());
@@ -94,12 +95,11 @@ void Foam::lumpedPointMovement::writeForcesAndMomentsVTP
         // 'connectivity'
         //
         {
-            const uint64_t payLoad = (nPoints*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nPoints);
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
             format().writeSize(payLoad);
+
             for (label i=0; i<nPoints; ++i)
             {
                 format().write(i);
@@ -114,12 +114,11 @@ void Foam::lumpedPointMovement::writeForcesAndMomentsVTP
         // = linear mapping onto points (with 1 offset)
         //
         {
-            const uint64_t payLoad = (nPoints*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nPoints);
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
+
             for (label i=0; i<nPoints; ++i)
             {
                 format().write(i+1);
@@ -133,17 +132,16 @@ void Foam::lumpedPointMovement::writeForcesAndMomentsVTP
         // </Verts>
     }
 
-    format().tag(vtk::fileTag::POINT_DATA);
+    format().beginPointData();
 
     // forces
     if (forces.size() == nPoints)
     {
-        const uint64_t payLoad = (nPoints * 3 * sizeof(float));
-
-        format().openDataArray<float, 3>("forces")
-            .closeTag();
+        const uint64_t payLoad = vtk::sizeofData<float, 3>(nPoints);
 
+        format().beginDataArray<float, 3>("forces");
         format().writeSize(payLoad);
+
         vtk::writeList(format(), forces);
         format().flush();
 
@@ -153,23 +151,23 @@ void Foam::lumpedPointMovement::writeForcesAndMomentsVTP
     // moments
     if (moments.size() == nPoints)
     {
-        const uint64_t payLoad = (nPoints * 3 * sizeof(float));
-
-        format().openDataArray<float, 3>("moments")
-            .closeTag();
+        const uint64_t payLoad = vtk::sizeofData<float, 3>(nPoints);
 
+        format().beginDataArray<float, 3>("moments");
         format().writeSize(payLoad);
+
         vtk::writeList(format(), moments);
         format().flush();
 
         format().endDataArray();
     }
 
-    format().endTag(vtk::fileTag::POINT_DATA);
+    format().endPointData();
 
-    format().endTag(vtk::fileTag::PIECE);
-    format().endTag(vtk::fileTag::POLY_DATA);
-    format().endVTKFile();
+    format().endPiece();
+
+    format().endTag(vtk::fileTag::POLY_DATA)
+        .endVTKFile();
 }
 
 
@@ -190,7 +188,7 @@ void Foam::lumpedPointMovement::writeZonesVTP
     );
 
     format().xmlHeader()
-        .beginVTKFile(vtk::fileTag::POLY_DATA, "0.1");
+        .beginVTKFile<vtk::fileTag::POLY_DATA>();
 
     forAll(faceZones_, zoneI)
     {
@@ -201,19 +199,20 @@ void Foam::lumpedPointMovement::writeZonesVTP
         );
 
         format()
-            .openTag(vtk::fileTag::PIECE)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POINTS, pp.nPoints())
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POLYS,  pp.size())
-            .closeTag();
+            .tag
+            (
+                vtk::fileTag::PIECE,
+                vtk::fileAttr::NUMBER_OF_POINTS, pp.nPoints(),
+                vtk::fileAttr::NUMBER_OF_POLYS,  pp.size()
+            );
 
         // 'points'
         {
-            const uint64_t payLoad = (pp.nPoints()*3* sizeof(float));
+            const uint64_t payLoad = vtk::sizeofData<float, 3>(pp.nPoints());
 
             format()
                 .tag(vtk::fileTag::POINTS)
-                .openDataArray<float, 3>(vtk::dataArrayAttr::POINTS)
-                .closeTag();
+                .beginDataArray<float, 3>(vtk::dataArrayAttr::POINTS);
 
             format().writeSize(payLoad);
             vtk::writeList(format(), pp.localPoints());
@@ -231,17 +230,16 @@ void Foam::lumpedPointMovement::writeZonesVTP
         // 'connectivity'
         //
         {
-            uint64_t payLoad = 0;
-            forAll(pp, facei)
+            label nVerts = 0;
+            for (const face& f : pp)
             {
-                const face& f = pp[facei];
-                payLoad += f.size();
+                nVerts += f.size();
             }
 
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nVerts);
 
-            format().writeSize(payLoad * sizeof(label));
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
+            format().writeSize(payLoad);
 
             for (const face& f : pp.localFaces())
             {
@@ -256,11 +254,9 @@ void Foam::lumpedPointMovement::writeZonesVTP
         // 'offsets'  (connectivity offsets)
         //
         {
-            const uint64_t payLoad = (pp.size() * sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(pp.size());
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
 
             label off = 0;
@@ -279,15 +275,13 @@ void Foam::lumpedPointMovement::writeZonesVTP
         format().endTag(vtk::fileTag::POLYS);
 
 
-        format().tag(vtk::fileTag::CELL_DATA);
+        format().beginCellData();
 
         // zone Id
         {
-            const uint64_t payLoad = (pp.size() * sizeof(label));
-
-            format().openDataArray<label>("zoneId")
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(pp.size());
 
+            format().beginDataArray<label>("zoneId");
             format().writeSize(payLoad);
 
             forAll(pp, facei)
@@ -299,13 +293,13 @@ void Foam::lumpedPointMovement::writeZonesVTP
             format().endDataArray();
         }
 
-        format().endTag(vtk::fileTag::CELL_DATA);
+        format().endCellData();
 
-        format().endTag(vtk::fileTag::PIECE);
+        format().endPiece();
     }
 
-    format().endTag(vtk::fileTag::POLY_DATA);
-    format().endVTKFile();
+    format().endTag(vtk::fileTag::POLY_DATA)
+        .endVTKFile();
 }
 
 
@@ -342,26 +336,27 @@ void Foam::lumpedPointMovement::writeVTP
     );
 
     format().xmlHeader()
-        .beginVTKFile(vtk::fileTag::POLY_DATA, "0.1");
+        .beginVTKFile<vtk::fileTag::POLY_DATA>();
 
     for (const label patchId : patchIds)
     {
         const polyPatch& pp = boundaryMesh[patchId];
 
         format()
-            .openTag(vtk::fileTag::PIECE)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POINTS, pp.nPoints())
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POLYS,  pp.size())
-            .closeTag();
+            .tag
+            (
+                vtk::fileTag::PIECE,
+                vtk::fileAttr::NUMBER_OF_POINTS, pp.nPoints(),
+                vtk::fileAttr::NUMBER_OF_POLYS,  pp.size()
+            );
 
         // 'points'
         {
-            const uint64_t payLoad = (pp.nPoints()*3* sizeof(float));
+            const uint64_t payLoad = vtk::sizeofData<float, 3>(pp.nPoints());
 
             format()
                 .tag(vtk::fileTag::POINTS)
-                .openDataArray<float, 3>(vtk::dataArrayAttr::POINTS)
-                .closeTag();
+                .beginDataArray<float, 3>(vtk::dataArrayAttr::POINTS);
 
             // Could be more efficient, but not often needed
             tmp<pointField> tpts = displacePoints
@@ -390,16 +385,16 @@ void Foam::lumpedPointMovement::writeVTP
         // 'connectivity'
         //
         {
-            uint64_t payLoad = 0;
+            label nVerts = 0;
             for (const face& f : pp)
             {
-                payLoad += f.size();
+                nVerts += f.size();
             }
 
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nVerts);
 
-            format().writeSize(payLoad * sizeof(label));
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
+            format().writeSize(payLoad);
 
             for (const face& f : pp.localFaces())
             {
@@ -414,17 +409,14 @@ void Foam::lumpedPointMovement::writeVTP
         // 'offsets'  (connectivity offsets)
         //
         {
-            const uint64_t payLoad = (pp.size() * sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(pp.size());
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
 
             label off = 0;
-            forAll(pp, facei)
+            for (const face& f : pp)
             {
-                const face& f = pp[facei];
                 off += f.size();
 
                 format().write(off);
@@ -436,11 +428,11 @@ void Foam::lumpedPointMovement::writeVTP
 
         format().endTag(vtk::fileTag::POLYS);
 
-        format().endTag(vtk::fileTag::PIECE);
+        format().endPiece();
     }
 
-    format().endTag(vtk::fileTag::POLY_DATA);
-    format().endVTKFile();
+    format().endTag(vtk::fileTag::POLY_DATA)
+        .endVTKFile();
 }
 
 
diff --git a/src/lumpedPointMotion/lumpedPointStateWriter.C b/src/lumpedPointMotion/lumpedPointStateWriter.C
index 2340d0876180db9778822da08f2f7c44fea8f85c..1af7503e150547eb92760d6a2e9112de3c2cc386 100644
--- a/src/lumpedPointMotion/lumpedPointStateWriter.C
+++ b/src/lumpedPointMotion/lumpedPointStateWriter.C
@@ -62,27 +62,28 @@ void Foam::lumpedPointState::writeVTP
     );
 
     format().xmlHeader()
-        .beginVTKFile(vtk::fileTag::POLY_DATA, "0.1");
+        .beginVTKFile<vtk::fileTag::POLY_DATA>();
 
     //
     // The 'spine' of lumped mass points
     //
     {
         format()
-            .openTag(vtk::fileTag::PIECE)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POINTS, points_.size())
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_VERTS,  points_.size())
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_LINES,  1)
-            .closeTag();
+            .tag
+            (
+                vtk::fileTag::PIECE,
+                vtk::fileAttr::NUMBER_OF_POINTS, points_.size(),
+                vtk::fileAttr::NUMBER_OF_VERTS,  points_.size(),
+                vtk::fileAttr::NUMBER_OF_LINES,  1
+            );
 
         // 'points'
         {
-            const uint64_t payLoad = (points_.size()*3* sizeof(float));
+            const uint64_t payLoad = vtk::sizeofData<float, 3>(points_.size());
 
             format()
                 .tag(vtk::fileTag::POINTS)
-                .openDataArray<float, 3>(vtk::dataArrayAttr::POINTS)
-                .closeTag();
+                .beginDataArray<float, 3>(vtk::dataArrayAttr::POINTS);
 
             format().writeSize(payLoad);
             vtk::writeList(format(), points_);
@@ -100,12 +101,11 @@ void Foam::lumpedPointState::writeVTP
         // 'connectivity'
         //
         {
-            const uint64_t payLoad = (points_.size()*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(points_.size());
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
             format().writeSize(payLoad);
+
             forAll(points_, i)
             {
                 format().write(i);
@@ -120,12 +120,11 @@ void Foam::lumpedPointState::writeVTP
         // = linear mapping onto points (with 1 offset)
         //
         {
-            const uint64_t payLoad = (points_.size()*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(points_.size());
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
+
             forAll(points_, i)
             {
                 format().write(i+1);
@@ -146,12 +145,11 @@ void Foam::lumpedPointState::writeVTP
         // 'connectivity'
         //
         {
-            const uint64_t payLoad = (points_.size()*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(points_.size());
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
             format().writeSize(payLoad);
+
             forAll(points_, i)
             {
                 format().write(i);
@@ -166,12 +164,11 @@ void Foam::lumpedPointState::writeVTP
         // = single line
         //
         {
-            const uint64_t payLoad = (1*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(1);
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
+
             format().write(points_.size());
             format().flush();
 
@@ -179,7 +176,7 @@ void Foam::lumpedPointState::writeVTP
         }
 
         format().endTag(vtk::fileTag::LINES);
-        format().endTag(vtk::fileTag::PIECE);
+        format().endPiece();
     }
 
     // Standard corners in local axis
@@ -203,19 +200,20 @@ void Foam::lumpedPointState::writeVTP
         const label nPolys  = points_.size();
 
         format()
-            .openTag(vtk::fileTag::PIECE)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POINTS, nPoints)
-            .xmlAttr(vtk::fileAttr::NUMBER_OF_POLYS,  nPolys)
-            .closeTag();
+            .tag
+            (
+                vtk::fileTag::PIECE,
+                vtk::fileAttr::NUMBER_OF_POINTS, nPoints,
+                vtk::fileAttr::NUMBER_OF_POLYS,  nPolys
+            );
 
         // 'points'
         {
-            const uint64_t payLoad = (nPoints*3*sizeof(float));
+            const uint64_t payLoad = vtk::sizeofData<float, 3>(nPoints);
 
             format()
                 .tag(vtk::fileTag::POINTS)
-                .openDataArray<float, 3>(vtk::dataArrayAttr::POINTS)
-                .closeTag();
+                .beginDataArray<float, 3>(vtk::dataArrayAttr::POINTS);
 
             format().writeSize(payLoad);
 
@@ -253,12 +251,11 @@ void Foam::lumpedPointState::writeVTP
         // 'connectivity' - 4 points (ie, quad)
         //
         {
-            const uint64_t payLoad = (4*nPolys*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(4*nPolys);
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
             format().writeSize(payLoad);
+
             for (label i=0; i < 4*nPolys; ++i)
             {
                 format().write(i);
@@ -273,12 +270,11 @@ void Foam::lumpedPointState::writeVTP
         // = single quad
         //
         {
-            const uint64_t payLoad = (nPolys*sizeof(label));
-
-            format().openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nPolys);
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
+
             for (label i=0; i < nPolys; ++i)
             {
                 const label off = 4 * (i+1);
@@ -292,16 +288,15 @@ void Foam::lumpedPointState::writeVTP
         format().endTag(vtk::fileTag::POLYS);
 
 #if 0
-        format().tag(vtk::fileTag::CELL_DATA);
+        format().beginCellData();
 
         // zone Id
         {
-            const uint64_t payLoad = (points_.size()*sizeof(label));
-
-            format().openDataArray<label>("zoneId")
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nPolys);
 
+            format().beginDataArray<label>("zoneId");
             format().writeSize(payLoad);
+
             for (label i=0; i < nPolys; ++i)
             {
                 format().write(i);
@@ -311,18 +306,18 @@ void Foam::lumpedPointState::writeVTP
             format().endDataArray();
         }
 
-        format().endTag(vtk::fileTag::CELL_DATA);
+        format().endCellData();
 #endif
 
-        format().endTag(vtk::fileTag::PIECE);
+        format().endPiece();
     }
 
     // Finally
     // could add a 'ghost' level above to visualize extrapolated values
     // draw as two triangles to distingush from real levels ...
 
-    format().endTag(vtk::fileTag::POLY_DATA);
-    format().endVTKFile();
+    format().endTag(vtk::fileTag::POLY_DATA)
+        .endVTKFile();
 }
 
 
diff --git a/src/surfMesh/surfaceFormats/vtk/VTKsurfaceFormatCore.C b/src/surfMesh/surfaceFormats/vtk/VTKsurfaceFormatCore.C
index 9d921f48ff677aa636d245104250b8c8eccdf0cf..00556c8f0c4291ac7ce7270f934f5bd16739b2d7 100644
--- a/src/surfMesh/surfaceFormats/vtk/VTKsurfaceFormatCore.C
+++ b/src/surfMesh/surfaceFormats/vtk/VTKsurfaceFormatCore.C
@@ -63,11 +63,10 @@ void Foam::fileFormats::VTKsurfaceFormatCore::writeHeader
     const UList<point>& pts
 )
 {
-    vtk::legacy::fileHeader
+    vtk::legacy::fileHeader<vtk::fileTag::POLY_DATA>
     (
         format,
-        ("surface written " + clock::dateTime()),
-        vtk::fileTag::POLY_DATA
+        ("surface written " + clock::dateTime())
     );
 
     vtk::legacy::beginPoints(format.os(), pts.size());
diff --git a/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormat.C b/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormat.C
index e4ed8d88654b08a81971162d8c00c48bba738e9c..7d16057e86c4c683e001354f3f51d844190eff4e 100644
--- a/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormat.C
+++ b/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormat.C
@@ -41,16 +41,16 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::writePolys
     // 'connectivity'
     //
     {
-        uint64_t payLoad = 0;
+        label nVerts = 0;
         for (const auto& f : faces)
         {
-            payLoad += f.size();
+            nVerts += f.size();
         }
 
-        format.openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-            .closeTag();
+        const uint64_t payLoad = vtk::sizeofData<label>(nVerts);
 
-        format.writeSize(payLoad * sizeof(label));
+        format.beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
+        format.writeSize(payLoad);
 
         for (const auto& f : faces)
         {
@@ -66,12 +66,9 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::writePolys
     // 'offsets'  (connectivity offsets)
     //
     {
-        const uint64_t payLoad(faces.size() * sizeof(label));
-
-        format
-            .openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-            .closeTag();
+        const uint64_t payLoad = vtk::sizeofData<label>(faces.size());
 
+        format.beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
         format.writeSize(payLoad);
 
         label off = 0;
@@ -129,16 +126,16 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::write
         // 'connectivity'
         //
         {
-            uint64_t payLoad = 0;
+            label nVerts = 0;
             for (const auto& f : faceLst)
             {
-                payLoad += f.size();
+                nVerts += f.size();
             }
 
-            format().openDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY)
-                .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(nVerts);
 
-            format().writeSize(payLoad * sizeof(label));
+            format().beginDataArray<label>(vtk::dataArrayAttr::CONNECTIVITY);
+            format().writeSize(payLoad);
 
             label faceIndex = 0;
             for (const surfZone& zone : zones)
@@ -160,12 +157,9 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::write
         // 'offsets'  (connectivity offsets)
         //
         {
-            const uint64_t payLoad(faceLst.size() * sizeof(label));
-
-            format()
-                .openDataArray<label>(vtk::dataArrayAttr::OFFSETS)
-                    .closeTag();
+            const uint64_t payLoad = vtk::sizeofData<label>(faceLst.size());
 
+            format().beginDataArray<label>(vtk::dataArrayAttr::OFFSETS);
             format().writeSize(payLoad);
 
             label off = 0, faceIndex = 0;
diff --git a/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormatCore.C b/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormatCore.C
index 5f24e5ade60db871ee2446eae58757453685e851..5d927c347c8cefa46c574577caf80335db42aad8 100644
--- a/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormatCore.C
+++ b/src/surfMesh/surfaceFormats/vtp/VTPsurfaceFormatCore.C
@@ -69,25 +69,27 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeHeader
     format
         .xmlHeader()
         .xmlComment("surface written " + clock::dateTime())
-        .beginVTKFile(vtk::fileTag::POLY_DATA, "0.1");
+        .beginVTKFile<vtk::fileTag::POLY_DATA>();
 
     // <Piece>
     format
-        .openTag(vtk::fileTag::PIECE)
-        .xmlAttr(vtk::fileAttr::NUMBER_OF_POINTS, pts.size())
-        .xmlAttr(vtk::fileAttr::NUMBER_OF_POLYS,  nFaces)
-        .closeTag();
+        .tag
+        (
+            vtk::fileTag::PIECE,
+            vtk::fileAttr::NUMBER_OF_POINTS, pts.size(),
+            vtk::fileAttr::NUMBER_OF_POLYS,  nFaces
+        );
 
 
     // Points
 
-    const uint64_t payLoad = (pts.size()*3* sizeof(float));
+    const uint64_t payLoad = vtk::sizeofData<float, 3>(pts.size());
 
     format.tag(vtk::fileTag::POINTS)
-        .openDataArray<float, 3>(vtk::dataArrayAttr::POINTS)
-        .closeTag();
+        .beginDataArray<float, 3>(vtk::dataArrayAttr::POINTS);
 
     format.writeSize(payLoad);
+
     vtk::writeList(format, pts);
     format.flush();
 
@@ -102,15 +104,13 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeFooter
     vtk::formatter& format
 )
 {
-    // Slight cheat. </Piece> too
-    format.endTag(Foam::vtk::fileTag::PIECE);
+    format.endPiece();  //<-- slight cheat. </Piece> too
 
     format.endTag(vtk::fileTag::POLY_DATA)
         .endVTKFile();
 }
 
 
-
 void Foam::fileFormats::VTPsurfaceFormatCore::writeCellData
 (
     vtk::formatter& format,
@@ -120,17 +120,17 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeCellData
     // Zone ids as CellData
 
     // Number of faces covered by the zones
-    uint64_t payLoad = 0;
+    label nFaces = 0;
     for (const auto& z : zones)
     {
-        payLoad += z.size();
+        nFaces += z.size();
     }
 
-    format.tag(vtk::fileTag::CELL_DATA);
-    format.openDataArray<label>("region")
-        .closeTag();
+    const uint64_t payLoad = vtk::sizeofData<label>(nFaces);
 
-    format.writeSize(payLoad * sizeof(label));
+    format.beginCellData();
+    format.beginDataArray<label>("region");
+    format.writeSize(payLoad);
 
     label zoneId = 0;
     for (const surfZone& zone : zones)
@@ -145,7 +145,7 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeCellData
     format.flush();
     format.endDataArray();
 
-    format.endTag(vtk::fileTag::CELL_DATA);
+    format.endCellData();
 }
 
 
@@ -157,11 +157,10 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeCellData
 {
     // Zone ids as CellData
 
-    format.tag(vtk::fileTag::CELL_DATA);
-    format.openDataArray<label>("region")
-        .closeTag();
+    const uint64_t payLoad = vtk::sizeofData<label>(zoneIds.size());
 
-    const uint64_t payLoad(zoneIds.size() * sizeof(label));
+    format.beginCellData();
+    format.beginDataArray<label>("region");
 
     format.writeSize(payLoad);
     vtk::writeList(format, zoneIds);
@@ -169,7 +168,7 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeCellData
     format.flush();
     format.endDataArray();
 
-    format.endTag(vtk::fileTag::CELL_DATA);
+    format.endCellData();
 }