diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
index 8f5b5f01a194149be3efb60c4ca6b9bd4f434f12..2892fe86362fbfde4f3de09134c7572a5a249f89 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
@@ -164,19 +164,18 @@ void Foam::sampledSurfaces::countFields()
     }
 
     // Now propagate field counts (per surface)
+    // - can update writer even when not writing without problem
 
-    label surfi = 0;
-
-    for (const sampledSurface& s : surfaces())
+    forAll(*this, surfi)
     {
+        const sampledSurface& s = (*this)[surfi];
+
         writers_[surfi].nFields() =
         (
             nVolumeFields
           + (s.withSurfaceFields() ? nSurfaceFields : 0)
           + ((s.hasFaceIds() && !s.interpolate()) ? 1 : 0)
         );
-
-        ++surfi;
     }
 }
 
@@ -446,9 +445,10 @@ bool Foam::sampledSurfaces::read(const dictionary& dict)
         dict.readEntry("fields", fieldSelection_);
         fieldSelection_.uniq();
 
-        label surfi = 0;
-        for (const sampledSurface& s : surfs)
+        forAll(*this, surfi)
         {
+            const sampledSurface& s = (*this)[surfi];
+
             if (!surfi)
             {
                 Info<< "Sampled surface:" << nl;
@@ -465,8 +465,6 @@ bool Foam::sampledSurfaces::read(const dictionary& dict)
                 Info<< ", store as surfMesh (deprecated)";
             }
             Info<< nl;
-
-            ++surfi;
         }
         Info<< nl;
     }
@@ -492,36 +490,34 @@ bool Foam::sampledSurfaces::read(const dictionary& dict)
 
 bool Foam::sampledSurfaces::performAction(unsigned request)
 {
-    if
-    (
-        empty()
-     || (request == ACTION_NONE)
-     || !testAny
-        (
-            actions_,
-            [=] (unsigned action) { return (request & action); }
-        )
-    )
+    // Update surfaces, writer associations etc.
+
+    bool ok = false;
+
+    forAll(*this, surfi)
     {
-        return true;
-    }
+        sampledSurface& s = (*this)[surfi];
 
+        if (request & actions_[surfi])
+        {
+            if (s.update())
+            {
+                writers_[surfi].expire();
+            }
 
-    // Finalize surfaces, update information, writer associations etc.
-    update();
+            nFaces_[surfi] = returnReduce(s.faces().size(), sumOp<label>());
 
-    bool noFaces = true;
-    for (const label n : nFaces_)
-    {
-        if (n) noFaces = false;
+            ok = ok || nFaces_[surfi];
+        }
     }
 
-    if (noFaces)
+    if (!ok)
     {
-        // No surfaces with faces at all.
+        // No surface with faces or an applicable action
         return true;
     }
 
+
     // Determine the per-surface number of fields, including Ids etc.
     // Only seems to be needed for VTK legacy
     countFields();
@@ -531,6 +527,15 @@ bool Foam::sampledSurfaces::performAction(unsigned request)
     {
         const sampledSurface& s = (*this)[surfi];
 
+        if (!(request & actions_[surfi]))
+        {
+            continue;
+        }
+
+        // TDB: do we store empty surfaces, skip them, or remove them
+        // from the registry?
+        // - For now, just skip touching them.
+
         if (!nFaces_[surfi])
         {
             continue;
@@ -689,10 +694,10 @@ bool Foam::sampledSurfaces::expire()
 
     label nChanged = 0;
 
-    label surfi = 0;
-
-    for (sampledSurface& s : surfaces())
+    forAll(*this, surfi)
     {
+        sampledSurface& s = (*this)[surfi];
+
         if (s.expire())
         {
             ++nChanged;
@@ -701,8 +706,6 @@ bool Foam::sampledSurfaces::expire()
         writers_[surfi].expire();
         writers_[surfi].mergeDim() = mergeDim;
         nFaces_[surfi] = 0;
-
-        ++surfi;
     }
 
     // True if any surfaces just expired
@@ -719,10 +722,10 @@ bool Foam::sampledSurfaces::update()
 
     label nUpdated = 0;
 
-    label surfi = 0;
-
-    for (sampledSurface& s : surfaces())
+    forAll(*this, surfi)
     {
+        sampledSurface& s = (*this)[surfi];
+
         if (s.update())
         {
             ++nUpdated;
@@ -730,8 +733,6 @@ bool Foam::sampledSurfaces::update()
         }
 
         nFaces_[surfi] = returnReduce(s.faces().size(), sumOp<label>());
-
-        ++surfi;
     }
 
     return nUpdated;