diff --git a/Plugin/FieldFromAmplitudePhase.cpp b/Plugin/FieldFromAmplitudePhase.cpp
index 287bfe5cac4c1dce9ae592bc9b8d698fd04af204..a332e11cb64c533b29569e44c30b48fef66b7918 100644
--- a/Plugin/FieldFromAmplitudePhase.cpp
+++ b/Plugin/FieldFromAmplitudePhase.cpp
@@ -68,14 +68,14 @@ PView *GMSH_FieldFromAmplitudePhasePlugin::execute(PView *v)
   int phiView = (int)FieldFromAmplitudePhaseOptions_Number[2].def;
   std::string fileName = FieldFromAmplitudePhaseOptions_String[0].def;
 
-  std::string name_model("") ; 
+  std::string name_model("") ;
 
   if(fileName==""){
-    Msg::Info("Could not find mesh file for interpolating U=A*exp(j*k*phi)." 
+    Msg::Info("Could not find mesh file for interpolating U=A*exp(j*k*phi)."
                " Trying to use current model mesh, instead.") ;
-    name_model = GModel::current()->getName() ; 
+    name_model = GModel::current()->getName() ;
     fileName = name_model + ".msh" ;
-  } 
+  }
 
   PView *va = getView(aView, v);
   if(!va) return v;
@@ -91,33 +91,33 @@ PView *GMSH_FieldFromAmplitudePhasePlugin::execute(PView *v)
     return v;
   }
   PViewData *phiData = vphi->getData();
-  
+
   if(aData->hasMultipleMeshes() || phiData->hasMultipleMeshes()){
     Msg::Error("FieldFromAmplitudePhase plugin cannot be run on multi-mesh views");
     return v;
   }
 
   OctreePost *oA = 0, *oPhi = 0 ;
-  oA = new OctreePost(va); 
-  oPhi = new OctreePost(vphi); 
+  oA = new OctreePost(va);
+  oPhi = new OctreePost(vphi);
 
   GModel::current()->setVisibility(0);
-  GModel *umodel = new GModel ;  
-  umodel->readMSH(fileName) ; 
+  GModel *umodel = new GModel ;
+  umodel->readMSH(fileName) ;
   std::vector<GEntity*> _entities ;
-  umodel->getEntities(_entities) ;    
-     
+  umodel->getEntities(_entities) ;
+
   std::set<MVertex*> ve;
   std::map<int, std::vector<double> > dataR ;
   std::map<int, std::vector<double> > dataI ;
 
   for(unsigned int ent = 0; ent < _entities.size(); ent++)
-    for(unsigned int ele = 0; ele < _entities[ent]->getNumMeshElements(); ele++){ 
-      MElement *e = _entities[ent]->getMeshElement(ele);	
+    for(unsigned int ele = 0; ele < _entities[ent]->getNumMeshElements(); ele++){
+      MElement *e = _entities[ent]->getMeshElement(ele);
       for(int nod = 0; nod < e->getNumVertices() ; nod++)
         ve.insert(e->getVertex(nod));
     }
-  
+
   for (std::set<MVertex*>::iterator it = ve.begin(); it != ve.end(); ++it){
     double phi, ar, ai ;
     std::vector<double> uR(1) ;
@@ -125,18 +125,18 @@ PView *GMSH_FieldFromAmplitudePhasePlugin::execute(PView *v)
     oPhi->searchScalar((*it)->x(), (*it)->y(), (*it)->z(), &phi, 0);
     oA->searchScalar((*it)->x(), (*it)->y(), (*it)->z(), &ar, 0);
     oA->searchScalar((*it)->x(), (*it)->y(), (*it)->z(), &ai, 1);
-    
+
     uR[0] = ar * cos(k*phi) - ai * sin(k*phi) ;
     uI[0] = ar * sin(k*phi) + ai* cos(k*phi) ;
-    
-    dataR[(*it)->getNum()] = uR ;   
-    dataI[(*it)->getNum()] = uI ;   
+
+    dataR[(*it)->getNum()] = uR ;
+    dataI[(*it)->getNum()] = uI ;
   }
-  
+
   delete oA ;
   delete oPhi;
-    
-  PView *vu = new PView("FieldFromAPhi","NodeData", umodel, dataR, 0.0, 1) ;
+
+  PView *vu = new PView("FieldFromAPhi", "NodeData", umodel, dataR, 0.0, 1) ;
   vu->addStep(umodel, dataI, 1);
 
   if(name_model.empty())
diff --git a/Plugin/LongitudeLatitude.cpp b/Plugin/LongitudeLatitude.cpp
index 07af39053685d524c7e654d38c3ec3d00b3b0ed5..a4864c9277de66de5f84d4fc842f3e59bb185f9b 100644
--- a/Plugin/LongitudeLatitude.cpp
+++ b/Plugin/LongitudeLatitude.cpp
@@ -39,21 +39,23 @@ StringXNumber *GMSH_LongituteLatitudePlugin::getOption(int iopt)
 PView *GMSH_LongituteLatitudePlugin::execute(PView *v)
 {
   int iView = (int)LongituteLatitudeOptions_Number[0].def;
-  
+
   PView *v1 = getView(iView, v);
   if(!v1) return v;
   PViewData *data1 = v1->getData();
 
-  // tag all the nodes with "0" (the default tag)
-  for(int step = 0; step < data1->getNumTimeSteps(); step++){
-    for(int ent = 0; ent < data1->getNumEntities(step); ent++){
-      for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
-        if(data1->skipElement(step, ent, ele)) continue;
-        for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
-          data1->tagNode(step, ent, ele, nod, 0);
+  if(data1->isNodeData()){
+    // tag all the nodes with "0" (the default tag)
+    for(int step = 0; step < data1->getNumTimeSteps(); step++){
+      for(int ent = 0; ent < data1->getNumEntities(step); ent++){
+        for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
+          if(data1->skipElement(step, ent, ele)) continue;
+          for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
+            data1->tagNode(step, ent, ele, nod, 0);
+        }
       }
     }
-  } 
+  }
   double gxmin = 180, gxmax = -180, gymin = 90, gymax = -90;
   // transform all "0" nodes
   for(int step = 0; step < data1->getNumTimeSteps(); step++){
@@ -66,32 +68,31 @@ PView *GMSH_LongituteLatitudePlugin::execute(PView *v)
         for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++){
           double x, y, z;
           int tag = data1->getNode(step, ent, ele, nod, x, y, z);
-          if(!tag){
-            double x2, y2, z2;
-            z2 = sqrt(x * x + y * y + z * z);
-            y2 = asin(z / z2);
-            x2 = atan2(y, x);
-            xmin=std::min(x2, xmin);
-            xmax=std::max(x2, xmax);
-            gxmin = std::min(x2 * 180 / M_PI, gxmin);
-            gxmax = std::max(x2 * 180 / M_PI, gxmax);
-            gymin = std::min(y2 * 180 / M_PI, gymin);
-            gymax = std::max(y2 * 180 / M_PI, gymax);
-            data1->setNode(step, ent, ele, nod, x2 * 180 / M_PI, y2 * 180 / M_PI, 0);
-            data1->tagNode(step, ent, ele, nod, 1);
-            if(nbComp == 3){
-              for(int i = 0; i < 3; i++)
-                data1->getValue(step, ent, ele, nod, i, vin[i]);
-              vout[0] = -sin(x2) * vin[0] + cos(x2) * vin[1];
-              vout[1] =
-                -sin(y2) * (cos(x2) * vin[0] + sin(x2) * vin[1]) +
-                cos(y2) * vin[2];
-              vout[2] =
-                cos(y2) * (cos(x2) * vin[0] + sin(x2) * vin[1]) +
-                sin(y2) * vin[2];
-              for(int i = 0; i < 3; i++)
-                data1->setValue(step, ent, ele, nod, i, vout[i]);
-            }
+          if(data1->isNodeData() && tag) continue;
+          double x2, y2, z2;
+          z2 = sqrt(x * x + y * y + z * z);
+          y2 = asin(z / z2);
+          x2 = atan2(y, x);
+          xmin=std::min(x2, xmin);
+          xmax=std::max(x2, xmax);
+          gxmin = std::min(x2 * 180 / M_PI, gxmin);
+          gxmax = std::max(x2 * 180 / M_PI, gxmax);
+          gymin = std::min(y2 * 180 / M_PI, gymin);
+          gymax = std::max(y2 * 180 / M_PI, gymax);
+          data1->setNode(step, ent, ele, nod, x2 * 180 / M_PI, y2 * 180 / M_PI, 0);
+          if(data1->isNodeData()) data1->tagNode(step, ent, ele, nod, 1);
+          if(nbComp == 3){
+            for(int i = 0; i < 3; i++)
+              data1->getValue(step, ent, ele, nod, i, vin[i]);
+            vout[0] = -sin(x2) * vin[0] + cos(x2) * vin[1];
+            vout[1] =
+              -sin(y2) * (cos(x2) * vin[0] + sin(x2) * vin[1]) +
+              cos(y2) * vin[2];
+            vout[2] =
+              cos(y2) * (cos(x2) * vin[0] + sin(x2) * vin[1]) +
+              sin(y2) * vin[2];
+            for(int i = 0; i < 3; i++)
+              data1->setValue(step, ent, ele, nod, i, vout[i]);
           }
         }
         if(xmax - xmin > M_PI){ // periodicity check (broken for continuous views)
diff --git a/Plugin/ModifyComponent.cpp b/Plugin/ModifyComponent.cpp
index d38bb2717250315d7660151f7ad62daffc938153..01b0d623fd6d99a449394667b03e7f1a1a223073 100644
--- a/Plugin/ModifyComponent.cpp
+++ b/Plugin/ModifyComponent.cpp
@@ -157,12 +157,14 @@ PView *GMSH_ModifyComponentPlugin::execute(PView *view)
     double time = data1->getTime(step);
     int step2 = (otherTimeStep < 0) ? step : otherTimeStep;
 
-    // tag all the nodes with "0" (the default tag)
-    for(int ent = 0; ent < data1->getNumEntities(step); ent++){
-      for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
-        if(data1->skipElement(step, ent, ele)) continue;
-        for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
-          data1->tagNode(step, ent, ele, nod, 0);
+    if(data1->isNodeData()){
+      // tag all the nodes with "0" (the default tag)
+      for(int ent = 0; ent < data1->getNumEntities(step); ent++){
+        for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
+          if(data1->skipElement(step, ent, ele)) continue;
+          for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
+            data1->tagNode(step, ent, ele, nod, 0);
+        }
       }
     }
 
@@ -172,12 +174,14 @@ PView *GMSH_ModifyComponentPlugin::execute(PView *view)
         int numComp = data1->getNumComponents(step, ent, ele);
         int numComp2 = octree ? 9 : data2->getNumComponents(step2, ent, ele);
         int numNodes = data1->getNumNodes(step, ent, ele);
-        std::vector<int> tag(numNodes);
         std::vector<double> x(numNodes), y(numNodes), z(numNodes);
-        for(int nod = 0; nod < numNodes; nod++)
-          tag[nod] = data1->getNode(step, ent, ele, nod, x[nod], y[nod], z[nod]);
+        std::vector<int> tag(numNodes, 0.);
+        if(data1->isNodeData()){
+          for(int nod = 0; nod < numNodes; nod++)
+            tag[nod] = data1->getNode(step, ent, ele, nod, x[nod], y[nod], z[nod]);
+        }
         for(int nod = 0; nod < numNodes; nod++){
-          if(tag[nod]) continue; // node has already been modified
+          if(data1->isNodeData() && tag[nod]) continue; // node has already been modified
           std::vector<double> v(std::max(9, numComp), 0.);
           for(int comp = 0; comp < numComp; comp++)
             data1->getValue(step, ent, ele, nod, comp, v[comp]);
@@ -204,7 +208,7 @@ PView *GMSH_ModifyComponentPlugin::execute(PView *view)
             for(int i = 0; i < 9; i++) values[16 + i] = w[i];
             if(f.eval(values, res))
               data1->setValue(step, ent, ele, nod, comp, res[0]);
-            data1->tagNode(step, ent, ele, nod, 1);
+            if(data1->isNodeData()) data1->tagNode(step, ent, ele, nod, 1);
           }
         }
       }
diff --git a/Plugin/ModulusPhase.cpp b/Plugin/ModulusPhase.cpp
index 1664b6b784aa03c86315f493c745f96351d5ef10..892195333aef213f67e7d8d0d6ba132467820735 100644
--- a/Plugin/ModulusPhase.cpp
+++ b/Plugin/ModulusPhase.cpp
@@ -61,13 +61,15 @@ PView *GMSH_ModulusPhasePlugin::execute(PView *v)
     return v1;
   }
 
-  // tag all the nodes with "0" (the default tag)
-  for(int step = 0; step < data1->getNumTimeSteps(); step++){
-    for(int ent = 0; ent < data1->getNumEntities(step); ent++){
-      for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
-        if(data1->skipElement(step, ent, ele)) continue;
-        for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
-          data1->tagNode(step, ent, ele, nod, 0);
+  if(data1->isNodeData()){
+    // tag all the nodes with "0" (the default tag)
+    for(int step = 0; step < data1->getNumTimeSteps(); step++){
+      for(int ent = 0; ent < data1->getNumEntities(step); ent++){
+        for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
+          if(data1->skipElement(step, ent, ele)) continue;
+          for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
+            data1->tagNode(step, ent, ele, nod, 0);
+        }
       }
     }
   }
@@ -79,7 +81,7 @@ PView *GMSH_ModulusPhasePlugin::execute(PView *v)
       for(int nod = 0; nod < data1->getNumNodes(rIndex, ent, ele); nod++){
         double x, y, z;
         int tag = data1->getNode(rIndex, ent, ele, nod, x, y, z);
-        if(tag) continue;
+        if(data1->isNodeData() && tag) continue;
         for(int comp = 0; comp < data1->getNumComponents(rIndex, ent, ele); comp++){
           double vr, vi;
           data1->getValue(rIndex, ent, ele, nod, comp, vr);
@@ -88,8 +90,10 @@ PView *GMSH_ModulusPhasePlugin::execute(PView *v)
           double phase = atan2(vi, vr);
           data1->setValue(rIndex, ent, ele, nod, comp, modulus);
           data1->setValue(iIndex, ent, ele, nod, comp, phase);
-          data1->tagNode(rIndex, ent, ele, nod, 1);
-          data1->tagNode(iIndex, ent, ele, nod, 1);
+          if(data1->isNodeData()){
+            data1->tagNode(rIndex, ent, ele, nod, 1);
+            data1->tagNode(iIndex, ent, ele, nod, 1);
+          }
         }
       }
     }
diff --git a/Plugin/SphericalRaise.cpp b/Plugin/SphericalRaise.cpp
index f631175a85bda0c662f86e0630154379e1b6d879..278a4c18d6de88504656046a50de1508d3f63caf 100644
--- a/Plugin/SphericalRaise.cpp
+++ b/Plugin/SphericalRaise.cpp
@@ -74,13 +74,15 @@ PView *GMSH_SphericalRaisePlugin::execute(PView *v)
     return v;
   }
 
-  // tag all the nodes with "0" (the default tag)
-  for(int step = 0; step < data1->getNumTimeSteps(); step++){
-    for(int ent = 0; ent < data1->getNumEntities(step); ent++){
-      for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
-        if(data1->skipElement(step, ent, ele)) continue;
-        for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
-          data1->tagNode(step, ent, ele, nod, 0);
+  if(data1->isNodeData()){
+    // tag all the nodes with "0" (the default tag)
+    for(int step = 0; step < data1->getNumTimeSteps(); step++){
+      for(int ent = 0; ent < data1->getNumEntities(step); ent++){
+        for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
+          if(data1->skipElement(step, ent, ele)) continue;
+          for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
+            data1->tagNode(step, ent, ele, nod, 0);
+        }
       }
     }
   }
@@ -93,20 +95,19 @@ PView *GMSH_SphericalRaisePlugin::execute(PView *v)
         for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++){
           double x, y, z;
           int tag = data1->getNode(step, ent, ele, nod, x, y, z);
-          if(!tag){
-            double r[3], val;
-            r[0] = x - center[0];
-            r[1] = y - center[1];
-            r[2] = z - center[2];
-            norme(r);
-            data1->getScalarValue(step, ent, ele, nod, val);
-            double coef = offset + raise * val;
-            x += coef * r[0];
-            y += coef * r[1];
-            z += coef * r[2];
-            data1->setNode(step, ent, ele, nod, x, y, z);
-            data1->tagNode(step, ent, ele, nod, 1);
-          }
+          if(data1->isNodeData() && tag) continue;
+          double r[3], val;
+          r[0] = x - center[0];
+          r[1] = y - center[1];
+          r[2] = z - center[2];
+          norme(r);
+          data1->getScalarValue(step, ent, ele, nod, val);
+          double coef = offset + raise * val;
+          x += coef * r[0];
+          y += coef * r[1];
+          z += coef * r[2];
+          data1->setNode(step, ent, ele, nod, x, y, z);
+          if(data1->isNodeData()) data1->tagNode(step, ent, ele, nod, 1);
         }
       }
     }
diff --git a/Plugin/Transform.cpp b/Plugin/Transform.cpp
index 359823275ffb713fc48d61ebd628398275101729..9c04be60cd2a6de0b32205ed34396cf941e64f02 100644
--- a/Plugin/Transform.cpp
+++ b/Plugin/Transform.cpp
@@ -80,14 +80,16 @@ PView *GMSH_TransformPlugin::execute(PView *v)
 
   PViewData *data1 = v1->getData();
 
-  // tag all the nodes with "0" (the default tag)
-  for(int step = 0; step < data1->getNumTimeSteps(); step++){
-    for(int ent = 0; ent < data1->getNumEntities(step); ent++){
-      for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
-        if(data1->skipElement(step, ent, ele)) continue;
-        if(swap) data1->reverseElement(step, ent, ele);
-        for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
-          data1->tagNode(step, ent, ele, nod, 0);
+  if(data1->isNodeData()){
+    // tag all the nodes with "0" (the default tag)
+    for(int step = 0; step < data1->getNumTimeSteps(); step++){
+      for(int ent = 0; ent < data1->getNumEntities(step); ent++){
+        for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
+          if(data1->skipElement(step, ent, ele)) continue;
+          if(swap) data1->reverseElement(step, ent, ele);
+          for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
+            data1->tagNode(step, ent, ele, nod, 0);
+        }
       }
     }
   }
@@ -100,14 +102,13 @@ PView *GMSH_TransformPlugin::execute(PView *v)
         for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++){
           double x, y, z;
           int tag = data1->getNode(step, ent, ele, nod, x, y, z);
-          if(!tag){
-            double x2, y2, z2;
-            x2 = mat[0][0] * x + mat[0][1] * y + mat[0][2] * z + mat[0][3];
-            y2 = mat[1][0] * x + mat[1][1] * y + mat[1][2] * z + mat[1][3];
-            z2 = mat[2][0] * x + mat[2][1] * y + mat[2][2] * z + mat[2][3];
-            data1->setNode(step, ent, ele, nod, x2, y2, z2);
-            data1->tagNode(step, ent, ele, nod, 1);
-          }
+          if(data1->isNodeData() && tag) continue;
+          double x2, y2, z2;
+          x2 = mat[0][0] * x + mat[0][1] * y + mat[0][2] * z + mat[0][3];
+          y2 = mat[1][0] * x + mat[1][1] * y + mat[1][2] * z + mat[1][3];
+          z2 = mat[2][0] * x + mat[2][1] * y + mat[2][2] * z + mat[2][3];
+          data1->setNode(step, ent, ele, nod, x2, y2, z2);
+          if(data1->isNodeData()) data1->tagNode(step, ent, ele, nod, 1);
         }
       }
     }
diff --git a/Plugin/Warp.cpp b/Plugin/Warp.cpp
index 2c98b972194e51a5278d1c47695b102307f9b6f1..56660690939c453c465761dfe31dd6d90ebf3cfc 100644
--- a/Plugin/Warp.cpp
+++ b/Plugin/Warp.cpp
@@ -96,13 +96,15 @@ PView *GMSH_WarpPlugin::execute(PView *v)
     }
   }
 
-  // tag all the nodes with "0" (the default tag)
-  for(int step = 0; step < data1->getNumTimeSteps(); step++){
-    for(int ent = 0; ent < data1->getNumEntities(step); ent++){
-      for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
-        if(data1->skipElement(step, ent, ele)) continue;
-        for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
-          data1->tagNode(step, ent, ele, nod, 0);
+  if(data1->isNodeData()){
+    // tag all the nodes with "0" (the default tag)
+    for(int step = 0; step < data1->getNumTimeSteps(); step++){
+      for(int ent = 0; ent < data1->getNumEntities(step); ent++){
+        for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
+          if(data1->skipElement(step, ent, ele)) continue;
+          for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++)
+            data1->tagNode(step, ent, ele, nod, 0);
+        }
       }
     }
   }
@@ -115,14 +117,16 @@ PView *GMSH_WarpPlugin::execute(PView *v)
         int numNodes = data1->getNumNodes(step, ent, ele);
         if(numNodes < 2) continue;
         double x[8], y[8], z[8], n[3] = {0., 0., 0.};
-        int tag[8];
-        for(int nod = 0; nod < numNodes; nod++)
-          tag[nod] = data1->getNode(step, ent, ele, nod, x[nod], y[nod], z[nod]);
+        std::vector<int> tag(8, 0);
+        if(data1->isNodeData()){
+          for(int nod = 0; nod < numNodes; nod++)
+            tag[nod] = data1->getNode(step, ent, ele, nod, x[nod], y[nod], z[nod]);
+        }
         int dim = data1->getDimension(step, ent, ele);
         if(normals && dim == 2)
           normal3points(x[0], y[0], z[0], x[1], y[1], z[1], x[2], y[2], z[2], n);
         for(int nod = 0; nod < numNodes; nod++){
-          if(tag[nod]) continue; // already transformed
+          if(data1->isNodeData() && tag[nod]) continue; // already transformed
           double mult = 1., val[3] = {n[0], n[1], n[2]};
           if(normals){
             if(dim == 2){
@@ -139,7 +143,7 @@ PView *GMSH_WarpPlugin::execute(PView *v)
           y[nod] += factor * mult * val[1];
           z[nod] += factor * mult * val[2];
           data1->setNode(step, ent, ele, nod, x[nod], y[nod], z[nod]);
-          data1->tagNode(step, ent, ele, nod, 1);
+          if(data1->isNodeData()) data1->tagNode(step, ent, ele, nod, 1);
         }
       }
     }
diff --git a/Post/PViewData.h b/Post/PViewData.h
index f30744606095b354221c72751cec4c47576ed046..c4e8d1c4535269f3b92f36e5d61c244913e4a213 100644
--- a/Post/PViewData.h
+++ b/Post/PViewData.h
@@ -189,6 +189,7 @@ class PViewData {
   virtual bool hasPartition(int step, int part){ return false; }
   virtual bool hasMultipleMeshes(){ return false; }
   virtual bool hasModel(GModel *model, int step=-1){ return false; }
+  virtual bool isNodeData(){ return false; }
 
   // true if data is given at Gauss points (instead of vertices)
   virtual bool useGaussPoints(){ return false; }
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index a2c0a47a686742c3ca1bbba57dbc8e6970258c9e..226396bb00df67e8a24368bd56506c4d16d35ed7 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -227,6 +227,7 @@ class PViewDataGModel : public PViewData {
   bool hasPartition(int step, int part);
   bool hasMultipleMeshes();
   bool hasModel(GModel *model, int step=-1);
+  bool isNodeData(){ return _type == NodeData; }
   bool useGaussPoints(){ return _type == GaussPointData; }
   GModel* getModel(int step){ return _steps[step]->getModel(); }
   GEntity *getEntity(int step, int ent);