diff --git a/Geo/MElement.h b/Geo/MElement.h
index 65f73ec3a108a4704c402b13467f6296057dd507..bf96e7174ad880350ead1d12b061c5df072f3b40 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -95,6 +95,9 @@ class MElement
   // get the vertex using the Nastran BDF ordering
   virtual MVertex *getVertexBDF(int num){ return getVertex(num); }
 
+  // get the number of primary vertices (first-order element)
+  virtual int getNumPrimaryVertices() = 0;
+
   // get the number of vertices associated with edges, faces and
   // volumes (nonzero only for higher order elements)
   virtual int getNumEdgeVertices(){ return 0; }
@@ -175,6 +178,7 @@ class MLine : public MElement {
   ~MLine(){}
   virtual int getDim(){ return 1; }
   virtual int getNumVertices(){ return 2; }
+  virtual int getNumPrimaryVertices(){ return 2; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 1; }
   virtual MEdge getEdge(int num){ return MEdge(_v[0], _v[1]); }
@@ -247,6 +251,7 @@ class MTriangle : public MElement {
   ~MTriangle(){}
   virtual int getDim(){ return 2; }
   virtual int getNumVertices(){ return 3; }
+  virtual int getNumPrimaryVertices(){ return 3; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 3; }
   virtual MEdge getEdge(int num)
@@ -350,6 +355,7 @@ class MQuadrangle : public MElement {
   ~MQuadrangle(){}
   virtual int getDim(){ return 2; }
   virtual int getNumVertices(){ return 4; }
+  virtual int getNumPrimaryVertices(){ return 4; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 4; }
   virtual MEdge getEdge(int num)
@@ -459,6 +465,7 @@ class MTetrahedron : public MElement {
   ~MTetrahedron(){}
   virtual int getDim(){ return 3; }
   virtual int getNumVertices(){ return 4; }
+  virtual int getNumPrimaryVertices(){ return 4; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 6; }
   virtual MEdge getEdge(int num)
@@ -611,6 +618,7 @@ class MHexahedron : public MElement {
   ~MHexahedron(){}
   virtual int getDim(){ return 3; }
   virtual int getNumVertices(){ return 8; }
+  virtual int getNumPrimaryVertices(){ return 8; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 12; }
   virtual MEdge getEdge(int num)
@@ -774,6 +782,7 @@ class MPrism : public MElement {
   ~MPrism(){}
   virtual int getDim(){ return 3; }
   virtual int getNumVertices(){ return 6; }
+  virtual int getNumPrimaryVertices(){ return 6; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 9; }
   virtual MEdge getEdge(int num)
@@ -927,6 +936,7 @@ class MPyramid : public MElement {
   ~MPyramid(){}
   virtual int getDim(){ return 3; }
   virtual int getNumVertices(){ return 5; }
+  virtual int getNumPrimaryVertices(){ return 5; }
   virtual MVertex *getVertex(int num){ return _v[num]; }
   virtual int getNumEdges(){ return 8; }
   virtual MEdge getEdge(int num)