diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
index 3bfd799dadb4d29fc60a51aaed18489edcf697ba..69d4ae84d44105db6456735cb74b4470026635e5 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2016 OpenFOAM Foundation
-    Copyright (C) 2015-2019 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -129,8 +129,8 @@ void Foam::surfaceWriters::nastranWriter::writeFace
     Ostream& os,
     const word& faceType,
     const labelUList& facePts,
-    const label nFace,
-    const label PID
+    const label elemId,
+    const label propId
 ) const
 {
     // Only valid surface elements are CTRIA3 and CQUAD4
@@ -147,12 +147,12 @@ void Foam::surfaceWriters::nastranWriter::writeFace
 
     // For CTRIA3 elements, cols 7 onwards are not used
 
-    writeKeyword(os, faceType)   << separator_;
+    writeKeyword(os, faceType)  << separator_;
 
     os.setf(std::ios_base::right);
 
-    writeValue(os, nFace)        << separator_;
-    writeValue(os, PID);
+    writeValue(os, elemId)      << separator_;
+    writeValue(os, propId);
 
     switch (writeFormat_)
     {
@@ -204,7 +204,7 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
 (
     Ostream& os,
     const meshedSurf& surf,
-    List<DynamicList<face>>& decomposedFaces
+    List<faceList>& decomposedFaces
 ) const
 {
     const pointField& points = surf.points();
@@ -222,42 +222,46 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
         writeCoord(os, points[pointi], pointi);
     }
 
-    // Write faces
+    // Write faces, with on-the-fly decomposition (triangulation)
     decomposedFaces.clear();
-    decomposedFaces.setSize(faces.size());
+    decomposedFaces.resize(faces.size());
 
     os  << "$" << nl
         << "$ Faces" << nl
         << "$" << nl;
 
-    label nFace = 0; // the element-id
+    label elemId = 0; // The element-id
     forAll(faces, facei)
     {
         const face& f = faces[facei];
+        faceList& decomp = decomposedFaces[facei];
+
         // 1-offset for PID
-        const label PID = 1 + (facei < zones.size() ? zones[facei] : 0);
+        const label propId = 1 + (facei < zones.size() ? zones[facei] : 0);
 
         if (f.size() == 3)
         {
-            writeFace(os, "CTRIA3", f, ++nFace, PID);
-            decomposedFaces[facei].append(f);
+            writeFace(os, "CTRIA3", f, ++elemId, propId);
+            decomp.resize(1);
+            decomp[0] = f;
         }
         else if (f.size() == 4)
         {
-            writeFace(os, "CQUAD4", f, ++nFace, PID);
-            decomposedFaces[facei].append(f);
+            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;
-            faceList triFaces;
-            f.triangles(points, nTri, triFaces);
+            f.triangles(points, nTri, decomp);
 
-            forAll(triFaces, trii)
+            for (const face& f2 : decomp)
             {
-                writeFace(os, "CTRIA3", triFaces[trii], ++nFace, PID);
-                decomposedFaces[facei].append(triFaces[trii]);
+                writeFace(os, "CTRIA3", f2, ++elemId, propId);
             }
         }
     }
@@ -275,7 +279,7 @@ Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFooter
     labelList pidsUsed = labelHashSet(surf.zoneIds()).sortedToc();
     if (pidsUsed.empty())
     {
-        pidsUsed.setSize(1, Zero); // fallback
+        pidsUsed.resize(1, Zero); // fallback
     }
 
     for (auto pid : pidsUsed)
@@ -431,7 +435,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::write()
             << "$" << nl
             << "BEGIN BULK" << nl;
 
-        List<DynamicList<face>> decomposedFaces;
+        List<faceList> decomposedFaces;
         writeGeometry(os, surf, decomposedFaces);
 
         writeFooter(os, surf)
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H
index 4bd29f5c72f5526ab74f35339bc979e294cf211f..d2c0da73f4441bc76dfbfc04a09c61887ecc6ca9 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2016 OpenFOAM Foundation
-    Copyright (C) 2015-2019 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -151,8 +151,8 @@ private:
             Ostream& os,
             const word& faceType,
             const labelUList& facePts,
-            const label EID,    //!< 1-based Element Id
-            const label PID     //!< 1-based Property Id
+            const label elemId,     //!< 1-based Element Id
+            const label propId      //!< 1-based Property Id
         ) const;
 
         //- Main driver to write the surface mesh geometry
@@ -160,7 +160,7 @@ private:
         (
             Ostream& os,
             const meshedSurf& surf,
-            List<DynamicList<face>>& decomposedFaces
+            List<faceList>& decomposedFaces
         ) const;
 
         //- Write the formatted keyword to the output stream
@@ -184,7 +184,7 @@ private:
             Ostream& os,
             const loadFormat format,
             const Type& value,
-            const label EID     //!< 1-based Element Id
+            const label elemId      //!< 1-based Element Id
         ) const;
 
 
@@ -199,16 +199,16 @@ private:
 
 public:
 
-    //- Runtime type information
+    //- Declare type-name, virtual type (with debug switch)
     TypeNameNoDebug("nastran");
 
 
     // Constructors
 
-        //- Construct null
+        //- Default construct. Default SHORT format
         nastranWriter();
 
-        //- Construct with some output options
+        //- Construct with some output options. Default LONG format
         explicit nastranWriter(const dictionary& options);
 
         //- Construct from components
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
index da1014b0c450b06dcc7ec49a28b89cd006ec8ae7..3b29d8a2c223c394865a7c38be81a8f73fe52cdd 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2016 OpenFOAM Foundation
-    Copyright (C) 2015-2019 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -70,7 +70,7 @@ Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFaceValue
     Ostream& os,
     const loadFormat format,
     const Type& value,
-    const label EID
+    const label elemId
 ) const
 {
     // Fixed short/long formats supporting PLOAD2 and PLOAD4:
@@ -87,7 +87,7 @@ Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFaceValue
     // 3 EID        : element ID
     // 4 onwards    : load values
 
-    label SID = 1;
+    const label setId = 1;
 
     Type scaledValue = scale_*value;
 
@@ -98,7 +98,7 @@ Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFaceValue
     // Write load set ID
     os.setf(std::ios_base::right);
 
-    writeValue(os, SID) << separator_;
+    writeValue(os, setId) << separator_;
 
     switch (format)
     {
@@ -119,13 +119,13 @@ Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFaceValue
                 writeValue(os, scalar(0)) << separator_;
             }
 
-            writeValue(os, EID);
+            writeValue(os, elemId);
             break;
         }
 
         case loadFormat::PLOAD4 :
         {
-            writeValue(os, EID);
+            writeValue(os, elemId);
 
             for (direction d = 0; d < pTraits<Type>::nComponents; ++d)
             {
@@ -197,7 +197,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
             mkDir(outputFile.path());
         }
 
-        const scalar timeValue = 0.0;
+        const scalar timeValue(0);
 
         OFstream os(outputFile);
         fileFormats::NASCore::setPrecision(os, writeFormat_);
@@ -214,7 +214,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
             << "$" << nl
             << "BEGIN BULK" << nl;
 
-        List<DynamicList<face>> decomposedFaces;
+        List<faceList> decomposedFaces;
         writeGeometry(os, surf, decomposedFaces);
 
         os  << "$" << nl
@@ -225,7 +225,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
 
         if (this->isPointData())
         {
-            for (const DynamicList<face>& dFaces : decomposedFaces)
+            for (const faceList& dFaces : decomposedFaces)
             {
                 for (const face& f : dFaces)
                 {
@@ -243,12 +243,15 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
         }
         else
         {
-            for (const DynamicList<face>& dFaces : decomposedFaces)
+            auto valIter = values.cbegin();
+
+            for (const faceList& dFaces : decomposedFaces)
             {
                 forAll(dFaces, facei)
                 {
-                    writeFaceValue(os, format, values[facei], ++elemId);
+                    writeFaceValue(os, format, *valIter, ++elemId);
                 }
+                ++valIter;
             }
         }