diff --git a/applications/utilities/finiteArea/checkFaMesh/faMeshWriteVTK.H b/applications/utilities/finiteArea/checkFaMesh/faMeshWriteVTK.H
index 5a138055d1c5f6a775b74268720c8a19f99f97cf..04b7bcfa61ce9bb43774c3cd10131c3b91737346 100644
--- a/applications/utilities/finiteArea/checkFaMesh/faMeshWriteVTK.H
+++ b/applications/utilities/finiteArea/checkFaMesh/faMeshWriteVTK.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2021-2022 OpenCFD Ltd.
+    Copyright (C) 2021-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -76,9 +76,9 @@ Description
     writer.beginCellData(4);
     writer.writeProcIDs();
     {
-        // Use primitive patch order
         Field<scalar> fld
         (
+            // Use primitive patch order
             faMeshTools::flattenEdgeField(aMesh.magLe(), true)
         );
         writer.write("magLe", fld);
@@ -93,11 +93,17 @@ Description
 }
 
 {
+    const Field<vector> edgeCentres
+    (
+        // Use primitive patch order
+        faMeshTools::flattenEdgeField(aMesh.edgeCentres(), true)
+    );
+
     // finiteArea - edgeCentres
     // (no other convenient way to display vectors on the edges)
     vtk::lineWriter writer
     (
-        aMesh.edgeCentres(),
+        edgeCentres,
         edgeList::null(),
         // vtk::formatType::INLINE_ASCII,
         fileName
@@ -109,19 +115,20 @@ Description
     writer.writeGeometry();
 
     // PointData
-    writer.beginPointData(4);
+    writer.beginPointData(3);
+    writer.writeProcIDs();  // Unfortunately cannot threshold on points
     {
-        // Use primitive patch order
         Field<vector> fld
         (
+            // Use primitive patch order
             faMeshTools::flattenEdgeField(aMesh.Le(), true)
         );
         writer.write("Le", fld);
     }
     {
-        // Use primitive patch order
         Field<vector> fld
         (
+            // Use primitive patch order
             faMeshTools::flattenEdgeField(aMesh.edgeAreaNormals(), true)
         );
         writer.write("normal", fld);
diff --git a/src/fileFormats/vtk/file/foamVtkFileWriter.C b/src/fileFormats/vtk/file/foamVtkFileWriter.C
index 123a69e321f2154cb1f51a95495560363e7919da..c1bdd88e85d3f1cbdebcfbbf5037f4546b72bda2 100644
--- a/src/fileFormats/vtk/file/foamVtkFileWriter.C
+++ b/src/fileFormats/vtk/file/foamVtkFileWriter.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2022 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -76,11 +76,11 @@ Foam::Ostream& Foam::vtk::fileWriter::reportBadState
 Foam::Ostream& Foam::vtk::fileWriter::reportBadState
 (
     Ostream& os,
-    outputState expected,
+    outputState expected1,
     outputState expected2
 ) const
 {
-    reportBadState(os, expected)
+    reportBadState(os, expected1)
         << " or (" << stateNames[expected2] << ')';
     return os;
 }
@@ -554,10 +554,18 @@ bool Foam::vtk::fileWriter::writeProcIDs(const label nValues)
     {
         ++nCellData_;
     }
+    else if (isState(outputState::POINT_DATA))
+    {
+        ++nPointData_;
+    }
     else
     {
-        reportBadState(FatalErrorInFunction, outputState::CELL_DATA)
-            << " for procID field" << nl << endl
+        reportBadState
+        (
+            FatalErrorInFunction,
+            outputState::CELL_DATA,
+            outputState::POINT_DATA
+        )   << " for procID field" << nl << endl
             << exit(FatalError);
 
         return false;
diff --git a/src/fileFormats/vtk/file/foamVtkFileWriter.H b/src/fileFormats/vtk/file/foamVtkFileWriter.H
index 98f4793950811e659902daf9b482b9a5b32506e6..abf068a42f67c011f5c0a75632e9647e23a8a2af 100644
--- a/src/fileFormats/vtk/file/foamVtkFileWriter.H
+++ b/src/fileFormats/vtk/file/foamVtkFileWriter.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2022 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -201,7 +201,8 @@ protected:
             const UList<Type>& field
         );
 
-        //- Write nValues of processor ids as CellData (no-op in serial)
+        //- Write nValues of processor ids as CellData or PointData
+        //- (no-op in serial)
         bool writeProcIDs(const label nValues);
 
 
@@ -305,10 +306,16 @@ public:
         //  \return True if the state changed
         virtual bool beginPointData(label nFields = 0) = 0;
 
-        //- Return the number of CellData written for the Piece thus far.
+        //- True if output state corresponds to CELL_DATA
+        inline bool isCellData() const noexcept;
+
+        //- True if output state corresponds to POINT_DATA
+        inline bool isPointData() const noexcept;
+
+        //- The number of CellData written for the Piece thus far.
         inline label nCellData() const noexcept;
 
-        //- Return the number of PointData written for the Piece thus far.
+        //- The number of PointData written for the Piece thus far.
         inline label nPointData() const noexcept;
 
 
diff --git a/src/fileFormats/vtk/file/foamVtkFileWriterI.H b/src/fileFormats/vtk/file/foamVtkFileWriterI.H
index b9cbfd677c02af44b027dfd5e85756c9d99cebbd..f1fb48f5807d1999a2ae44d61a99969dcd497f33 100644
--- a/src/fileFormats/vtk/file/foamVtkFileWriterI.H
+++ b/src/fileFormats/vtk/file/foamVtkFileWriterI.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2022 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -107,4 +107,16 @@ inline Foam::label Foam::vtk::fileWriter::nPointData() const noexcept
 }
 
 
+inline bool Foam::vtk::fileWriter::isCellData() const noexcept
+{
+    return (outputState::CELL_DATA == state_);
+}
+
+
+inline bool Foam::vtk::fileWriter::isPointData() const noexcept
+{
+    return (outputState::POINT_DATA == state_);
+}
+
+
 // ************************************************************************* //
diff --git a/src/fileFormats/vtk/write/foamVtkLineWriter.C b/src/fileFormats/vtk/write/foamVtkLineWriter.C
index a5f42b5ad98c82882fb20c960cbbbd42cb2af51c..3fa9019665ac83a138f7d653eed6366980963bbd 100644
--- a/src/fileFormats/vtk/write/foamVtkLineWriter.C
+++ b/src/fileFormats/vtk/write/foamVtkLineWriter.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2021 OpenCFD Ltd.
+    Copyright (C) 2021-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -131,6 +131,10 @@ void Foam::vtk::lineWriter::piece
 
 bool Foam::vtk::lineWriter::writeProcIDs()
 {
+    if (this->isPointData())
+    {
+        return vtk::fileWriter::writeProcIDs(nLocalPoints_);
+    }
     return vtk::fileWriter::writeProcIDs(nLocalLines_);
 }
 
diff --git a/src/fileFormats/vtk/write/foamVtkLineWriter.H b/src/fileFormats/vtk/write/foamVtkLineWriter.H
index 36245558f238734f9352e455bf8d1e42d3dc2cb7..48d971287a74c5b08efa621bdbef65fda90e9330 100644
--- a/src/fileFormats/vtk/write/foamVtkLineWriter.H
+++ b/src/fileFormats/vtk/write/foamVtkLineWriter.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2021 OpenCFD Ltd.
+    Copyright (C) 2021-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -155,8 +155,8 @@ public:
         void piece(const pointField& points, const edgeList& edges);
 
 
-        //- Write processor ids for each line as CellData
-        //- (no-op in serial)
+        //- Write processor ids for each line as CellData or for each point
+        //- as PointData, depending on isPointData() state. No-op in serial.
         bool writeProcIDs();
 
         //- Write a uniform field of Cell (Line) or Point values
diff --git a/src/fileFormats/vtk/write/foamVtkSurfaceWriter.C b/src/fileFormats/vtk/write/foamVtkSurfaceWriter.C
index 7b07cace360c8c01b6fbacb65fddb2a329351229..4b42c388091444a084fd5a936334f940f8b2eace 100644
--- a/src/fileFormats/vtk/write/foamVtkSurfaceWriter.C
+++ b/src/fileFormats/vtk/write/foamVtkSurfaceWriter.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2021 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -131,6 +131,10 @@ void Foam::vtk::surfaceWriter::piece
 
 bool Foam::vtk::surfaceWriter::writeProcIDs()
 {
+    if (this->isPointData())
+    {
+        return vtk::fileWriter::writeProcIDs(nLocalPoints_);
+    }
     return vtk::fileWriter::writeProcIDs(nLocalPolys_);
 }
 
diff --git a/src/fileFormats/vtk/write/foamVtkSurfaceWriter.H b/src/fileFormats/vtk/write/foamVtkSurfaceWriter.H
index 0a9d2ccdf363d4538564fe74fd17deb66da19e16..38fcdcf09cef875b3f95064807091a743c302392 100644
--- a/src/fileFormats/vtk/write/foamVtkSurfaceWriter.H
+++ b/src/fileFormats/vtk/write/foamVtkSurfaceWriter.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2021 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -155,8 +155,8 @@ public:
         void piece(const pointField& points, const faceList& faces);
 
 
-        //- Write processor ids for each poly as CellData
-        //- (no-op in serial)
+        //- Write processor ids for each poly as CellData or for each point
+        //- as PointData, depending on isPointData() state. No-op in serial.
         bool writeProcIDs();
 
         //- Write a uniform field of Cell (Poly) or Point values
diff --git a/src/meshTools/coordSet/writers/vtk/foamVtkCoordSetWriter.H b/src/meshTools/coordSet/writers/vtk/foamVtkCoordSetWriter.H
index 8963ce6adc1e5b986fe42fffba5e6e83c7690abd..5f965e5727f00239784a27fa0fdc278f2845885e 100644
--- a/src/meshTools/coordSet/writers/vtk/foamVtkCoordSetWriter.H
+++ b/src/meshTools/coordSet/writers/vtk/foamVtkCoordSetWriter.H
@@ -201,8 +201,9 @@ public:
         void piece(const UPtrList<const pointField>& points);
 
 
-        //- Write processor ids for each line as CellData
-        //- (no-op in serial)
+        //- Write processor ids for each line as CellData or for each point
+        //- as PointData, depending on isPointData() state. No-op in serial.
+        //  Not implemented.
         bool writeProcIDs();
 
 
diff --git a/src/meshTools/output/vtk/patch/foamVtkGenericPatchWriter.H b/src/meshTools/output/vtk/patch/foamVtkGenericPatchWriter.H
index 8dabdc27723f9a8d8056d4d194a34544254cfe4f..e2db80c63f31a860dc4234753b105c1feb4c18aa 100644
--- a/src/meshTools/output/vtk/patch/foamVtkGenericPatchWriter.H
+++ b/src/meshTools/output/vtk/patch/foamVtkGenericPatchWriter.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2021 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -159,6 +159,10 @@ public:
         //- Write processor ids for each poly as CellData
         bool writeProcIDs()
         {
+            if (this->isPointData())
+            {
+                return vtk::fileWriter::writeProcIDs(nLocalPoints_);
+            }
             return vtk::polyWriter::writeProcIDs(nLocalPolys_);
         }
 };
diff --git a/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.C b/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.C
index f12762e7d48c48d99df84cc58b5d966cad4f0a1e..fce8474d658ceb08ec9645efb34ec81367f6bf17 100644
--- a/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.C
+++ b/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2016-2022 OpenCFD Ltd.
+    Copyright (C) 2016-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -585,6 +585,10 @@ void Foam::vtk::patchMeshWriter::writePatchIDs()
 
 bool Foam::vtk::patchMeshWriter::writeProcIDs()
 {
+    if (this->isPointData())
+    {
+        return vtk::fileWriter::writeProcIDs(nLocalPoints_);
+    }
     return vtk::fileWriter::writeProcIDs(nLocalPolys_);
 }
 
diff --git a/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.H b/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.H
index 75cae3ffab6be2fd143f5cb6a0e030cc62ee46e6..de259f740d81b5a1e5e6cfed0c93cf6b8ee9e5c1 100644
--- a/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.H
+++ b/src/meshTools/output/vtk/patch/foamVtkPatchMeshWriter.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2016-2022 OpenCFD Ltd.
+    Copyright (C) 2016-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -209,8 +209,8 @@ public:
         //  Must be called within the CELL_DATA state.
         void writePatchIDs();
 
-        //- Write processor ids as CellData. This is no-op in serial.
-        //  Must be called within the CELL_DATA state.
+        //- Write processor ids for each line as CellData or for each point
+        //- as PointData, depending on isPointData() state. No-op in serial.
         bool writeProcIDs();
 
         //- Write processor neighbour ids as CellData. This is no-op in serial.
diff --git a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun
index d5c14d149d7a816a0c320437da16e1fc75de06ae..fb94a6e0b049fcd9be324182eb3dddcfcf2ae763 100755
--- a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun
+++ b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun
@@ -3,19 +3,30 @@ cd "${0%/*}" || exit                                # Run from this directory
 . ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
 #------------------------------------------------------------------------------
 
+unset decompDict
+# decompDict=system/decomposeParDict-6
+# decompDict=system/decomposeParDict-7
+
 runApplication blockMesh
 
 runApplication makeFaMesh
 
-runApplication decomposePar
+runApplication -decompose-dict="$decompDict" decomposePar
 
-# For the processor partitioning
-runParallel -s finiteVolume foamToVTK -name VTK-parallel -time 0 \
-    -no-finite-area -no-internal -no-lagrangian -no-fields -with-ids
+# For ids and processor partitioning
+runParallel -s volume -decompose-dict="$decompDict" \
+    foamToVTK -name VTK-parallel -time 0 \
+    -no-finite-area -no-internal -no-lagrangian -no-fields -with-ids \
+    -patches filmWalls
 
-runParallel $(getApplication)
+runParallel -decompose-dict="$decompDict" $(getApplication)
 
-runParallel -s finiteArea foamToVTK -name VTK-parallel \
-    -no-boundary -no-internal -no-lagrangian
+if false
+then
+    # Not usually needed - uses areaWrite
+    runParallel -s area -decompose-dict="$decompDict" \
+        foamToVTK -name VTK-parallel \
+        -no-boundary -no-internal -no-lagrangian -with-ids
+fi
 
 #------------------------------------------------------------------------------
diff --git a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun-serial b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun-serial
index 7e8c9929a1cef677534328fbfd658d40743af541..083597c8e8ad7dcc57d5bee62c8707d043b57aa3 100755
--- a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun-serial
+++ b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/Allrun-serial
@@ -7,13 +7,18 @@ runApplication blockMesh
 
 runApplication makeFaMesh
 
-# For the cell ids etc
-runApplication -s finiteVolume.serial foamToVTK -name VTK-serial -time 0 \
-    -no-finite-area -no-internal -no-lagrangian -no-fields -with-ids
+# For ids and processor partitioning
+runApplication -s volume.serial foamToVTK -name VTK-serial -time 0 \
+    -no-finite-area -no-internal -no-lagrangian -no-fields -with-ids \
+    -patches filmWalls
 
 runApplication $(getApplication)
 
-runApplication -s finiteArea.serial foamToVTK -name VTK-serial \
-    -no-boundary -no-internal -no-lagrangian
+if false
+then
+    # Not usually needed - uses areaWrite
+    runApplication -s area.serial foamToVTK -name VTK-serial \
+        -no-boundary -no-internal -no-lagrangian
+fi
 
 #------------------------------------------------------------------------------
diff --git a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/areaWrite b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/areaWrite
new file mode 100644
index 0000000000000000000000000000000000000000..3efb160c88cc3192bf69e53089acbd927fe52afb
--- /dev/null
+++ b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/areaWrite
@@ -0,0 +1,25 @@
+// -*- C++ -*-
+// Use the areaWrite function object
+
+areaWrite
+{
+    type    areaWrite;
+    libs    (utilityFunctionObjects);
+    log     true;
+
+    writeControl    writeTime;
+    writeInterval   1;
+
+    // Fields to output (words or regex)
+    fields  (Uf_film hf_film pf_film);
+
+    surfaceFormat ensight;
+
+    formatOptions
+    {
+        default { format binary; }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/controlDict b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/controlDict
index 90570e46293b270fc5585bddbf432257f6c96949..1127a202e589b59c3aff96b8858e73e337bd3bb7 100644
--- a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/controlDict
+++ b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/controlDict
@@ -52,5 +52,10 @@ regionFaMaxCo   1;
 
 maxDeltaT       0.1;
 
+functions
+{
+    #include "areaWrite"
+}
+
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/decomposeParDict-6 b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/decomposeParDict-6
new file mode 100644
index 0000000000000000000000000000000000000000..34b03d932071c5eca1ea96cecf15eb7f4f1342ef
--- /dev/null
+++ b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/decomposeParDict-6
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2306                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 6;
+
+method          scotch;
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/decomposeParDict-7 b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/decomposeParDict-7
new file mode 100644
index 0000000000000000000000000000000000000000..2e873a3493d05d2b19b7bf60fe9a6c162ca26589
--- /dev/null
+++ b/tutorials/lagrangian/kinematicParcelFoam/drippingChair/system/decomposeParDict-7
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2306                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 7;
+
+method          scotch;
+
+// ************************************************************************* //