diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
index 69d4ae84d44105db6456735cb74b4470026635e5..0df0e93d145d20835891c7d42d37bfdea40ddf4e 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
@@ -204,7 +204,8 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
 (
     Ostream& os,
     const meshedSurf& surf,
-    List<faceList>& decomposedFaces
+    labelList& decompOffsets,
+    DynamicList<face>& decompFaces
 ) const
 {
     const pointField& points = surf.points();
@@ -213,9 +214,9 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
 
     // Write points
 
-    os  << "$" << nl
-        << "$ Points" << nl
-        << "$" << nl;
+    os  << token::DOLLAR << nl
+        << token::DOLLAR << token::SPACE << "Points" << nl
+        << token::DOLLAR << nl;
 
     forAll(points, pointi)
     {
@@ -223,18 +224,19 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
     }
 
     // Write faces, with on-the-fly decomposition (triangulation)
-    decomposedFaces.clear();
-    decomposedFaces.resize(faces.size());
+    decompOffsets.resize(faces.size()+1);
+    decompFaces.clear();
 
-    os  << "$" << nl
-        << "$ Faces" << nl
-        << "$" << nl;
+    decompOffsets = 0;
 
-    label elemId = 0; // The element-id
+    os  << token::DOLLAR << nl
+        << token::DOLLAR << token::SPACE << "Faces" << nl
+        << token::DOLLAR << nl;
+
+    label elemId = 0;  // The element-id
     forAll(faces, facei)
     {
         const face& f = faces[facei];
-        faceList& decomp = decomposedFaces[facei];
 
         // 1-offset for PID
         const label propId = 1 + (facei < zones.size() ? zones[facei] : 0);
@@ -242,28 +244,36 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
         if (f.size() == 3)
         {
             writeFace(os, "CTRIA3", f, ++elemId, propId);
-            decomp.resize(1);
-            decomp[0] = f;
         }
         else if (f.size() == 4)
         {
             writeFace(os, "CQUAD4", f, ++elemId, propId);
-            decomp.resize(1);
-            decomp[0] = f;
         }
         else
         {
-            // Decompose poly face into tris
-            decomp.resize(f.nTriangles());
-
-            label nTri = 0;
-            f.triangles(points, nTri, decomp);
-
-            for (const face& f2 : decomp)
+            // Decompose into tris
+            f.triangles(points, decompFaces);
+
+            for
+            (
+                label decompi = decompOffsets[facei];
+                decompi < decompFaces.size();
+                ++decompi
+            )
             {
-                writeFace(os, "CTRIA3", f2, ++elemId, propId);
+                writeFace
+                (
+                    os,
+                    "CTRIA3",
+                    decompFaces[decompi],
+                    ++elemId,
+                    propId
+                );
             }
         }
+
+        // Update offsets
+        decompOffsets[facei+1] = decompFaces.size();
     }
 }
 
@@ -431,12 +441,14 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::write()
         fileFormats::NASCore::setPrecision(os, writeFormat_);
 
         os  << "TITLE=OpenFOAM " << outputPath_.name()
-            << " mesh" << nl
-            << "$" << nl
+            << token::SPACE << "mesh" << nl
+            << token::DOLLAR << nl
             << "BEGIN BULK" << nl;
 
-        List<faceList> decomposedFaces;
-        writeGeometry(os, surf, decomposedFaces);
+        labelList decompOffsets;
+        DynamicList<face> decompFaces;
+
+        writeGeometry(os, surf, decompOffsets, decompFaces);
 
         writeFooter(os, surf)
             << "ENDDATA" << nl;
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H
index b27831174f49fec85f73f769af3229e2fde6a257..e2ddba4ac746b552c8f053a1d510a9659ce5f04e 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H
@@ -155,12 +155,16 @@ private:
             const label propId      //!< 1-based Property Id
         ) const;
 
-        //- Main driver to write the surface mesh geometry
+        //- Write the surface mesh geometry, tracking face decomposition
+        //
+        //  \param decompOffsets  begin/end offsets (size+1) into decompFaces
+        //  \param decompFaces    Non tri/quad decomposed into triangles
         void writeGeometry
         (
             Ostream& os,
             const meshedSurf& surf,
-            List<faceList>& decomposedFaces
+            labelList& decompOffsets,
+            DynamicList<face>& decompFaces
         ) const;
 
         //- Write the formatted keyword to the output stream
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
index 3b29d8a2c223c394865a7c38be81a8f73fe52cdd..d25c4e7fa8d9b66ab4d0b5fb7092ffd8cd5798f0 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
@@ -208,29 +208,69 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
         }
 
         os  << "TITLE=OpenFOAM " << outputFile.name()
-            << " " << fieldName << " data" << nl
-            << "$" << nl
+            << token::SPACE << fieldName << " data" << nl;
+
+        if (useTimeDir() && !timeName().empty())
+        {
+            os  << token::DOLLAR << nl
+                << token::DOLLAR << token::SPACE << "TIME " << timeName() << nl;
+        }
+
+        os  << token::DOLLAR << nl
             << "TIME " << timeValue << nl
-            << "$" << nl
+            << token::DOLLAR << nl
             << "BEGIN BULK" << nl;
 
-        List<faceList> decomposedFaces;
-        writeGeometry(os, surf, decomposedFaces);
 
-        os  << "$" << nl
-            << "$ Field data" << nl
-            << "$" << nl;
+        // Regular faces
+        const faceList& faces = surf.faces();
+
+        // Additional bookkeeping for decomposing non tri/quad
+        labelList decompOffsets;
+        DynamicList<face> decompFaces;
+
+        writeGeometry(os, surf, decompOffsets, decompFaces);
+
+        os  << token::DOLLAR << nl
+            << token::DOLLAR << token::SPACE
+            << "Field data" << nl
+            << token::DOLLAR << nl;
 
         label elemId = 0;
 
         if (this->isPointData())
         {
-            for (const faceList& dFaces : decomposedFaces)
+            forAll(faces, facei)
             {
-                for (const face& f : dFaces)
+                const label beginElemId = elemId;
+
+                // Any face decomposition
+                for
+                (
+                    label decompi = decompOffsets[facei];
+                    decompi < decompOffsets[facei+1];
+                    ++decompi
+                )
                 {
+                    const face& f = decompFaces[decompi];
+
                     Type v = Zero;
+                    for (const label verti : f)
+                    {
+                        v += values[verti];
+                    }
+                    v /= f.size();
+
+                    writeFaceValue(os, format, v, ++elemId);
+                }
 
+
+                // Face not decomposed
+                if (beginElemId == elemId)
+                {
+                    const face& f = faces[facei];
+
+                    Type v = Zero;
                     for (const label verti : f)
                     {
                         v += values[verti];
@@ -245,12 +285,20 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
         {
             auto valIter = values.cbegin();
 
-            for (const faceList& dFaces : decomposedFaces)
+            forAll(faces, facei)
             {
-                forAll(dFaces, facei)
+                label nValues =
+                    max
+                    (
+                        label(1),
+                        (decompOffsets[facei+1] - decompOffsets[facei])
+                    );
+
+                while (nValues--)
                 {
                     writeFaceValue(os, format, *valIter, ++elemId);
                 }
+
                 ++valIter;
             }
         }