diff --git a/applications/utilities/mesh/manipulation/checkMesh/writeFields.C b/applications/utilities/mesh/manipulation/checkMesh/writeFields.C
index f58db28de7db08ab8921444f77a4c54d3ce5d861..dfc825a817b84f53c0efffe1a34dcbf3ec14f1cd 100644
--- a/applications/utilities/mesh/manipulation/checkMesh/writeFields.C
+++ b/applications/utilities/mesh/manipulation/checkMesh/writeFields.C
@@ -616,6 +616,17 @@ void Foam::writeFields
     }
     if (selectedFields.found("faceZone"))
     {
+        // Determine for each face the zone index (scalar for ease of
+        // manipulation)
+        scalarField zoneID(mesh.nFaces(), -1);
+        const faceZoneMesh& czs = mesh.faceZones();
+        for (const auto& zone : czs)
+        {
+            UIndirectList<scalar>(zoneID, zone) = zone.index();
+        }
+
+
+        // Split into internal and boundary values
         surfaceScalarField faceZone
         (
             IOobject
@@ -632,10 +643,13 @@ void Foam::writeFields
             calculatedFvsPatchScalarField::typeName
         );
 
-        const faceZoneMesh& czs = mesh.faceZones();
-        for (const auto& zone : czs)
+        faceZone.primitiveFieldRef() =
+            SubField<scalar>(zoneID, mesh.nInternalFaces());
+        surfaceScalarField::Boundary& bfld = faceZone.boundaryFieldRef();
+        for (auto& pfld : bfld)
         {
-            UIndirectList<scalar>(faceZone, zone) = zone.index();
+            const fvPatch& fvp = pfld.patch();
+            pfld == SubField<scalar>(zoneID, fvp.size(), fvp.start());
         }
 
         //faceZone.correctBoundaryConditions();