diff --git a/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.C b/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.C
index 9506a9e85fab2f67461ad9d9cc6392a67456aff3..0af0390b951e9f29c8f3243bd4fa5f20bd71ca83 100644
--- a/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.C
+++ b/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.C
@@ -529,7 +529,65 @@ Foam::sampledMeshedSurface::sampledMeshedSurface
     zoneIds_(),
     sampleElements_(),
     samplePoints_()
-{}
+{
+    wordRes includePatches;
+    dict.readIfPresent("patches", includePatches);
+    includePatches.uniq();
+
+    // Could also shift this to the reader itself,
+    // but not yet necessary.
+
+    if (!includePatches.empty())
+    {
+        Info<< "Subsetting surface " << surfaceName_
+            << " to patches: " << flatOutput(includePatches) << nl;
+
+        const surfZoneList& zones = surface_.surfZones();
+
+        const labelList zoneIndices
+        (
+            stringListOps::findMatching
+            (
+                zones,
+                includePatches,
+                wordRes(),
+                nameOp<surfZone>()
+            )
+        );
+
+        // Faces to subset
+        bitSet includeMap(surface_.size());
+
+        for (const label zonei : zoneIndices)
+        {
+            const surfZone& zn = zones[zonei];
+            includeMap.set(zn.range());
+        }
+
+        if (includeMap.none())
+        {
+            WarningInFunction
+                << "Patch selection results in an empty surface"
+                << " - ignoring" << nl;
+        }
+        else if (!includeMap.all())
+        {
+            meshedSurface newSurf(surface_.subsetMesh(includeMap));
+
+            if (newSurf.empty())
+            {
+                WarningInFunction
+                    << "Bad surface subset (empty)"
+                    << " - skip and hope for the best" << nl;
+            }
+            else
+            {
+                // Replace
+                surface_.transfer(newSurf);
+            }
+        }
+    }
+}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
diff --git a/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.H b/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.H
index a6ab32d799ff5da0dfbf9495d4b18a4bf90b9af4..05da864184ad6a5b42839248ff2d8a704f686d78 100644
--- a/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.H
+++ b/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurface.H
@@ -84,6 +84,7 @@ Usage
         Property | Description                             | Required | Default
         type     | meshedSurface                           | yes      |
         surface  | surface name in triSurface/             | yes      |
+        patches  | Limit to named surface regions (wordRes) | no  |
         source   | cells/insideCells/boundaryFaces         | yes      |
         keepIds  | pass through id numbering               | no       | false
     \endtable
@@ -141,7 +142,7 @@ private:
         word surfaceName_;
 
         //- Surface to sample on
-        const meshedSurface surface_;
+        meshedSurface surface_;
 
         //- Whether to sample internal cell values or boundary values
         const samplingSource sampleSource_;
diff --git a/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurfaceNormal.H b/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurfaceNormal.H
index 7b595d64611d70c1dc54f610908bbc84b04437d7..24a580e0353ac99da5ce2af1cecdabcddcefad8e 100644
--- a/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurfaceNormal.H
+++ b/src/sampling/sampledSurface/sampledMeshedSurface/sampledMeshedSurfaceNormal.H
@@ -54,6 +54,7 @@ Usage
         Property | Description                             | Required | Default
         type     | meshedSurfaceNormal                     | yes      |
         surface  | surface name in triSurface/             | yes      |
+        patches  | Limit to named surface regions (wordRes) | no  |
         source   | cells/insideCells/boundaryFaces         | yes      |
         keepIds  | pass through id numbering               | no       | false
     \endtable