diff --git a/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h b/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h
index ee46360b0ccab03701613c706492cca53a554b27..1d19d0e26605e6646ede00ed7a15896d00e77fa9 100644
--- a/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h
+++ b/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h
@@ -86,6 +86,10 @@ private:
   std::vector<uint16_t>
   createTriangularFaces(std::vector<int> &faceIndices,
                         std::vector<uint16_t> &windingOrder) const;
+
+  void createTrianglesFromPolygon(std::vector<uint16_t> &windingOrder,
+                                  std::vector<uint16_t> &triangularFaces,
+                                  int &startOfFace, int &endOfFace) const;
 };
 
 } // namespace NexusGeometry
diff --git a/Framework/NexusGeometry/src/NexusGeometryParser.cpp b/Framework/NexusGeometry/src/NexusGeometryParser.cpp
index 1ee56e1502da7241edd17cabef445897206e72e1..03f8464b8b51dc0255b28e522fcf839a752251eb 100644
--- a/Framework/NexusGeometry/src/NexusGeometryParser.cpp
+++ b/Framework/NexusGeometry/src/NexusGeometryParser.cpp
@@ -458,23 +458,36 @@ std::vector<uint16_t> NexusGeometryParser::createTriangularFaces(
   std::vector<uint16_t> triangularFaces;
 
   int startOfFace = 0;
+  int endOfFace = 0;
   for (auto it = faceIndices.begin() + 1; it != faceIndices.end(); ++it) {
-    int endOfFace = *it;
-    int polygonOrder = endOfFace - startOfFace;
+    endOfFace = *it;
+    createTrianglesFromPolygon(windingOrder, triangularFaces, startOfFace,
+                               endOfFace);
+  }
 
-    auto first = windingOrder.begin() + startOfFace;
+  // and the last face
+  endOfFace = static_cast<int>(windingOrder.size());
+  createTrianglesFromPolygon(windingOrder, triangularFaces, startOfFace,
+                             endOfFace);
 
-    for (int polygonVertex = 1; polygonVertex < polygonOrder - 1;
-         ++polygonVertex) {
-      triangularFaces.push_back(*first);
-      triangularFaces.push_back(*(windingOrder.begin() + polygonVertex));
-      triangularFaces.push_back(*(windingOrder.begin() + polygonVertex + 1));
-    }
-    startOfFace = endOfFace + 1;
-  }
   return triangularFaces;
 }
 
+void NexusGeometryParser::createTrianglesFromPolygon(
+    std::vector<uint16_t> &windingOrder, std::vector<uint16_t> &triangularFaces,
+    int &startOfFace, int &endOfFace) const {
+  int polygonOrder = endOfFace - startOfFace;
+  auto first = windingOrder.begin() + startOfFace;
+
+  for (int polygonVertex = 1; polygonVertex < polygonOrder - 1;
+       ++polygonVertex) {
+    triangularFaces.push_back(*first);
+    triangularFaces.push_back(*(windingOrder.begin() + polygonVertex));
+    triangularFaces.push_back(*(windingOrder.begin() + polygonVertex + 1));
+  }
+  startOfFace = endOfFace + 1; // start of the next face
+}
+
 // Parse source and add to instrument
 void NexusGeometryParser::parseAndAddSource() {
   H5std_string sourcePath = "raw_data_1/instrument/source";