diff --git a/Plugin/CutGrid.cpp b/Plugin/CutGrid.cpp
index 3bf5ecc4e71244fa28ccd1ab7319057b69211dde..f45a6e934a6916db76eb30cbf420a0bb53914cb0 100644
--- a/Plugin/CutGrid.cpp
+++ b/Plugin/CutGrid.cpp
@@ -1,4 +1,4 @@
-// $Id: CutGrid.cpp,v 1.24 2008-02-17 08:48:06 geuzaine Exp $
+// $Id: CutGrid.cpp,v 1.25 2008-03-20 10:52:36 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -246,7 +246,7 @@ void GMSH_CutGridPlugin::getPoint(int iU, int iV, double *X)
     v  * (CutGridOptions_Number[8].def-CutGridOptions_Number[2].def) ;
 }
 
-void GMSH_CutGridPlugin::addInView(PViewDataList *data, int connect, int nbcomp, 
+void GMSH_CutGridPlugin::addInView(int numsteps, int connect, int nbcomp, 
 				   double ***pnts, double ***vals, 
 				   List_T *P, int *nP, 
 				   List_T *L, int *nL, 
@@ -260,7 +260,7 @@ void GMSH_CutGridPlugin::addInView(PViewDataList *data, int connect, int nbcomp,
 	List_Add(P, &pnts[i][j][1]);
 	List_Add(P, &pnts[i][j][2]);
 	(*nP)++;
-	for(int k = 0; k < data->getNumTimeSteps(); ++k){
+	for(int k = 0; k < numsteps; ++k){
 	  for(int l = 0; l < nbcomp; ++l)
 	    List_Add(P, &vals[i][j][nbcomp*k+l]);
 	}
@@ -276,7 +276,7 @@ void GMSH_CutGridPlugin::addInView(PViewDataList *data, int connect, int nbcomp,
 	List_Add(L, &pnts[0][i][1]); List_Add(L, &pnts[0][i+1][1]);
 	List_Add(L, &pnts[0][i][2]); List_Add(L, &pnts[0][i+1][2]);
 	(*nL)++;
-	for(int k = 0; k < data->getNumTimeSteps(); ++k){
+	for(int k = 0; k < numsteps; ++k){
 	  for(int l = 0; l < nbcomp; ++l)
 	    List_Add(L, &vals[0][i  ][nbcomp*k+l]);
 	  for(int l = 0; l < nbcomp; ++l)
@@ -290,7 +290,7 @@ void GMSH_CutGridPlugin::addInView(PViewDataList *data, int connect, int nbcomp,
 	List_Add(L, &pnts[i][0][1]); List_Add(L, &pnts[i+1][0][1]);
 	List_Add(L, &pnts[i][0][2]); List_Add(L, &pnts[i+1][0][2]);
 	(*nL)++;
-	for(int k = 0; k < data->getNumTimeSteps(); ++k){
+	for(int k = 0; k < numsteps; ++k){
 	  for(int l = 0; l < nbcomp; ++l)
 	    List_Add(L, &vals[i  ][0][nbcomp*k+l]);
 	  for(int l = 0; l < nbcomp; ++l)
@@ -308,7 +308,7 @@ void GMSH_CutGridPlugin::addInView(PViewDataList *data, int connect, int nbcomp,
 	  List_Add(Q, &pnts[i  ][j  ][2]); List_Add(Q, &pnts[i+1][j  ][2]);
 	  List_Add(Q, &pnts[i+1][j+1][2]); List_Add(Q, &pnts[i  ][j+1][2]);
 	  (*nQ)++;
-	  for(int k = 0; k < data->getNumTimeSteps(); ++k){
+	  for(int k = 0; k < numsteps; ++k){
 	    for(int l = 0; l < nbcomp; ++l)
 	      List_Add(Q, &vals[i  ][j  ][nbcomp*k+l]);
 	    for(int l = 0; l < nbcomp; ++l)
@@ -329,29 +329,18 @@ PView *GMSH_CutGridPlugin::GenerateView(PView *v1, int connect)
   if(getNbU() <= 0 || getNbV() <= 0)
     return v1;
 
-  PViewDataList *data1 = getDataList(v1);
-  if(!data1) return v1;
+  PViewData *data1 = v1->getData();
 
   PView *v2 = new PView(true);
-
   PViewDataList *data2 = getDataList(v2);
-  if(!data2) return v1;
  
   OctreePost o(v1);
 
-  int nbs = 0, nbv = 0, nbt = 0;
-
-  if(data1->NbST || data1->NbSQ || data1->NbSS || 
-     data1->NbSH || data1->NbSI || data1->NbSY)
-    nbs = 1;
-  if(data1->NbVT || data1->NbVQ || data1->NbVS || 
-     data1->NbVH || data1->NbVI || data1->NbVY)
-    nbv = 1;
-  if(data1->NbTT || data1->NbTQ || data1->NbTS || 
-     data1->NbTH || data1->NbTI || data1->NbTY)
-    nbt = 1;
-
+  int nbs = data1->getNumScalars();
+  int nbv = data1->getNumVectors();
+  int nbt = data1->getNumTensors();
   int maxcomp = nbt ? 9 : (nbv ? 3 : 1);
+  int numsteps = data1->getNumTimeSteps();
 
   double ***pnts = new double** [getNbU()];
   double ***vals = new double** [getNbU()];
@@ -360,7 +349,7 @@ PView *GMSH_CutGridPlugin::GenerateView(PView *v1, int connect)
     vals[i] = new double* [getNbV()];
     for(int j = 0; j < getNbV(); j++){
       pnts[i][j] = new double[3];
-      vals[i][j] = new double[maxcomp * data1->getNumTimeSteps()];
+      vals[i][j] = new double[maxcomp * numsteps];
       getPoint(i, j, pnts[i][j]);
     }
   }
@@ -369,24 +358,24 @@ PView *GMSH_CutGridPlugin::GenerateView(PView *v1, int connect)
     for(int i = 0; i < getNbU(); i++)
       for(int j = 0; j < getNbV(); j++)
 	o.searchScalar(pnts[i][j][0], pnts[i][j][1], pnts[i][j][2], vals[i][j]);
-    addInView(data1, connect, 1, pnts, vals, data2->SP, &data2->NbSP, data2->SL, 
-	      &data2->NbSL, data2->SQ, &data2->NbSQ);
+    addInView(numsteps, connect, 1, pnts, vals, data2->SP, &data2->NbSP, 
+	      data2->SL, &data2->NbSL, data2->SQ, &data2->NbSQ);
   }
 
   if(nbv){
     for(int i = 0; i < getNbU(); i++)
       for(int j = 0; j < getNbV(); j++)
 	o.searchVector(pnts[i][j][0], pnts[i][j][1], pnts[i][j][2], vals[i][j]);
-    addInView(data1, connect, 3, pnts, vals, data2->VP, &data2->NbVP, data2->VL, 
-	      &data2->NbVL, data2->VQ, &data2->NbVQ);
+    addInView(numsteps, connect, 3, pnts, vals, data2->VP, &data2->NbVP,
+	      data2->VL, &data2->NbVL, data2->VQ, &data2->NbVQ);
   }
 
   if(nbt){
     for(int i = 0; i < getNbU(); i++)
       for(int j = 0; j < getNbV(); j++)
 	o.searchTensor(pnts[i][j][0], pnts[i][j][1], pnts[i][j][2], vals[i][j]);
-    addInView(data1, connect, 9, pnts, vals, data2->TP, &data2->NbTP, data2->TL,
-	      &data2->NbTL, data2->TQ, &data2->NbTQ);
+    addInView(numsteps, connect, 9, pnts, vals, data2->TP, &data2->NbTP, 
+	      data2->TL, &data2->NbTL, data2->TQ, &data2->NbTQ);
   }
 
   for(int i = 0; i < getNbU(); i++){
@@ -400,7 +389,6 @@ PView *GMSH_CutGridPlugin::GenerateView(PView *v1, int connect)
   delete [] pnts;
   delete [] vals;
 
-
   data2->setName(data1->getName() + "_CutGrid");
   data2->setFileName(data1->getName() + "_CutGrid.pos");
   data2->finalize();
diff --git a/Plugin/CutGrid.h b/Plugin/CutGrid.h
index 9e9416a81662f010b2070227f9b40b22dbb63651..3981dacd22aa5cc7d566ed55f7f89282e1af6840 100644
--- a/Plugin/CutGrid.h
+++ b/Plugin/CutGrid.h
@@ -31,7 +31,7 @@ class GMSH_CutGridPlugin : public GMSH_Post_Plugin
 {
   static double callback(int num, int action, double value, double *opt,
 			 double step, double min, double max);
-  void addInView(PViewDataList *data, int connect, int nbcomp, 
+  void addInView(int numsteps, int connect, int nbcomp, 
 		 double ***pnts, double ***vals, 
 		 List_T *P, int *nP, 
 		 List_T *L, int *nL, 
diff --git a/Plugin/CutParametric.cpp b/Plugin/CutParametric.cpp
index f416e56ee53271d36a949da436870391180e9b0c..e67bd93e590cff40c08bd08268b7dcb9838619b3 100644
--- a/Plugin/CutParametric.cpp
+++ b/Plugin/CutParametric.cpp
@@ -1,4 +1,4 @@
-// $Id: CutParametric.cpp,v 1.25 2008-02-23 15:30:10 geuzaine Exp $
+// $Id: CutParametric.cpp,v 1.26 2008-03-20 10:52:36 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -297,12 +297,11 @@ PView *GMSH_CutParametricPlugin::execute(PView *v)
   PView *v1 = getView(iView, v);
   if(!v1) return v;
 
-  PViewDataList *data1 = getDataList(v1);
-  if(!data1) return v;
+  if(!fillXYZ()) return v;
 
-  if(!fillXYZ())
-    return v;
+  PViewData *data1 = v1->getData();
 
+  int numSteps = data1->getNumTimeSteps();
   int nbU = (int)CutParametricOptions_Number[2].def;
   int connect = (int)CutParametricOptions_Number[3].def;
   if(nbU < 2) connect = 0;
@@ -310,47 +309,39 @@ PView *GMSH_CutParametricPlugin::execute(PView *v)
   OctreePost o(v1);
 
   PView *v2 = new PView(true);
-
   PViewDataList *data2 = getDataList(v2);
-  if(!data2) return v;
 
-  double *res0 = new double[9 * data1->getNumTimeSteps()];
-  double *res1 = new double[9 * data1->getNumTimeSteps()];
+  double *res0 = new double[9 * numSteps];
+  double *res1 = new double[9 * numSteps];
   double x0 = 0., y0 = 0., z0 = 0., x1 = 0., y1 = 0., z1 = 0.;
 
-  for(int k = 0; k < 9 * data1->getNumTimeSteps(); ++k) res0[k] = res1[k] = 0.;
+  for(int k = 0; k < 9 * numSteps; ++k) res0[k] = res1[k] = 0.;
 
   for(int i = 0; i < nbU; ++i){
     if(i && connect){
       x0 = x1;
       y0 = y1;
       z0 = z1;
-      for(int k = 0; k < 9 * data1->getNumTimeSteps(); ++k) res0[k] = res1[k];
+      for(int k = 0; k < 9 * numSteps; ++k) res0[k] = res1[k];
     }
 
     x1 = x[i];
     y1 = y[i];
     z1 = z[i];
 
-    if(data1->NbST || data1->NbSQ || data1->NbSS || 
-       data1->NbSH || data1->NbSI || data1->NbSY){
+    if(data1->getNumScalars()){
       o.searchScalar(x1, y1, z1, res1);
-      addInView(connect, i, 1, data1->getNumTimeSteps(), 
-		x0, y0, z0, res0, x1, y1, z1, res1,
+      addInView(connect, i, 1, numSteps, x0, y0, z0, res0, x1, y1, z1, res1,
 		data2->SP, &data2->NbSP, data2->SL, &data2->NbSL);
     }
-    if(data1->NbVT || data1->NbVQ || data1->NbVS || 
-       data1->NbVH || data1->NbVI || data1->NbVY){
+    if(data1->getNumVectors()){
       o.searchVector(x1, y1, z1, res1);
-      addInView(connect, i, 3, data1->getNumTimeSteps(), 
-		x0, y0, z0, res0, x1, y1, z1, res1,
+      addInView(connect, i, 3, numSteps, x0, y0, z0, res0, x1, y1, z1, res1,
 		data2->VP, &data2->NbVP, data2->VL, &data2->NbVL);
     }
-    if(data1->NbTT || data1->NbTQ || data1->NbTS ||
-       data1->NbTH || data1->NbTI || data1->NbTY){
+    if(data1->getNumTensors()){
       o.searchTensor(x1, y1, z1, res1);
-      addInView(connect, i, 9, data1->getNumTimeSteps(),
-		x0, y0, z0, res0, x1, y1, z1, res1,
+      addInView(connect, i, 9, numSteps, x0, y0, z0, res0, x1, y1, z1, res1,
 		data2->TP, &data2->NbTP, data2->TL, &data2->NbTL);
     }
   }
diff --git a/Post/OctreePost.cpp b/Post/OctreePost.cpp
index c820980141ea797a3c91ded0ea4954a69e4c697d..57bc8e66bac1fea1a5e668511f82ec54cb7f77b0 100644
--- a/Post/OctreePost.cpp
+++ b/Post/OctreePost.cpp
@@ -1,4 +1,4 @@
-// $Id: OctreePost.cpp,v 1.5 2008-03-20 07:34:43 geuzaine Exp $
+// $Id: OctreePost.cpp,v 1.6 2008-03-20 10:52:36 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -406,7 +406,7 @@ bool OctreePost::_getValue(void *in, int dim, int nbNod, int nbComp,
   return true;
 } 
 
-bool OctreePost::_getValue(void *in, int nbComp, double P[3], int step, double *values,
+bool OctreePost::_getValue(void *in, int nbComp, double P[3], int timestep, double *values,
 			   double *elementSize)
 {
   if(!in) return false;
@@ -415,8 +415,6 @@ bool OctreePost::_getValue(void *in, int nbComp, double P[3], int step, double *
 
   MElement *e = (MElement*)in;
 
-  if(e) printf("found ele %d!!\n", e->getNum());
-
   int dataIndex[8];
   for(int i = 0; i < e->getNumVertices(); i++){
     dataIndex[i] = e->getVertex(i)->getDataIndex();
@@ -425,20 +423,27 @@ bool OctreePost::_getValue(void *in, int nbComp, double P[3], int step, double *
   
   double U[3];
   e->xyz2uvw(P, U);
-  /*
-  if(step < 0){
-    for(int i = 0; i < _theViewDataGModel->getNumTimeSteps(); i++)
-      for(int j = 0; j < nbComp; j++)
-	values[nbComp * i + j] = e->interpolate(&V[nbNod * nbComp * i + j], 
-						U[0], U[1], U[2], nbComp);
-  }
-  else{
-    for(int j = 0; j < nbComp; j++)
-      values[j] = e->interpolate(&V[nbNod * nbComp * step + j], 
-				 U[0], U[1], U[2], nbComp);
-  }
-  */
 
+  double nodeval[8 * 9];
+  for(int step = 0; step < _theViewDataGModel->getNumTimeSteps(); step++){
+    if(timestep < 0 || step == timestep){
+      for(int nod = 0; nod < e->getNumVertices(); nod++){
+	for(int comp = 0; comp < nbComp; comp++){
+	  if(!_theViewDataGModel->getValue(step, dataIndex[nod], comp, 
+					   nodeval[nod*nbComp+comp]))
+	    return false;
+	}
+      }
+      for(int comp = 0; comp < nbComp; comp++){
+	double val = e->interpolate(nodeval, U[0], U[1], U[2], nbComp);
+	if(timestep < 0)
+	  values[nbComp * step + comp] = val;
+	else
+	  values[comp] = val;
+      }
+    }
+  }
+  
   if(elementSize) *elementSize = e->maxEdge();
   return true;
 } 
diff --git a/Post/PViewDataGModel.cpp b/Post/PViewDataGModel.cpp
index 40c2d457d3eaa2e97196d324a18e15eeb2a018f9..b4b7d662ce63d06cf202ac49db462f5f8e3a9c61 100644
--- a/Post/PViewDataGModel.cpp
+++ b/Post/PViewDataGModel.cpp
@@ -1,4 +1,4 @@
-// $Id: PViewDataGModel.cpp,v 1.31 2008-03-20 07:34:43 geuzaine Exp $
+// $Id: PViewDataGModel.cpp,v 1.32 2008-03-20 10:52:37 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -79,6 +79,24 @@ SBoundingBox3d PViewDataGModel::getBoundingBox(int step)
   return _steps[step]->getBoundingBox();
 }
 
+int PViewDataGModel::getNumScalars(int step)
+{
+  if(_steps[0]->getNumComp() == 1) return getNumElements(0);
+  return 0;
+}
+
+int PViewDataGModel::getNumVectors(int step)
+{
+  if(_steps[0]->getNumComp() == 3) return getNumElements(0);
+  return 0;
+}
+
+int PViewDataGModel::getNumTensors(int step)
+{
+  if(_steps[0]->getNumComp() == 9) return getNumElements(0);
+  return 0;
+}
+
 int PViewDataGModel::getNumEntities(int step)
 {
   if(step < 0){
@@ -184,3 +202,10 @@ GEntity *PViewDataGModel::getEntity(int step, int ent)
 {
   return _steps[step]->getEntity(ent);
 }
+
+bool PViewDataGModel::getValue(int step, int dataIndex, int comp, double &val)
+{
+  if(dataIndex < 0 || dataIndex >= (int)_steps[step]->getNumData()) return false;
+  val = _steps[step]->getData(dataIndex)[comp];
+  return true;
+}
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index 5786be231d5ddbeb8ac3c690847a8b9faadde7ec..34b97db440ac43193544b3bee8c7fe5ac06313d7 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -134,6 +134,9 @@ class PViewDataGModel : public PViewData {
   double getMin(int step=-1);
   double getMax(int step=-1);
   SBoundingBox3d getBoundingBox(int step=-1);
+  int getNumScalars(int step=-1);
+  int getNumVectors(int step=-1);
+  int getNumTensors(int step=-1);
   int getNumEntities(int step=-1);
   int getNumElements(int step=-1, int ent=-1);
   int getDimension(int step, int ent, int ele);
@@ -151,8 +154,10 @@ class PViewDataGModel : public PViewData {
   // create old-style list-based dataset from this one
   //PViewDataList *convertToPViewDataList();
 
-  // acces GModel entities directly
+  // direct access to GModel entities and direct access to value by
+  // dataIndex
   GEntity *getEntity(int step, int ent);
+  bool getValue(int step, int dataIndex, int comp, double &val);
 
   // I/O routines
   bool readMSH(std::string fileName, int fileIndex, FILE *fp, bool binary,