diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
index fcfb3478e6b4ce05d71047302022b6c094a4c499..8af64331726b82f7a1a5ebf99bd4b95b4c85124e 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
@@ -536,6 +536,7 @@ bool Foam::sampledSurfaces::performAction(unsigned request)
     // Only seems to be needed for VTK legacy
     countFields();
 
+
     // Update writers
 
     forAll(*this, surfi)
@@ -544,7 +545,6 @@ bool Foam::sampledSurfaces::performAction(unsigned request)
 
         if (((request & actions_[surfi]) & ACTION_WRITE) && nFaces_[surfi])
         {
-            // Output writers
             surfaceWriter& outWriter = writers_[surfi];
 
             if (outWriter.needsUpdate())
@@ -556,24 +556,14 @@ bool Foam::sampledSurfaces::performAction(unsigned request)
 
             outWriter.beginTime(obr_.time());
 
-
-            // Write geometry if no fields would otherwise be written
-            if (!outWriter.nFields() || outWriter.separateGeometry())
-            {
-                outWriter.write();
-                continue;
-            }
-
-            // Write original ids - as label or scalar field
-
-            const word fieldName("Ids");
+            // Write original ids
             if (s.hasFaceIds() && !s.interpolate())
             {
                 writeSurface
                 (
                     outWriter,
                     Field<label>(s.originalIds()),
-                    fieldName
+                    "Ids"
                 );
             }
         }
@@ -610,8 +600,16 @@ bool Foam::sampledSurfaces::performAction(unsigned request)
     // Finish this time step
     forAll(writers_, surfi)
     {
-        if ((request & actions_[surfi]) & ACTION_WRITE)
+        if (((request & actions_[surfi]) & ACTION_WRITE) && nFaces_[surfi])
         {
+            // Write geometry if no fields were written so that we still
+            // can have something to look at
+
+            if (!writers_[surfi].wroteData())
+            {
+                writers_[surfi].write();
+            }
+
             writers_[surfi].endTime();
         }
     }
diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H
index fae2c54f67f43988884bd0ee56c9a3db054aa509..c72fc1034d268a6abff7a0f0fb11e67206aa9ac0 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H
@@ -352,19 +352,19 @@ public:
         void verbose(const bool verbosity = true);
 
         //- Read the sampledSurfaces dictionary
-        virtual bool read(const dictionary&);
+        virtual bool read(const dictionary& dict);
 
-        //- Execute, currently does nothing
+        //- Sample and store if the sampleOnExecute is enabled.
         virtual bool execute();
 
         //- Sample and write
         virtual bool write();
 
         //- Update for changes of mesh - expires the surfaces
-        virtual void updateMesh(const mapPolyMesh&);
+        virtual void updateMesh(const mapPolyMesh& mpm);
 
         //- Update for mesh point-motion - expires the surfaces
-        virtual void movePoints(const polyMesh&);
+        virtual void movePoints(const polyMesh& mesh);
 
         //- Update for changes of mesh due to readUpdate - expires the surfaces
         virtual void readUpdate(const polyMesh::readUpdateState state);
@@ -372,7 +372,7 @@ public:
         //- Get merge tolerance
         static scalar mergeTol();
 
-        //- Set tolerance (and return old tolerance)
+        //- Set tolerance and return old tolerance
         static scalar mergeTol(const scalar tol);
 };
 
diff --git a/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.C b/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.C
index 8b3db9f2f4694159bd51ccef32c08c68631f1f4a..fc8482b81410fc55c2f5789f3b226f77f770837f 100644
--- a/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.C
+++ b/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.C
@@ -159,6 +159,7 @@ Foam::fileName Foam::surfaceWriters::boundaryDataWriter::write()
         //pts.writeEndDivider(os);
     }
 
+    wroteGeom_ = true;
     return surfaceDir;
 }
 
@@ -264,6 +265,7 @@ Foam::fileName Foam::surfaceWriters::boundaryDataWriter::writeTemplate
         OFstream(outputFile)() << tfield();
     }
 
+    wroteGeom_ = true;
     return surfaceDir;
 }
 
diff --git a/src/surfMesh/writers/ensight/ensightSurfaceWriter.C b/src/surfMesh/writers/ensight/ensightSurfaceWriter.C
index 69f2d69e8b2f80dd19549368fd0391299964c369..f1e31b2e669acb3fd498f22bb67aa7e108c00e96 100644
--- a/src/surfMesh/writers/ensight/ensightSurfaceWriter.C
+++ b/src/surfMesh/writers/ensight/ensightSurfaceWriter.C
@@ -185,6 +185,7 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::write()
     // {
     //     return writeUncollated();
     // }
+
     return writeUncollated();
 }
 
diff --git a/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C b/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
index 0b2724ae61618a5d9378c28bedb1a9a5290a5e60..e80fce7999139a2397d207f76edd45f2f06fe6ec 100644
--- a/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
+++ b/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
@@ -34,7 +34,8 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::writeCollated()
     // Geometry:  rootdir/surfaceName/surfaceName.case
     // Geometry:  rootdir/surfaceName/surfaceName.mesh
 
-    return fileName();
+    wroteGeom_ = true;
+    return fileName::null;
 }
 
 
@@ -368,7 +369,7 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::writeCollated
         }
     }
 
-
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C b/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
index c3cd3a537891b3d66d3c88d147c85b39564d274f..0c89ebf75ac9263cca95bf29293f27f2a9441f4d 100644
--- a/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
+++ b/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
@@ -97,6 +97,7 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::writeUncollated()
         osGeom << ensPart;
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
@@ -245,6 +246,7 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::writeUncollated
         }
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/foam/foamSurfaceWriter.C b/src/surfMesh/writers/foam/foamSurfaceWriter.C
index 8d72939d696ce3af7b135841cadbec07e74866ee..2f011c7fe24adafcc5e600e8bf682cbfd5496e74 100644
--- a/src/surfMesh/writers/foam/foamSurfaceWriter.C
+++ b/src/surfMesh/writers/foam/foamSurfaceWriter.C
@@ -142,6 +142,7 @@ Foam::fileName Foam::surfaceWriters::foamWriter::write()
         OFstream(surfaceDir/"faceCentres")() << faceCentres;
     }
 
+    wroteGeom_ = true;
     return surfaceDir;
 }
 
@@ -155,6 +156,12 @@ Foam::fileName Foam::surfaceWriters::foamWriter::writeTemplate
     const Field<Type>& localValues
 )
 {
+    // Separate geometry
+    if (!wroteGeom_)
+    {
+        write();
+    }
+
     checkOpen();
 
     // Geometry should already have been written
@@ -197,6 +204,7 @@ Foam::fileName Foam::surfaceWriters::foamWriter::writeTemplate
         OFstream(outputFile)() << tfield();
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
index da98e638d4ba97223e1c1ad0b1c5331ffc6d4dc8..df5314c2951972341d2a446e378c3abb51ebbf0a 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
@@ -437,6 +437,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::write()
             << "ENDDATA" << nl;
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
index a1809c91e6144810d9c40991fe6f0237c555eb3e..b507d45a4f5f54203c0a387c22a4b047717bb9ac 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
@@ -255,6 +255,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
             << "ENDDATA" << endl;
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/null/nullSurfaceWriter.C b/src/surfMesh/writers/null/nullSurfaceWriter.C
index 9e245f91ec126b67339d681f2b5b84706ff2f00d..93ab5ea177fb57453bc86d839df887e1c82f6892 100644
--- a/src/surfMesh/writers/null/nullSurfaceWriter.C
+++ b/src/surfMesh/writers/null/nullSurfaceWriter.C
@@ -87,6 +87,12 @@ bool Foam::surfaceWriters::nullWriter::needsUpdate() const
 }
 
 
+bool Foam::surfaceWriters::nullWriter::wroteData() const
+{
+    return true;
+}
+
+
 bool Foam::surfaceWriters::nullWriter::enabled() const
 {
     return false;
@@ -116,6 +122,7 @@ void Foam::surfaceWriters::nullWriter::open(const fileName& outputPath)
 
 Foam::fileName Foam::surfaceWriters::nullWriter::write()
 {
+    wroteGeom_ = true;
     return fileName::null;
 }
 
diff --git a/src/surfMesh/writers/null/nullSurfaceWriter.H b/src/surfMesh/writers/null/nullSurfaceWriter.H
index 5ccf8a5f099232d42eb95b3f39d76dc7f5b6d159..809d79765108d4c9572e8dd0941840349da4d018 100644
--- a/src/surfMesh/writers/null/nullSurfaceWriter.H
+++ b/src/surfMesh/writers/null/nullSurfaceWriter.H
@@ -94,10 +94,13 @@ public:
 
     // Capability
 
-        //- Never needs an update.
+        //- False: never needs an update.
         virtual bool needsUpdate() const;
 
-        //- The null writer is always disabled, which lets the caller
+        //- True: like a /dev/null device.
+        virtual bool wroteData() const;
+
+        //- False: The null writer is never enabled, which lets the caller
         //- skip various (possibly expensive) preparatory operations.
         virtual bool enabled() const;
 
diff --git a/src/surfMesh/writers/proxy/proxySurfaceWriter.C b/src/surfMesh/writers/proxy/proxySurfaceWriter.C
index 77518db6bd2468beaa1ce3004759eedbec73183c..6bfbe35a2a76a6b73b430215a5bb80bfc329bd84 100644
--- a/src/surfMesh/writers/proxy/proxySurfaceWriter.C
+++ b/src/surfMesh/writers/proxy/proxySurfaceWriter.C
@@ -135,6 +135,7 @@ Foam::fileName Foam::surfaceWriters::proxyWriter::write()
         );
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/raw/rawSurfaceWriter.C b/src/surfMesh/writers/raw/rawSurfaceWriter.C
index 2e79256aaa6a13126e461ce76512ded754cc8369..73c30f89aed69585a7ee271544d3c4eb7e36e717 100644
--- a/src/surfMesh/writers/raw/rawSurfaceWriter.C
+++ b/src/surfMesh/writers/raw/rawSurfaceWriter.C
@@ -178,6 +178,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::write()
         os  << nl;
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C b/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C
index 662f24d7b63ee78239a24106f3449f801a85901f..98b601cf081e0f9f85a0c0acc12f1241278519ed 100644
--- a/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C
@@ -197,6 +197,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
         }
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/starcd/starcdSurfaceWriter.C b/src/surfMesh/writers/starcd/starcdSurfaceWriter.C
index 75412a20aecb5adeb130cd85f8e0769d280c62a7..70a5b5edc9048f7dc03e9853029853dccccfe270 100644
--- a/src/surfMesh/writers/starcd/starcdSurfaceWriter.C
+++ b/src/surfMesh/writers/starcd/starcdSurfaceWriter.C
@@ -145,6 +145,7 @@ Foam::fileName Foam::surfaceWriters::starcdWriter::write()
         ).write(outputFile, "inp");
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
@@ -158,6 +159,12 @@ Foam::fileName Foam::surfaceWriters::starcdWriter::writeTemplate
     const Field<Type>& localValues
 )
 {
+    // Separate geometry
+    if (!wroteGeom_)
+    {
+        write();
+    }
+
     checkOpen();
 
     // Field:  rootdir/<TIME>/<field>_surfaceName.usr
@@ -206,6 +213,7 @@ Foam::fileName Foam::surfaceWriters::starcdWriter::writeTemplate
         }
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
diff --git a/src/surfMesh/writers/surfaceWriter.C b/src/surfMesh/writers/surfaceWriter.C
index 33ddbb7fb81e54f57ffc97e1ce87983055302177..d910897c9deff92272b720185922134e95905631 100644
--- a/src/surfMesh/writers/surfaceWriter.C
+++ b/src/surfMesh/writers/surfaceWriter.C
@@ -138,6 +138,7 @@ Foam::surfaceWriter::surfaceWriter()
     surfComp_(),
     useComponents_(false),
     upToDate_(false),
+    wroteGeom_(false),
     parallel_(true),
     useTimeDir_(false),
     isPointData_(false),
@@ -244,6 +245,7 @@ void Foam::surfaceWriter::endTime()
 void Foam::surfaceWriter::open(const fileName& outputPath)
 {
     outputPath_ = outputPath;
+    wroteGeom_ = false;
 }
 
 
@@ -302,6 +304,7 @@ void Foam::surfaceWriter::open
 void Foam::surfaceWriter::close()
 {
     outputPath_.clear();
+    wroteGeom_ = false;
 }
 
 
@@ -369,11 +372,18 @@ bool Foam::surfaceWriter::needsUpdate() const
 }
 
 
+bool Foam::surfaceWriter::wroteData() const
+{
+    return wroteGeom_;
+}
+
+
 bool Foam::surfaceWriter::expire()
 {
     const bool changed = upToDate_;
 
     upToDate_ = false;
+    wroteGeom_ = false;
     nFields_ = 0;
     merged_.clear();
 
@@ -443,6 +453,11 @@ bool Foam::surfaceWriter::merge() const
     }
     upToDate_ = true;
 
+    if (changed)
+    {
+        wroteGeom_ = false;
+    }
+
     return changed;
 }
 
diff --git a/src/surfMesh/writers/surfaceWriter.H b/src/surfMesh/writers/surfaceWriter.H
index 15eb84b8cbc1f47e7fbe1e22a0944945747162a0..89772d3f1623b3ec9d0785a3b753f60d96b87768 100644
--- a/src/surfMesh/writers/surfaceWriter.H
+++ b/src/surfMesh/writers/surfaceWriter.H
@@ -56,10 +56,14 @@ Description
         verbose  | Additional output verbosity             | no  | no
     \endtable
 
+Note
+    For surface formats that require geometry in a separate file,
+    it is the responsibility of the implementation (not the caller)
+    to ensure that this occurs.
+
 SourceFiles
-    sampledWriter.C
-    sampledWriterI.H
-    sampledWriterImpl.C
+    surfaceWriter.C
+    surfaceWriterI.H
 
 \*---------------------------------------------------------------------------*/
 
@@ -83,7 +87,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declarations
+// Forward Declarations
 class Time;
 class surfaceWriter;
 
@@ -118,10 +122,13 @@ protected:
         //- The topology/surface is up-to-date?
         mutable bool upToDate_;
 
-        //- Writing in parallel (vai master)
+        //- Track if geometry has been written since the last open
+        mutable bool wroteGeom_;
+
+        //- Writing in parallel (via master)
         bool parallel_;
 
-        //- Writer should do something funny
+        //- Insert additional time sub-directory in the output path
         bool useTimeDir_;
 
         //- Is point vs cell data
@@ -185,13 +192,17 @@ protected:
             const Field<Type>& localValues  //!< Local field values to write
         )
         {
+            if (!wroteGeom_)
+            {
+                return this->write();
+            }
             return fileName::null;
         }
 
 
 public:
 
-    // Public data
+    // Public Data
 
         //- The default merge dimension (1e-8)
         static scalar defaultMergeDim;
@@ -294,6 +305,9 @@ public:
         //- Does the writer need an update (eg, lagging behind surface changes)
         virtual bool needsUpdate() const;
 
+        //- Geometry or fields written since the last open?
+        virtual bool wroteData() const;
+
         //- Mark that surface changed and the writer will need an update,
         //- and set nFields = 0.
         //  May also free up unneeded data.
diff --git a/src/surfMesh/writers/vtk/vtkSurfaceWriter.C b/src/surfMesh/writers/vtk/vtkSurfaceWriter.C
index 39deb3d4d5f6a2065487cf05241e4ee724670f1a..37986a889c192baf3b68fd7b6c9591e0ff69ed94 100644
--- a/src/surfMesh/writers/vtk/vtkSurfaceWriter.C
+++ b/src/surfMesh/writers/vtk/vtkSurfaceWriter.C
@@ -248,6 +248,7 @@ Foam::fileName Foam::surfaceWriters::vtkWriter::write()
         writer_->writeGeometry();
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }
 
@@ -288,6 +289,7 @@ Foam::fileName Foam::surfaceWriters::vtkWriter::writeTemplate
         writer_->write(fieldName, tfield());
     }
 
+    wroteGeom_ = true;
     return outputFile;
 }