diff --git a/Plugin/CutGrid.cpp b/Plugin/CutGrid.cpp
index 5a861f2d9cb9b16fc1ba22bfda67192de0bc4771..a33ab9ee145d83fd18700059444971e885b3e75c 100644
--- a/Plugin/CutGrid.cpp
+++ b/Plugin/CutGrid.cpp
@@ -1,4 +1,4 @@
-// $Id: CutGrid.cpp,v 1.10 2004-12-27 08:59:29 geuzaine Exp $
+// $Id: CutGrid.cpp,v 1.11 2004-12-27 09:17:44 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -229,8 +229,8 @@ int GMSH_CutGridPlugin::getNbV()
 
 void GMSH_CutGridPlugin::getPoint(int iU, int iV, double *X)
 {
-  double u = (double)iU / (double)(getNbU () - 1.);
-  double v = (double)iV / (double)(getNbV () - 1.);
+  double u = getNbU() > 1 ? (double)iU / (double)(getNbU() - 1.) : 0.;
+  double v = getNbV() > 1 ? (double)iV / (double)(getNbV() - 1.) : 0.;
   X[0] = CutGridOptions_Number[0].def + 
     u  * (CutGridOptions_Number[3].def-CutGridOptions_Number[0].def) +
     v  * (CutGridOptions_Number[6].def-CutGridOptions_Number[0].def) ;
diff --git a/Plugin/Makefile b/Plugin/Makefile
index 6829234118d2c6454028dfd98f5ef405f38a567a..36946e8e334c2566613e4a1df3de3eeb8fad0820 100644
--- a/Plugin/Makefile
+++ b/Plugin/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.68 2004-12-27 07:31:14 geuzaine Exp $
+# $Id: Makefile,v 1.69 2004-12-27 09:17:44 geuzaine Exp $
 #
 # Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 #
@@ -150,12 +150,20 @@ StreamLines.o: StreamLines.cpp OctreePost.h Octree.h OctreeInternals.h \
   StreamLines.h Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h \
-  ../Common/GmshMatrix.h ../Common/AdaptiveViews.h ../Common/Context.h
+  ../Common/GmshMatrix.h ../Common/AdaptiveViews.h ../Common/Context.h \
+  ../Common/GmshUI.h ../Graphics/Draw.h ../Mesh/Mesh.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h \
+  ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/STL.h \
+  ../Mesh/Metric.h ../Mesh/Matrix.h
 CutGrid.o: CutGrid.cpp OctreePost.h Octree.h OctreeInternals.h CutGrid.h \
   Plugin.h ../Common/Options.h ../Common/Message.h ../Common/Views.h \
   ../Common/ColorTable.h ../DataStr/List.h ../Common/VertexArray.h \
   ../Common/SmoothNormals.h ../Common/GmshMatrix.h \
-  ../Common/AdaptiveViews.h ../Common/Context.h
+  ../Common/AdaptiveViews.h ../Common/Context.h ../Common/GmshUI.h \
+  ../Graphics/Draw.h ../Mesh/Mesh.h ../DataStr/Tree.h ../DataStr/avl.h \
+  ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/STL.h ../Mesh/Metric.h \
+  ../Mesh/Matrix.h
 Transform.o: Transform.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
   ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
diff --git a/Plugin/StreamLines.cpp b/Plugin/StreamLines.cpp
index dba4c39dfb0d28175a79353cdd95f9154d80174c..20d40b390682194d54f71749628e64046017daef 100644
--- a/Plugin/StreamLines.cpp
+++ b/Plugin/StreamLines.cpp
@@ -1,4 +1,4 @@
-// $Id: StreamLines.cpp,v 1.13 2004-11-25 02:10:40 geuzaine Exp $
+// $Id: StreamLines.cpp,v 1.14 2004-12-27 09:17:44 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -24,23 +24,26 @@
 #include "StreamLines.h"
 #include "List.h"
 #include "Context.h"
-#include "Views.h"
-#include "Message.h"
+
+#if defined(HAVE_FLTK)
+#include "GmshUI.h"
+#include "Draw.h"
+#endif
 
 extern Context_T CTX;
 
 StringXNumber StreamLinesOptions_Number[] = {
-  {GMSH_FULLRC, "X0", NULL, 2.39},
-  {GMSH_FULLRC, "Y0", NULL, .445},
-  {GMSH_FULLRC, "Z0", NULL, 0.},
-  {GMSH_FULLRC, "X1", NULL, 2.39},
-  {GMSH_FULLRC, "Y1", NULL, 0.94},
-  {GMSH_FULLRC, "Z1", NULL, 0.},
-  {GMSH_FULLRC, "X2", NULL, 2.39},
-  {GMSH_FULLRC, "Y2", NULL, .445},
-  {GMSH_FULLRC, "Z2", NULL, 1.},
-  {GMSH_FULLRC, "nPointsU", NULL, 20},
-  {GMSH_FULLRC, "nPointsV", NULL, 1},
+  {GMSH_FULLRC, "X0", GMSH_StreamLinesPlugin::callbackX0, 2.39},
+  {GMSH_FULLRC, "Y0", GMSH_StreamLinesPlugin::callbackY0, .445},
+  {GMSH_FULLRC, "Z0", GMSH_StreamLinesPlugin::callbackZ0, 0.},
+  {GMSH_FULLRC, "X1", GMSH_StreamLinesPlugin::callbackX1, 2.39},
+  {GMSH_FULLRC, "Y1", GMSH_StreamLinesPlugin::callbackY1, 0.94},
+  {GMSH_FULLRC, "Z1", GMSH_StreamLinesPlugin::callbackZ1, 0.},
+  {GMSH_FULLRC, "X2", GMSH_StreamLinesPlugin::callbackX2, 2.39},
+  {GMSH_FULLRC, "Y2", GMSH_StreamLinesPlugin::callbackY2, .445},
+  {GMSH_FULLRC, "Z2", GMSH_StreamLinesPlugin::callbackZ2, 1.},
+  {GMSH_FULLRC, "nPointsU", GMSH_StreamLinesPlugin::callbackU, 20},
+  {GMSH_FULLRC, "nPointsV", GMSH_StreamLinesPlugin::callbackV, 1},
   {GMSH_FULLRC, "MaxIter", NULL, 100},
   {GMSH_FULLRC, "DT", NULL, .1},
   {GMSH_FULLRC, "dView", NULL, -1.},
@@ -55,12 +58,133 @@ extern "C"
   }
 }
 
-
 GMSH_StreamLinesPlugin::GMSH_StreamLinesPlugin()
 {
   ;
 }
 
+void GMSH_StreamLinesPlugin::draw()
+{
+#if defined(HAVE_FLTK)
+  glColor4ubv((GLubyte *) & CTX.color.fg);
+  double p[3];
+  glBegin(GL_LINES);
+  for(int i = 0; i < getNbU(); ++i){
+    getPoint(i, 0, p);
+    glVertex3d(p[0], p[1], p[2]);
+    getPoint(i, getNbV()-1, p);
+    glVertex3d(p[0], p[1], p[2]);
+  }
+  for(int i = 0; i < getNbV(); ++i){
+    getPoint(0, i, p);
+    glVertex3d(p[0], p[1], p[2]);
+    getPoint(getNbU()-1, i, p);
+    glVertex3d(p[0], p[1], p[2]);
+  }
+  glEnd();
+#endif
+}
+
+void GMSH_StreamLinesPlugin::callback()
+{
+#if defined(HAVE_FLTK)
+  CTX.post.plugin_draw_function = draw;
+  if(CTX.fast_redraw){
+    CTX.post.draw = 0;
+    CTX.mesh.draw = 0;
+  }
+  if(!CTX.batch) 
+    Draw();
+  CTX.post.plugin_draw_function = NULL;
+  CTX.post.draw = 1;
+  CTX.mesh.draw = 1;
+#endif
+}
+
+double GMSH_StreamLinesPlugin::callbackXYZ(int num, int action, double value, double *opt)
+{
+  switch(action){ // configure the input field
+  case 1: return CTX.lc/200.;
+  case 2: return -CTX.lc;
+  case 3: return CTX.lc;
+  default: break;
+  }
+  *opt = value;
+  callback();
+  return 0.;
+}
+
+double GMSH_StreamLinesPlugin::callbackX0(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[0].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackY0(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[1].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackZ0(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[2].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackX1(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[3].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackY1(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[4].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackZ1(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[5].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackX2(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[6].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackY2(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[7].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackZ2(int num, int action, double value)
+{
+  return callbackXYZ(num, action, value, &StreamLinesOptions_Number[8].def);
+}
+
+double GMSH_StreamLinesPlugin::callbackU(int num, int action, double value)
+{
+  switch(action){ // configure the input field
+  case 1: return 1;
+  case 2: return 1;
+  case 3: return 100;
+  default: break;
+  }
+  StreamLinesOptions_Number[9].def = value;
+  callback();
+  return 0.;
+}
+
+double GMSH_StreamLinesPlugin::callbackV(int num, int action, double value)
+{
+  switch(action){ // configure the input field
+  case 1: return 1;
+  case 2: return 1;
+  case 3: return 100;
+  default: break;
+  }
+  StreamLinesOptions_Number[10].def = value;
+  callback();
+  return 0.;
+}
+
 void GMSH_StreamLinesPlugin::getName(char *name) const
 {
   strcpy(name, "Stream lines");
@@ -109,20 +233,20 @@ void GMSH_StreamLinesPlugin::catchErrorMessage(char *errorMessage) const
   strcpy(errorMessage, "StreamLines failed...");
 }
 
-int GMSH_StreamLinesPlugin::getNbU()const 
+int GMSH_StreamLinesPlugin::getNbU()
 {
   return (int)StreamLinesOptions_Number[9].def;
 }
 
-int GMSH_StreamLinesPlugin::getNbV()const 
+int GMSH_StreamLinesPlugin::getNbV()
 {
   return (int)StreamLinesOptions_Number[10].def;
 }
 
-void GMSH_StreamLinesPlugin::getPoint(int iU, int iV, double *X) const 
+void GMSH_StreamLinesPlugin::getPoint(int iU, int iV, double *X)
 {
-  double u = (double)iU / (double)(getNbU());
-  double v = (double)iV / (double)(getNbV());
+  double u = getNbU() > 1 ? (double)iU / (double)(getNbU() - 1.) : 0.;
+  double v = getNbV() > 1 ? (double)iV / (double)(getNbV() - 1.) : 0.;
   X[0] = StreamLinesOptions_Number[0].def + 
     u  * (StreamLinesOptions_Number[3].def-StreamLinesOptions_Number[0].def) +
     v  * (StreamLinesOptions_Number[6].def-StreamLinesOptions_Number[0].def) ;
diff --git a/Plugin/StreamLines.h b/Plugin/StreamLines.h
index 693c098a376111d6a329cc616aa791e4423ca6e1..e7a53b844ea481a95608da3071db910067e06f8b 100644
--- a/Plugin/StreamLines.h
+++ b/Plugin/StreamLines.h
@@ -29,6 +29,8 @@ extern "C"
 
 class GMSH_StreamLinesPlugin : public GMSH_Post_Plugin
 {
+  static void callback();
+  static double callbackXYZ(int, int, double, double*);
 public:
   GMSH_StreamLinesPlugin();
   void getName(char *name) const;
@@ -39,10 +41,24 @@ public:
   int getNbOptions() const;
   StringXNumber *getOption(int iopt);  
   Post_View *execute(Post_View *);
-  virtual int getNbU() const ;
-  virtual int getNbV() const ;
-  virtual void getPoint(int iU, int iV, double *X ) const  ;
   virtual Post_View * GenerateView(int iView, int dView) const ;
+
+  static int getNbU();
+  static int getNbV();
+  static void getPoint(int iU, int iV, double *X );
+
+  static double callbackX0(int, int, double);
+  static double callbackY0(int, int, double);
+  static double callbackZ0(int, int, double);
+  static double callbackX1(int, int, double);
+  static double callbackY1(int, int, double);
+  static double callbackZ1(int, int, double);
+  static double callbackX2(int, int, double);
+  static double callbackY2(int, int, double);
+  static double callbackZ2(int, int, double);
+  static double callbackU(int, int, double);
+  static double callbackV(int, int, double);
+  static void draw();
 };
 
 #endif