diff --git a/Plugin/OctreePost.cpp b/Plugin/OctreePost.cpp
index c5d07c10ae5a9a972cb09646bdc92cd84b6e4796..956847d609d42232b8b8c933c3e9240f82bff34e 100644
--- a/Plugin/OctreePost.cpp
+++ b/Plugin/OctreePost.cpp
@@ -1,4 +1,4 @@
-// $Id: OctreePost.cpp,v 1.15 2005-03-04 19:08:38 geuzaine Exp $
+// $Id: OctreePost.cpp,v 1.16 2005-12-17 22:26:44 geuzaine Exp $
 //
 // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 //
@@ -63,6 +63,12 @@ static void centroid(int n, double *X, double *Y, double *Z, double *c)
   c[2] *= oc;
 }
 
+void linBB(void *a, double *min, double *max)
+{
+  double *X = (double*) a, *Y = &X[2], *Z = &X[4];
+  minmax(2, X, Y, Z, min, max);
+}
+
 void triBB(void *a, double *min, double *max)
 {
   double *X = (double*) a, *Y = &X[3], *Z = &X[6];
@@ -99,6 +105,14 @@ void pyrBB(void *a, double *min, double *max)
   minmax(5, X, Y, Z, min, max);
 }
 
+int linInEle(void *a, double *x)
+{
+  double *X = (double*) a, *Y = &X[2], *Z = &X[4], uvw[3];
+  line lin(X, Y, Z);
+  lin.xyz2uvw(x, uvw);
+  return lin.isInside(uvw[0], uvw[1], uvw[2]);
+}
+
 int triInEle(void *a, double *x)
 {
   double *X = (double*) a, *Y = &X[3], *Z = &X[6], uvw[3];
@@ -147,6 +161,12 @@ int pyrInEle(void *a, double *x)
   return pyr.isInside(uvw[0], uvw[1], uvw[2]);
 }
 
+void linCentroid(void *a, double *x)
+{
+  double *X = (double*) a, *Y = &X[2], *Z = &X[4];
+  centroid(2, X, Y, Z, x);
+}
+
 void triCentroid(void *a, double *x)
 {
   double *X = (double*) a, *Y = &X[3], *Z = &X[6];
@@ -214,6 +234,16 @@ OctreePost::OctreePost(Post_View *v)
   
   const int maxElePerBucket = 100; // memory vs. speed trade-off
 
+  SL = Octree_Create(maxElePerBucket, min, size, linBB, linCentroid, linInEle);
+  addListOfStuff(SL, v->SL, 6 + 2 * v->NbTimeStep);
+  Octree_Arrange(SL);
+  VL = Octree_Create(maxElePerBucket, min, size, linBB, linCentroid, linInEle);
+  addListOfStuff(VL, v->VL, 6 + 6 * v->NbTimeStep);
+  Octree_Arrange(VL);
+  TL = Octree_Create(maxElePerBucket, min, size, linBB, linCentroid, linInEle);
+  addListOfStuff(TL, v->TL, 6 + 18 * v->NbTimeStep);
+  Octree_Arrange(TL);
+
   ST = Octree_Create(maxElePerBucket, min, size, triBB, triCentroid, triInEle);
   addListOfStuff(ST, v->ST, 9 + 3 * v->NbTimeStep);
   Octree_Arrange(ST);
@@ -323,6 +353,7 @@ bool OctreePost::searchScalar(double x, double y, double z, double *values,
   if(getValue(Octree_Search(P, SY), 3, 5, 1, P, timestep, values, size_elem)) return true;
   if(getValue(Octree_Search(P, ST), 2, 3, 1, P, timestep, values, size_elem)) return true;
   if(getValue(Octree_Search(P, SQ), 2, 4, 1, P, timestep, values, size_elem)) return true;
+  if(getValue(Octree_Search(P, SL), 1, 2, 1, P, timestep, values, size_elem)) return true;
 
   return false;
 }
@@ -345,6 +376,7 @@ bool OctreePost::searchVector(double x, double y, double z, double *values,
   if(getValue(Octree_Search(P, VY), 3, 5, 3, P, timestep, values, size_elem)) return true;
   if(getValue(Octree_Search(P, VT), 2, 3, 3, P, timestep, values, size_elem)) return true;
   if(getValue(Octree_Search(P, VQ), 2, 4, 3, P, timestep, values, size_elem)) return true;
+  if(getValue(Octree_Search(P, VL), 1, 2, 3, P, timestep, values, size_elem)) return true;
 
   return false;
 }
@@ -367,6 +399,7 @@ bool OctreePost::searchTensor(double x, double y, double z, double *values,
   if(getValue(Octree_Search(P, TY), 3, 5, 9, P, timestep, values, size_elem)) return true;
   if(getValue(Octree_Search(P, TT), 2, 3, 9, P, timestep, values, size_elem)) return true;
   if(getValue(Octree_Search(P, TQ), 2, 4, 9, P, timestep, values, size_elem)) return true;
+  if(getValue(Octree_Search(P, TL), 1, 2, 9, P, timestep, values, size_elem)) return true;
 
   return false;
 }
diff --git a/Plugin/OctreePost.h b/Plugin/OctreePost.h
index 4dd8a1a193e4b8669a3dce2e458e9404dc662a33..85da8e28690df90facf1ccf3bd8de643faf05583 100644
--- a/Plugin/OctreePost.h
+++ b/Plugin/OctreePost.h
@@ -26,6 +26,7 @@ class  Post_View;
 
 class OctreePost 
 {
+  Octree *SL, *VL, *TL;
   Octree *ST, *VT, *TT;
   Octree *SQ, *VQ, *TQ;
   Octree *SS, *VS, *TS;
@@ -38,11 +39,11 @@ class OctreePost
  public :
   OctreePost(Post_View *);
   ~OctreePost();
-  // search for the value of the View at point
-  // x, y, z. Values is interpolated linearly in
-  // the post element. If several time steps
-  // are present, they are all interpolated unless
-  // time step is set to a different value than -1.
+  // search for the value of the View at point x, y, z. Values are
+  // interpolated using standard first order shape functions in the
+  // post element. If several time steps are present, they are all
+  // interpolated unless time step is set to a different value than
+  // -1.
   bool searchScalar(double x, double y, double z, double *values, 
 		    int timestep = -1, double *size_elem = 0);
   bool searchVector(double x, double y, double z, double *values, 
diff --git a/Plugin/Probe.cpp b/Plugin/Probe.cpp
index 7f8c69a5b7e92aef70fb25f65bf6153e93834d80..06ac4920325578c7ca51940f9653810977538111 100644
--- a/Plugin/Probe.cpp
+++ b/Plugin/Probe.cpp
@@ -1,4 +1,4 @@
-// $Id: Probe.cpp,v 1.10 2005-03-09 02:19:09 geuzaine Exp $
+// $Id: Probe.cpp,v 1.11 2005-12-17 22:26:44 geuzaine Exp $
 //
 // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 //
@@ -86,6 +86,7 @@ void GMSH_ProbePlugin::draw()
     glVertex3d(x,y,z-d); glVertex3d(x,y,z+d);
     glEnd();
   }
+  Draw_Point(1, CTX.point_size, &x, &y, &z, 1);
 #endif
 }