diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
index 23c52913b6bf71afde18e62ad2837a1495633429..6b1684577beb177f1767d0032682ea5905c08828 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
@@ -1034,16 +1034,6 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::read
             mesh_,
             dict.subDict("sampledSurfaceDict")
         );
-
-        if (sampledPtr_->interpolate())
-        {
-            // Should probably ignore interpolate entirely,
-            // but the oldest isoSurface algorithm requires it!
-            WarningInFunction
-                << type() << ' ' << name() << ": "
-                << "sampledSurface with interpolate = true "
-                << "is likely incorrect" << nl << nl;
-        }
     }
 
     Info<< type() << ' ' << name() << ':' << nl
@@ -1061,15 +1051,6 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::read
 
     if (usesWeight())
     {
-        if (stSampled == regionType_)
-        {
-            FatalIOErrorInFunction(dict)
-                << "Cannot use weighted operation '"
-                << operationTypeNames_[operation_]
-                << "' for sampledSurface"
-                << exit(FatalIOError);
-        }
-
         // Can have "weightFields" or "weightField"
 
         bool missing = true;
@@ -1140,6 +1121,9 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::read
             )
         );
 
+        // Propagate field counts (per surface)
+        surfaceWriterPtr_->nFields() = fields_.size();
+
         if (debug)
         {
             surfaceWriterPtr_->verbose(true);
diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
index 20effe990b4fcf49636ec939507e046af64e490e..9db9386e6497a20c08daaa5c4ccb4fb0f319bc92 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
@@ -96,18 +96,13 @@ Foam::functionObjects::fieldValues::surfaceFieldValue::getFieldValues
 
         if (sampledPtr_)
         {
-            if (sampledPtr_->interpolate())
-            {
-                const interpolationCellPoint<Type> interp(fld);
+            // Could be runtime selectable
+            // auto sampler = interpolation<Type>::New(sampleFaceScheme_, fld);
 
-                return sampledPtr_->interpolate(interp);
-            }
-            else
-            {
-                const interpolationCell<Type> interp(fld);
+            // const interpolationCellPoint<Type> interp(fld);
+            const interpolationCell<Type> interp(fld);
 
-                return sampledPtr_->sample(interp);
-            }
+            return sampledPtr_->sample(interp);
         }
         else
         {
@@ -324,6 +319,30 @@ Foam::label Foam::functionObjects::fieldValues::surfaceFieldValue::writeAll
 {
     label nProcessed = 0;
 
+    // If using the surface writer, the points/faces parameters have already
+    // been merged on the master and the writeValues routine will also gather
+    // all data onto the master before calling the writer.
+    // Thus only call the writer on master!
+
+    // Begin writer time step
+    if (Pstream::master() && surfaceWriterPtr_ && surfaceWriterPtr_->enabled())
+    {
+        auto& writer = *surfaceWriterPtr_;
+
+        writer.open
+        (
+            points,
+            faces,
+            (
+                outputDir()
+              / regionTypeNames_[regionType_] + ("_" + regionName_)
+            ),
+            false  // serial - already merged
+        );
+
+        writer.beginTime(time_);
+    }
+
     for (const word& fieldName : fields_)
     {
         if
@@ -349,6 +368,23 @@ Foam::label Foam::functionObjects::fieldValues::surfaceFieldValue::writeAll
         }
     }
 
+    // Finish writer time step
+    if (Pstream::master() && surfaceWriterPtr_ && surfaceWriterPtr_->enabled())
+    {
+        auto& writer = *surfaceWriterPtr_;
+
+        // Write geometry if no fields were written so that we still
+        // can have something to look at.
+
+        if (!writer.wroteData())
+        {
+            writer.write();
+        }
+
+        writer.endTime();
+        writer.clear();
+    }
+
     return nProcessed;
 }
 
@@ -377,29 +413,13 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::writeValues
 
             if (Pstream::master())
             {
-                surfaceWriterPtr_->open
-                (
-                    points,
-                    faces,
-                    (
-                        outputDir()
-                      / regionTypeNames_[regionType_] + ("_" + regionName_)
-                    ),
-                    false  // serial - already merged
-                );
-
-                // Point data? Should probably disallow
-                if (sampledPtr_)
-                {
-                    surfaceWriterPtr_->isPointData() =
-                        sampledPtr_->interpolate();
-                }
-
-                surfaceWriterPtr_->nFields() = 1;  // Needed for VTK legacy
-
-                surfaceWriterPtr_->write(fieldName, allValues);
+                fileName outputName =
+                    surfaceWriterPtr_->write(fieldName, allValues);
 
-                surfaceWriterPtr_->clear();
+                // Case-local file name with "<case>" to make relocatable
+                dictionary propsDict;
+                propsDict.add("file", time_.relativePath(outputName, true));
+                this->setProperty(fieldName, propsDict);
             }
         }
 
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
index b78aa1dcbbdaadd0ee2f1fd978623f2a06fc1267..41c42189c24f7cd7ea6690673093e63dbede3779 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2016-2020 OpenCFD Ltd.
+    Copyright (C) 2016-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -215,7 +215,7 @@ protected:
 public:
 
     //- Runtime type information
-    TypeName("samplediIsoSurfacePoint");
+    TypeName("sampledIsoSurface");
 
 
     // Constructors