diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C b/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C
index 652a9c21ed057a2345deef0ad3f393c961f96a57..26aa2582216eedad39e54a3a21987ec8a48ce1a6 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C
@@ -61,7 +61,7 @@ Usage
       - \par -patches patch or patch list
         Specify particular patches to write.
 
-      - \par -faceZones patch or zone list
+      - \par -faceZones zone or zone list
         Specify faceZones to write, with wildcards
 
       - \par -cellZone zoneName
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H
index cc5e02a793579e5142f897245b1e2fc675cca0db..75c7fb171e8fd35159124548faa83179201e6110 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H
@@ -149,7 +149,7 @@ Description
 
     // Write faceZones (POLYDATA file, one for each zone)
 
-    if (doFaceZones && !mesh.faceZones().empty())
+    if (!selectedFaceZones.empty() && !mesh.faceZones().empty())
     {
         if (nSurfaceScalarField == -1)
         {
@@ -187,6 +187,11 @@ Description
 
         for (const faceZone& fz : mesh.faceZones())
         {
+            if (!selectedFaceZones.match(fz.name()))
+            {
+                continue;
+            }
+
             indirectPrimitivePatch pp
             (
                 IndirectList<face>(mesh.faces(), fz),
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
index ce456db48defc7e9930b55ab354285a715efc4ef..dd37ad5c1b5c5bfa76e9b034651b17387f17f88c 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
@@ -70,6 +70,10 @@ Usage
       - \par -pointSet \<name\>
         Restrict conversion to the faceSet or pointSet.
 
+      - \par -faceZones zone or zone list
+        Specify single faceZone or or multiple faceZones (name or regex)
+        to write
+
       - \par -nearCellValue
         Output cell value on patches instead of patch value itself
 
@@ -85,9 +89,6 @@ Usage
       - \par -no-point-data
         Suppress conversion of pointFields. No interpolated PointData.
 
-      - \par -noFaceZones
-        Suppress conversion of surface fields on faceZones
-
       - \par -poly-decomp
         Decompose polyhedral cells into tets/pyramids
 
@@ -308,6 +309,13 @@ int main(int argc, char *argv[])
         "Convert specified pointSet only",
         true  // mark as an advanced option
     );
+    argList::addOption
+    (
+        "faceZones",
+        "wordRes",
+        "Specify single or multiple faceZones to write\n"
+        "Eg, 'cells' or '( slice \"mfp-.*\" )'."
+    );
 
     argList::addOption
     (
@@ -397,12 +405,10 @@ int main(int argc, char *argv[])
         " Eg, 'outlet' or '( inlet \".*Wall\" )'",
         true  // mark as an advanced option
     );
-
-    argList::addBoolOption
+    argList::ignoreOptionCompat
     (
-        "noFaceZones",
-        "Suppress conversion of surface fields on faceZones",
-        true  // mark as an advanced option
+        {"noFaceZones", 1806},  // faceZones are only enabled on demand
+        false                   // bool option, no argument
     );
     argList::ignoreOptionCompat
     (
@@ -435,7 +441,6 @@ int main(int argc, char *argv[])
     const bool doFiniteArea  = args.found("finiteAreaFields");
     const bool doSurfaceFields = args.found("surfaceFields");
 
-    const bool doFaceZones   = !args.found("noFaceZones") && doInternal;
     const bool oneBoundary   = args.found("one-boundary") && doBoundary;
     const bool nearCellValue = args.found("nearCellValue") && doBoundary;
     const bool allRegions    = args.found("allRegions");
@@ -471,10 +476,14 @@ int main(int argc, char *argv[])
         }
     }
 
+    // Can be specified as empty (ie, no fields)
     wordRes selectedFields;
     const bool useFieldFilter =
         args.readListIfPresent<wordRe>("fields", selectedFields);
 
+    // Non-mandatory
+    const wordRes selectedFaceZones(args.getList<wordRe>("faceZones", false));
+
     #include "createTime.H"
 
     instantList timeDirs = timeSelector::select0(runTime, args);
diff --git a/etc/config.sh/completion_cache b/etc/config.sh/completion_cache
index 3d0553007e24845a05edf2705bd6949ce7bb20cb..09d59664c352b7cbe41b87ae5c40e4f3c367683e 100644
--- a/etc/config.sh/completion_cache
+++ b/etc/config.sh/completion_cache
@@ -96,7 +96,7 @@ _of_complete_cache_[foamToGMV]="-case -decomposeParDict -fileHandler | -listFunc
 _of_complete_cache_[foamToStarMesh]="-case -fileHandler -scale -time | -constant -latestTime -listFunctionObjects -listRegisteredSwitches -listSwitches -listUnsetSwitches -noBnd -noFunctionObjects -noZero -doc -doc-source -help"
 _of_complete_cache_[foamToSurface]="-case -fileHandler -scale -time | -constant -latestTime -listFunctionObjects -listRegisteredSwitches -listSwitches -listUnsetSwitches -noFunctionObjects -noZero -tri -doc -doc-source -help"
 _of_complete_cache_[foamToTetDualMesh]="-case -decomposeParDict -fileHandler -time | -constant -latestTime -listFunctionObjects -listRegisteredSwitches -listScalarBCs -listSwitches -listUnsetSwitches -listVectorBCs -noFunctionObjects -noZero -overwrite -parallel -doc -doc-source -help"
-_of_complete_cache_[foamToVTK]="-case -cellSet -cellZone -decomposeParDict -excludePatches -faceSet -fields -fileHandler -name -patches -pointSet -region -regions -time | -allRegions -ascii -constant -finiteAreaFields -latestTime -legacy -listFunctionObjects -listRegisteredSwitches -listScalarBCs -listSwitches -listUnsetSwitches -listVectorBCs -nearCellValue -no-boundary -no-internal -no-lagrangian -no-point-data -noFaceZones -noFunctionObjects -noZero -one-boundary -overwrite -parallel -poly-decomp -surfaceFields -doc -doc-source -help"
+_of_complete_cache_[foamToVTK]="-case -cellSet -cellZone -decomposeParDict -excludePatches -faceSet -faceZones -fields -fileHandler -name -patches -pointSet -region -regions -time | -allRegions -ascii -constant -finiteAreaFields -latestTime -legacy -listFunctionObjects -listRegisteredSwitches -listScalarBCs -listSwitches -listUnsetSwitches -listVectorBCs -nearCellValue -no-boundary -no-internal -no-lagrangian -no-point-data -noFunctionObjects -noZero -one-boundary -overwrite -parallel -poly-decomp -surfaceFields -doc -doc-source -help"
 _of_complete_cache_[foamUpgradeCyclics]="-case -decomposeParDict -fileHandler -region -time | -constant -dry-run -enableFunctionEntries -latestTime -listFunctionObjects -listRegisteredSwitches -listScalarBCs -listSwitches -listUnsetSwitches -listVectorBCs -noFunctionObjects -noZero -parallel -doc -doc-source -help"
 _of_complete_cache_[foamyHexMesh]="-case -decomposeParDict -fileHandler | -checkGeometry -conformationOnly -listFunctionObjects -listRegisteredSwitches -listScalarBCs -listSwitches -listUnsetSwitches -listVectorBCs -parallel -doc -doc-source -help"
 _of_complete_cache_[foamyQuadMesh]="-case -fileHandler -pointsFile | -listFunctionObjects -listRegisteredSwitches -listSwitches -listUnsetSwitches -noFunctionObjects -overwrite -doc -doc-source -help"