diff --git a/src/conversion/vtk/adaptor/foamVtkTools.H b/src/conversion/vtk/adaptor/foamVtkTools.H
index 3d35938abf657d024aefd00f20175b2160080808..91ee3f178bb3b0c02443187224d690f316de5be6 100644
--- a/src/conversion/vtk/adaptor/foamVtkTools.H
+++ b/src/conversion/vtk/adaptor/foamVtkTools.H
@@ -195,7 +195,7 @@ namespace Tools
     //- Convert OpenFOAM patch to vtkPolyData
     struct Patch
     {
-        //- Convert local patch points to vtkPoints
+        //- Return local patch points as vtkPoints
         template<class PatchType>
         static vtkSmartPointer<vtkPoints> points(const PatchType& p);
 
@@ -210,6 +210,10 @@ namespace Tools
         //- Convert patch face normals to vtkFloatArray
         template<class PatchType>
         static vtkSmartPointer<vtkFloatArray> faceNormals(const PatchType& p);
+
+        //- Return patch face centres as vtkPoints
+        template<class PatchType>
+        static vtkSmartPointer<vtkPoints> faceCentres(const PatchType& p);
     };
 
 
diff --git a/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C b/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C
index ce7abd026a2cc97fee51e9bf97fd4404671cbbb5..003296463502d12e264425e3aa3ecb58c7983b4f 100644
--- a/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C
+++ b/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -139,6 +139,39 @@ Foam::vtk::Tools::Patch::faceNormals(const PatchType& p)
 }
 
 
+template<class PatchType>
+vtkSmartPointer<vtkPoints>
+Foam::vtk::Tools::Patch::faceCentres(const PatchType& p)
+{
+    auto vtkpoints = vtkSmartPointer<vtkPoints>::New();
+
+    vtkpoints->SetNumberOfPoints(p.size());
+
+    // Use cached values if available or loop over faces
+    // (avoid triggering cache)
+
+    vtkIdType pointId = 0;
+
+    if (p.hasFaceCentres())
+    {
+        for (const point& pt : p.faceCentres())
+        {
+            vtkpoints->SetPoint(pointId++, pt.v_);
+        }
+    }
+    else
+    {
+        for (const auto& f : p)
+        {
+            const point pt(f.centre(p.points()));
+            vtkpoints->SetPoint(pointId++, pt.v_);
+        }
+    }
+
+    return vtkpoints;
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 //
 // Low-Level conversions