diff --git a/Common/Makefile b/Common/Makefile
index 6b554d6d88bbe212584539270fd7b7b785be4a8a..3c0d2079bed1174576676a1627af820d37ce05a4 100644
--- a/Common/Makefile
+++ b/Common/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.72 2005-01-08 20:15:10 geuzaine Exp $
+# $Id: Makefile,v 1.73 2005-02-08 10:04:33 remacle Exp $
 #
 # Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 #
@@ -70,26 +70,27 @@ Context.o: Context.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
   ../Mesh/Matrix.h ../Graphics/Draw.h ../Common/Views.h \
   ../Common/ColorTable.h ../Common/GmshMatrix.h ../Common/AdaptiveViews.h \
-  Context.h Options.h DefaultOptions.h Trackball.h
+  Context.h Options.h DefaultOptions.h Views.h Trackball.h
 AdaptiveViews.o: AdaptiveViews.cpp AdaptiveViews.h ../DataStr/List.h \
   GmshMatrix.h ../Plugin/Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h
+  ../Common/SmoothNormals.h ../Common/GmshMatrix.h \
+  ../Common/AdaptiveViews.h
 Views.o: Views.cpp Gmsh.h Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../Numeric/Numeric.h Views.h ColorTable.h VertexArray.h SmoothNormals.h \
-  GmshMatrix.h AdaptiveViews.h Context.h Options.h
+  GmshMatrix.h AdaptiveViews.h Context.h Options.h ../MathEval/matheval.h
 Options.o: Options.cpp ../Plugin/PluginManager.h ../Plugin/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 Gmsh.h ../DataStr/Malloc.h ../DataStr/Tree.h \
-  ../DataStr/avl.h ../DataStr/Tools.h GmshUI.h ../Geo/Geo.h \
-  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h \
-  ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
+  ../Common/AdaptiveViews.h Gmsh.h Message.h ../DataStr/Malloc.h \
+  ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h GmshUI.h \
+  ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
+  ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  ../Graphics/Draw.h Context.h ../Fltk/Solvers.h ../Fltk/GUI.h \
-  ../Fltk/Opengl_Window.h ../Fltk/Colorbar_Window.h
+  ../Graphics/Draw.h Context.h Options.h ../Fltk/Solvers.h ../Fltk/GUI.h \
+  ../Fltk/Opengl_Window.h ../Fltk/Colorbar_Window.h ../Common/GmshUI.h
 CommandLine.o: CommandLine.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   GmshUI.h GmshVersion.h CommandLine.h ../Numeric/Numeric.h Context.h \
@@ -97,8 +98,8 @@ CommandLine.o: CommandLine.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h \
   ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h Views.h ColorTable.h GmshMatrix.h AdaptiveViews.h \
-  ../Parser/OpenFile.h ../Parser/Parser.h
+  ../Mesh/Matrix.h Views.h ColorTable.h VertexArray.h SmoothNormals.h \
+  GmshMatrix.h AdaptiveViews.h ../Parser/OpenFile.h ../Parser/Parser.h
 Timer.o: Timer.cpp
 ColorTable.o: ColorTable.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
diff --git a/Geo/Makefile b/Geo/Makefile
index bfd03c87e8315b9c8a4ea256eb923a5fff588e38..6690b795b1cbcb97c97224f9dbe0726b6a326470 100644
--- a/Geo/Makefile
+++ b/Geo/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.58 2005-01-08 20:15:12 geuzaine Exp $
+# $Id: Makefile,v 1.59 2005-02-08 10:04:33 remacle Exp $
 #
 # Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 #
@@ -65,7 +65,7 @@ CAD.o: CAD.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
   ../Mesh/Matrix.h ../Mesh/Interpolation.h ../Mesh/Create.h CAD.h \
-  ../Common/Visibility.h ../Common/Context.h
+  ExtrudeParams.h ../Common/Visibility.h ../Common/Context.h
 MinMax.o: MinMax.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h \
@@ -76,21 +76,21 @@ ExtrudeParams.o: ExtrudeParams.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h \
   ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h
+  ../Mesh/Matrix.h ExtrudeParams.h
 Geo.o: Geo.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../Numeric/Numeric.h Geo.h CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h \
   ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h \
   ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h ../Parser/Parser.h ../Common/Context.h
+  ../Mesh/Matrix.h ExtrudeParams.h ../Parser/Parser.h ../Common/Context.h
 GeoUtils.o: GeoUtils.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h Geo.h CAD.h ../Mesh/Mesh.h \
   ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h \
   ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h ../Numeric/Numeric.h
+  ../Mesh/Matrix.h ExtrudeParams.h ../Numeric/Numeric.h
 StepGeomDatabase.o: StepGeomDatabase.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
@@ -98,19 +98,20 @@ StepGeomDatabase.o: StepGeomDatabase.cpp ../Common/Gmsh.h \
   ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h \
   ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h ../Mesh/Nurbs.h CAD.h StepGeomDatabase.h \
-  ../Mesh/Create.h ../Common/Context.h
+  ../Mesh/Matrix.h ../Mesh/Nurbs.h CAD.h ExtrudeParams.h \
+  StepGeomDatabase.h ../Mesh/Create.h ../Common/Context.h
 ExtractContour.o: ExtractContour.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h Geo.h GeoUtils.h ../Mesh/Mesh.h \
   ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h \
   ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h CAD.h ../Numeric/Numeric.h
+  ../Mesh/Matrix.h CAD.h ExtrudeParams.h ../Numeric/Numeric.h
 Print_Geo.o: Print_Geo.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h Geo.h ../Mesh/Mesh.h \
   ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h \
   ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \
-  ../Mesh/Matrix.h CAD.h ../Numeric/Numeric.h ../Common/Context.h
+  ../Mesh/Matrix.h CAD.h ExtrudeParams.h ../Numeric/Numeric.h \
+  ../Common/Context.h
diff --git a/Mesh/Makefile b/Mesh/Makefile
index 504bb6318502e6bac7c7fc55a30763db69e6b15d..85635a25741ec5f61e92c66c78f24b4115d67957 100644
--- a/Mesh/Makefile
+++ b/Mesh/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.77 2005-01-08 20:15:12 geuzaine Exp $
+# $Id: Makefile,v 1.78 2005-02-08 10:04:33 remacle Exp $
 #
 # Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 #
@@ -113,8 +113,8 @@ depend:
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Utils.h \
-  Create.h 2D_Mesh.h ../Common/Context.h Interpolation.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  Utils.h Vertex.h Create.h 2D_Mesh.h ../Common/Context.h Interpolation.h
 2D_Transfinite.o: 2D_Transfinite.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \
@@ -127,7 +127,7 @@ depend:
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h
 2D_BGMesh.o: 2D_BGMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h Mesh.h \
@@ -195,21 +195,22 @@ depend:
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
   ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  Interpolation.h 2D_Mesh.h Create.h ../Common/Context.h
+  Interpolation.h Vertex.h Mesh.h 2D_Mesh.h Create.h ../Common/Context.h
 2D_Mesh_Aniso.o: 2D_Mesh_Aniso.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h ../Geo/Geo.h \
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  Interpolation.h Create.h ../Common/Context.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  Interpolation.h Vertex.h Create.h ../Common/Context.h
 2D_Mesh_Triangle.o: 2D_Mesh_Triangle.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h \
   Element.h Simplex.h Face.h Edge.h ../Geo/ExtrudeParams.h \
   DiscreteSurface.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
-  Metric.h Matrix.h ../Numeric/Numeric.h ../Common/Context.h
+  Metric.h Matrix.h ../Numeric/Numeric.h ../Common/Context.h \
+  ../Triangle/triangle.h
 3D_Mesh.o: 3D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h Mesh.h \
@@ -236,16 +237,16 @@ depend:
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  ../Common/Context.h Create.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  ../Common/Context.h Create.h Vertex.h
 3D_Extrude_Old.o: 3D_Extrude_Old.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h ../Geo/Geo.h \
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  ../Common/Context.h Create.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  ../Common/Context.h Create.h Vertex.h
 3D_Coherence.o: 3D_Coherence.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h ../Geo/Geo.h \
@@ -269,7 +270,8 @@ depend:
   ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Element.h Simplex.h \
   Face.h Edge.h ../Geo/ExtrudeParams.h DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h Metric.h Matrix.h \
-  Create.h ../Numeric/Numeric.h ../Common/Context.h
+  Create.h ../Numeric/Numeric.h ../Common/Context.h \
+  ../Netgen/libsrc/interface/nglib.h ../Netgen/nglib_addon.h
 MeshQuality.o: MeshQuality.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h Mesh.h \
@@ -282,8 +284,8 @@ Create.o: Create.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Utils.h \
-  ../Common/Context.h Create.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  Utils.h Vertex.h ../Common/Context.h Create.h
 Generator.o: Generator.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h Mesh.h \
@@ -298,23 +300,24 @@ Print_Mesh.o: Print_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Create.h \
-  ../Common/Context.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  Create.h Vertex.h ../Common/Context.h
 Read_Mesh.o: Read_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h ../Geo/CAD.h \
   ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h \
   ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h 3D_Mesh.h \
-  Create.h ../Geo/MinMax.h ../Common/Context.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  3D_Mesh.h Create.h Vertex.h ../Geo/MinMax.h ../Common/Context.h
 DiscreteSurface.o: DiscreteSurface.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../Numeric/Numeric.h Mesh.h Vertex.h Element.h Simplex.h Face.h Edge.h \
   ../Geo/ExtrudeParams.h DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h Metric.h Matrix.h ../Geo/CAD.h ../Geo/Geo.h \
-  Create.h Interpolation.h ../Common/Context.h
+  ../Common/SmoothNormals.h Metric.h Matrix.h ../Geo/CAD.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Geo/Geo.h Create.h Interpolation.h \
+  ../Common/Context.h
 SwapEdge.o: SwapEdge.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h Mesh.h \
@@ -327,29 +330,30 @@ Utils.o: Utils.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  Interpolation.h ../Common/Context.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  Interpolation.h Vertex.h ../Common/Context.h
 Metric.o: Metric.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h ../Geo/Geo.h \
   ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h \
   ../Mesh/Simplex.h ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
   ../Mesh/DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h \
-  Interpolation.h
+  ../Common/SmoothNormals.h ../Mesh/Metric.h ../Mesh/Matrix.h Mesh.h \
+  Matrix.h Interpolation.h Vertex.h
 Nurbs.o: Nurbs.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h Nurbs.h Vertex.h Mesh.h Element.h \
   Simplex.h Face.h Edge.h ../Geo/ExtrudeParams.h DiscreteSurface.h \
   ../Common/VertexArray.h ../Common/SmoothNormals.h Metric.h Matrix.h \
-  ../Geo/Geo.h ../Geo/GeoUtils.h Create.h ../Geo/CAD.h
+  ../Geo/Geo.h ../Geo/GeoUtils.h ../Mesh/Mesh.h Create.h ../Geo/CAD.h \
+  ../Mesh/Vertex.h
 Interpolation.o: Interpolation.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Numeric/Numeric.h ../Geo/Geo.h \
   Nurbs.h Vertex.h Mesh.h Element.h Simplex.h Face.h Edge.h \
   ../Geo/ExtrudeParams.h DiscreteSurface.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h Metric.h Matrix.h ../Geo/CAD.h Utils.h \
-  Interpolation.h
+  ../Common/SmoothNormals.h Metric.h Matrix.h ../Geo/CAD.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h Utils.h Interpolation.h
 SecondOrder.o: SecondOrder.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \
diff --git a/Plugin/StructuralSolver.cpp b/Plugin/StructuralSolver.cpp
index 684a9ebba45672b59221d33434c3e6f88e995974..dc28eb7c1a6bb30a3bb258f3f1246c173ff8dda1 100644
--- a/Plugin/StructuralSolver.cpp
+++ b/Plugin/StructuralSolver.cpp
@@ -45,9 +45,11 @@ Structural_BeamSection:: Structural_BeamSection( const char *direct, std::string
   m.BGM.bgm = NULL;
   m.Grid.init = 0;
   Init_Mesh(&m);
+  //  THEM=&m;
 
   char temp[256];
   sprintf(temp, "%s/%s", direct,name.c_str());
+  //  printf("%s/%s\n", direct,name.c_str());
   // read the section (msh format)
   FILE *f = fopen (temp,"r");  
   Read_Mesh (&m, f, temp,FORMAT_MSH);
@@ -70,11 +72,13 @@ void Structural_BeamSection :: computeGeometricalProperties ()
 		    {.5,1,.5},
 		    {.5,.5,1}};
 
+  //  printf("%d surfaces\n",List_Nbr(surfaces));
   for (int i=0;i<List_Nbr(surfaces);++i)
     {
       Surface *s;
       List_Read(surfaces,i,&s);
-      List_T *triangles = Tree2List(s->Simplexes);
+      List_T *triangles = Tree2List(s->SimplexesBase);
+      //      printf("surface %d %d triangles\n",s->Num,List_Nbr(triangles));
       for(int j=0;j<List_Nbr(triangles);++j)
 	{
 	  Simplex *simp;
@@ -82,6 +86,7 @@ void Structural_BeamSection :: computeGeometricalProperties ()
 	  Vertex v = (*simp->V[0]+*simp->V[1]+*simp->V[2])*0.333333333333333333;
 	  double A = simp->surfsimpl();
 	  area+=A;
+	  //	  printf("triangle %d aire %g\n",i,A);
 	  xc += v.Pos.X*A;
 	  yc += v.Pos.Y*A;
 	}
@@ -110,7 +115,7 @@ void Structural_BeamSection :: computeGeometricalProperties ()
       List_Delete(triangles);
     }
   List_Delete(surfaces);  
-  printf("%s %g %g %g %g %g\n",name.c_str(),area,xc,yc,Iy,Iz);
+  //  printf("%s %g %g %g %g %g\n",name.c_str(),area,xc,yc,Iy,Iz);
 }
 
 void Structural_Texture::setup ()
@@ -160,7 +165,9 @@ void Structural_BeamSection ::  GL_DrawBeam (double pinit[3], double dir[3], con
       texture.setup();
     }
 
-  double X[3] = {dir[0],dir[1],dir[2]};
+  const double LL = sqrt(dir[0]*dir[0]+dir[1]*dir[1]+dir[2]*dir[2]);
+
+  double X[3] = {dir[0]/LL,dir[1]/LL,dir[2]/LL};
   double Z[3] = {dirz[0],dirz[1],dirz[2]};
   double Y[3];
   prodve(X,Z,Y);
@@ -172,6 +179,9 @@ void Structural_BeamSection ::  GL_DrawBeam (double pinit[3], double dir[3], con
   double invrot[3][3] = {{Z[0],Z[1],Z[2]},
 			 {Y[0],Y[1],Y[2]},
 			 {X[0],X[1],X[2]}};
+  //  printf("%g %g %g\n",invrot[0][0], invrot[0][1], invrot[0][2]);
+  //  printf("%g %g %g\n",invrot[1][0], invrot[1][1], invrot[1][2]);
+  //  printf("%g %g %g\n",invrot[2][0], invrot[2][1], invrot[2][2]);
   
   List_T *vertices = Tree2List (m.Vertices);
   Vertex *vert;
@@ -198,8 +208,8 @@ void Structural_BeamSection ::  GL_DrawBeam (double pinit[3], double dir[3], con
     {
       Surface *s;
       List_Read(surfaces,i,&s);
-      List_T *triangles = Tree2List(s->Simplexes);
-      //      printf("%g %g %d %d\n",xc,yc,List_Nbr(vertices),List_Nbr(triangles));
+      List_T *triangles = Tree2List(s->SimplexesBase);
+      //printf("%g %g %d %d\n",xc,yc,List_Nbr(vertices),List_Nbr(triangles));
       for(int j=0;j<List_Nbr(triangles);++j)
 	{
 	  Simplex *simp;
@@ -223,7 +233,7 @@ void Structural_BeamSection ::  GL_DrawBeam (double pinit[3], double dir[3], con
     {
       Curve *c;
       List_Read(curves,i,&c);
-      List_T *lines = Tree2List(c->Simplexes);
+      List_T *lines = Tree2List(c->SimplexesBase);
       //      printf("%g %g %d %d\n",xc,yc,List_Nbr(vertices),List_Nbr(triangles));
       for(int j=0;j<List_Nbr(lines);++j)
 	{
@@ -413,6 +423,13 @@ Structural_BeamSection * StructuralSolver :: GetBeamSection (const std::string &
     }
   return 0;
 }
+int  GetModel (const std::string & name)
+{
+  if (!strcmp(name.c_str(),"Beam"))return 1;
+  if (!strcmp(name.c_str(),"Bar"))return 2;
+  return 3;
+}
+
 Structural_Material StructuralSolver :: GetMaterial (const std::string & name) const 
 {
   std::list<struct Structural_Material > :: const_iterator it  = materials.begin();
@@ -431,6 +448,7 @@ Structural_Material StructuralSolver :: GetMaterial (const std::string & name) c
 
 #define BEAM_SECTION_ 3
 #define BEAM_MATERIAL_ 4
+#define BEAM_MODEL_ 5
 #define POINT_ALONG_ 0
 #define POINT_ACROSS_ 1
 #define POINT_AROUND_ 2
@@ -476,7 +494,7 @@ void StructuralSolver ::popupPropertiesForPhysicalEntity (int dim)
     Fl_Tabs *o = new Fl_Tabs(WB, WB, width - 2 * WB, height - 3 * WB - BH);
     // 0: 
     {
-      g[0] = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Physical Point");
+      g[0] = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Nodal Constraint");
       
       static Fl_Menu_Item _type[] = {
 	{"Displacement fixed (mm)", 0, 0, 0},
@@ -516,7 +534,14 @@ void StructuralSolver ::popupPropertiesForPhysicalEntity (int dim)
     }
     // 2: Physical Line
     {
-      g[1] = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Physical Line");
+      g[1] = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Beam");
+
+      static Fl_Menu_Item _model[] = {
+	{"Beam", 0, 0, 0},
+	{"Bar", 0, 0, 0},
+	{0}
+      };
+
       {
 	_choice[BEAM_SECTION_] = new Fl_Choice(2 * WB, 2 * WB + 1 * BH, IW, BH, "Beam Section");      
 	std::list<struct Structural_BeamSection* > :: iterator it  = beam_sections.begin();
@@ -538,37 +563,45 @@ void StructuralSolver ::popupPropertiesForPhysicalEntity (int dim)
 	_choice[BEAM_MATERIAL_]->align(FL_ALIGN_RIGHT);
       }
 
-      _value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW/2, BH,       "");
+      {
+	_choice[BEAM_MODEL_] = new Fl_Choice(2 * WB, 2 * WB + 3 * BH, IW, BH, "Kinematic Model");      
+	_choice[BEAM_MODEL_]->menu(_model);
+	_choice[BEAM_MODEL_]->align(FL_ALIGN_RIGHT);
+      }
+
+      _value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW/2, BH,       "");
       _value[6]->value(0.0);
       _value[6]->align(FL_ALIGN_RIGHT);
-      _value[7] = new Fl_Value_Input(2 * WB+IW/2, 2 * WB + 3 * BH, IW/2, BH, "X-Load");
+      _value[7] = new Fl_Value_Input(2 * WB+IW/2, 2 * WB + 4 * BH, IW/2, BH, "X-Load");
       _value[7]->value(0.0);
       _value[7]->align(FL_ALIGN_RIGHT);
-      _value[8] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW/2, BH,       "");
+      _value[8] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW/2, BH,       "");
       _value[8]->value(0.0);
       _value[8]->align(FL_ALIGN_RIGHT);
-      _value[9] = new Fl_Value_Input(2 * WB+IW/2, 2 * WB + 4 * BH, IW/2, BH, "Y-Load");
+      _value[9] = new Fl_Value_Input(2 * WB+IW/2, 2 * WB + 5 * BH, IW/2, BH, "Y-Load");
       _value[9]->value(0.0);
       _value[9]->align(FL_ALIGN_RIGHT);
-      _value[10] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW/2, BH,       "");
+      _value[10] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW/2, BH,       "");
       _value[10]->value(0.0);
       _value[10]->align(FL_ALIGN_RIGHT);
-      _value[11] = new Fl_Value_Input(2 * WB+IW/2, 2 * WB + 5 * BH, IW/2, BH, "Z-Load");
+      _value[11] = new Fl_Value_Input(2 * WB+IW/2, 2 * WB + 6 * BH, IW/2, BH, "Z-Load");
       _value[11]->value(0.0);
       _value[11]->align(FL_ALIGN_RIGHT);
       
-      _value[12] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW/3, BH,       "");
+      _value[12] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW/3, BH,       "");
       _value[12]->value(0.0);
       _value[12]->align(FL_ALIGN_RIGHT);
-      _value[13] = new Fl_Value_Input(2 * WB+IW/3, 2 * WB + 6 * BH, IW/3, BH,       "");
+      _value[13] = new Fl_Value_Input(2 * WB+IW/3, 2 * WB + 7* BH, IW/3, BH,       "");
       _value[13]->value(0.0);
       _value[13]->align(FL_ALIGN_RIGHT);
-      _value[14] = new Fl_Value_Input(2 * WB+2*IW/3, 2 * WB + 6 * BH, IW/3, BH, "Y-Direction");
+      _value[14] = new Fl_Value_Input(2 * WB+2*IW/3, 2 * WB + 7 * BH, IW/3, BH, "Y-Direction");
       _value[14]->value(1.0);
       _value[14]->align(FL_ALIGN_RIGHT);
       
       g[1]->end();
     }
+
+
     o->end();
 
     {
@@ -588,10 +621,24 @@ void StructuralSolver :: addPhysicalLine (int id)
   PhysicalLineInfo info;  
   info.section = std::string(_choice[BEAM_SECTION_] ->mvalue()->text);  
   info.material= std::string(_choice[BEAM_MATERIAL_]->mvalue()->text);
+  info.model= std::string(_choice[BEAM_MODEL_]->mvalue()->text);
   info.dirz[0]  = _value[12]->value();
   info.dirz[1]  = _value[13]->value();
   info.dirz[2]  = _value[14]->value();
+  info.fx1      = _value[6]->value();
+  info.fx2      = _value[7]->value();
+  info.fy1      = _value[8]->value();
+  info.fy2      = _value[8]->value();
+  info.fz1      = _value[10]->value();
+  info.fz2      = _value[11]->value();
   lines[id] = info;
+
+  double f1 = sqrt (info.fx1*info.fx1+info.fy1*info.fy1+info.fz1*info.fz1);
+  double f2 = sqrt (info.fx2*info.fx2+info.fy2*info.fy2+info.fz2*info.fz2);
+
+  MAX_FORCE = (MAX_FORCE>f1)?MAX_FORCE:f1;
+  MAX_FORCE = (MAX_FORCE>f2)?MAX_FORCE:f2;
+
 #endif  
 }
 
@@ -648,8 +695,8 @@ void StructuralSolver :: writeSolverFile ( const char *geom_file ) const
 	int id = (*it).first;
 	if (getPhysical ( id , 1 ))
 	  {
-	    fprintf(f,"BEAM PHYSICAL %d SECTION %s MATERIAL %s LOADS %g %g %g %g %g %g %g %g %g \n",
-		    id,i.section.c_str(),i.material.c_str(),i.fx1,i.fy1,i.fx2,i.fy2,i.fz1,i.fz2,i.dirz[0],i.dirz[1],i.dirz[2]);
+	    fprintf(f,"BEAM PHYSICAL %d SECTION %s MATERIAL %s MODEL %s LOADS %g %g %g %g %g %g %g %g %g \n",
+		    id,i.section.c_str(),i.material.c_str(),i.model.c_str(),i.fx1,i.fy1,i.fx2,i.fy2,i.fz1,i.fz2,i.dirz[0],i.dirz[1],i.dirz[2]);
 	  }
       }
   }
@@ -680,8 +727,10 @@ void StructuralSolver :: writeSolverFile ( const char *geom_file ) const
 	  {
 	    Structural_BeamSection* bs = GetBeamSection (i.section);
 	    Structural_Material    mt = GetMaterial    (i.material);
-	    fprintf(f,"111 %d %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g\n",
+	    int model = GetModel (i.model);
+	    fprintf(f,"111 %d %d %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g\n",
 		    id,                             // physical id
+		    model,                             // model 
 		    bs->area, bs->Iy, bs->Iz, bs->J,// section info
 		    mt.par[0],mt.par[1],mt.par[2],// material info
 		    i.fx1,i.fy1,i.fx2,i.fy2,i.fz1,i.fz2,// lineic loads
@@ -707,7 +756,7 @@ void StructuralSolver :: writeSolverFile ( const char *geom_file ) const
 
 void StructuralSolver :: readSolverFile ( const char *geom_file ) 
 {
-  char name[256],line[256],a1[24],a2[24],a3[24],a4[240],a5[24],a6[240],a7[24];
+  char name[256],line[256],a1[24],a2[24],a3[24],a4[240],a5[24],a6[240],a7[24],a8[24],a9[24];
   sprintf(name,"%s.str",geom_file);
   FILE *f = fopen(name,"r");  
   if (!f)return;
@@ -720,11 +769,19 @@ void StructuralSolver :: readSolverFile ( const char *geom_file )
 	{
 	  int id;
 	  PhysicalLineInfo info;
-	  sscanf(line,"%s %s %d %s %s %s %s %s %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",
-		 a1,a2,&id,a3,a4,a5,a6,a7,&info.fx1,&info.fy1,&info.fx2,&info.fy2,&info.fz1,&info.fz2,&info.dirz[0],&info.dirz[1],&info.dirz[2]);
+	  sscanf(line,"%s %s %d %s %s %s %s %s %s %s %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",
+		 a1,a2,&id,a3,a4,a5,a6,a7,a8,a9,&info.fx1,&info.fy1,&info.fx2,&info.fy2,&info.fz1,&info.fz2,&info.dirz[0],&info.dirz[1],&info.dirz[2]);
+	  info.model = std::string(a8);
 	  info.material = std::string(a6);
 	  info.section  = std::string(a4);
-	  lines[id] = info;
+	  lines[id] = info;       
+
+	  double f1 = sqrt (info.fx1*info.fx1+info.fy1*info.fy1+info.fz1*info.fz1);
+	  double f2 = sqrt (info.fx2*info.fx2+info.fy2*info.fy2+info.fz2*info.fz2);
+
+	  MAX_FORCE = (MAX_FORCE>f1)?MAX_FORCE:f1;
+	  MAX_FORCE = (MAX_FORCE>f2)?MAX_FORCE:f2;
+
 	}
       if (!strcmp(name,"NODE"))
 	{
@@ -743,7 +800,7 @@ void StructuralSolver :: readSolverFile ( const char *geom_file )
 	}
       if (feof(f) )break;
     }
-  printf("max force = %g\n",MAX_FORCE);
+  //  printf("max force = %g\n",MAX_FORCE);
   fclose(f);
 }
 
@@ -968,24 +1025,67 @@ bool StructuralSolver :: GL_enhancePoint ( Vertex *v)
 bool StructuralSolver :: GL_enhanceLine ( int CurveId, Vertex *v1, Vertex *v2) 
 {
 #ifdef HAVE_FLTK  
-  //  return true;
   PhysicalGroup *p;
+  //  printf("%d physical groups \n",List_Nbr(THEM->PhysicalGroups));
   for(int i = 0; i < List_Nbr(THEM->PhysicalGroups); i++) 
     { 
       List_Read(THEM->PhysicalGroups, i, &p);
       if(p->Typ == MSH_PHYSICAL_LINE) {
+	//	printf("physical line found ... curve Id is %d\n",CurveId);
 	if(List_Search(p->Entities, &CurveId, fcmp_absint)) { 
 	  std::map<int,struct PhysicalLineInfo>::const_iterator it = lines.find(p->Num);
+	  //	  printf("curve found in physical line %d \n",p->Num);
 	  if (it !=lines.end())
 	    {	      
 	      double pinit [3] = {v1->Pos.X,v1->Pos.Y,v1->Pos.Z};
 	      double dir [3] = {v2->Pos.X-v1->Pos.X,v2->Pos.Y-v1->Pos.Y,v2->Pos.Z-v1->Pos.Z};
 	      Structural_BeamSection *section =  GetBeamSection (it->second.section);
-
 	      //	      printf ("%g,%g,%g\n",it->second.dirz[0],it->second.dirz[1],it->second.dirz[2]);
 
+	      const int nbArrow = 10;
+	      const double kk = (CTX.max[0]-CTX.min[0])*.1 / (MAX_FORCE);
+	      glColor4ubv((GLubyte *) & CTX.color.text);
+	      double X1,Y1,Z1,X2,Y2,Z2;
+	      for (int iArrow = 0 ; iArrow < nbArrow ; iArrow++)
+		{
+		  
+		  const double xi = (double)iArrow/(double)(nbArrow-1);
+		  const double X = v1->Pos.X + xi * ( v2->Pos.X - v1->Pos.X );
+		  const double Y = v1->Pos.Y + xi * ( v2->Pos.Y - v1->Pos.Y );
+		  const double Z = v1->Pos.Z + xi * ( v2->Pos.Z - v1->Pos.Z );
+		  double dv[3] = 
+		    {
+		      it->second.fx1 + xi* (it->second.fx2 - it->second.fx1), 
+		      it->second.fy1 + xi* (it->second.fy2 - it->second.fy1), 
+		      it->second.fz1 + xi* (it->second.fz2 - it->second.fz1) 
+		    };		  
+		  Draw_Vector (CTX.vector_type,  0, CTX.arrow_rel_head_radius, 
+			       CTX.arrow_rel_stem_length, 0.5*CTX.arrow_rel_stem_radius,
+			       X-dv[0]*kk, Y-dv[1]*kk, Z-dv[2]*kk,
+			       dv[0]*kk, dv[1]*kk, dv[2]*kk, CTX.geom.light);		  
+		  
+		  if (iArrow==0)
+		    {
+		      X1 =  X-dv[0]*kk;
+		      Y1 =  Y-dv[1]*kk;
+		      Z1 =  Z-dv[2]*kk;
+		    }
+		  if (iArrow==nbArrow-1)
+		    {
+		      X2 =  X-dv[0]*kk;
+		      Y2 =  Y-dv[1]*kk;
+		      Z2 =  Z-dv[2]*kk;
+		    }
+		}
+
+	      glBegin(GL_LINES);
+	      glVertex3d ( X1,Y1,Z1);
+	      glVertex3d ( X2,Y2,Z2);
+	      glEnd  ();
+	      
 	      if (section)
 		{
+		  //		  printf("section found\n");
 		  section -> GL_DrawBeam (pinit,dir,it->second.dirz,textures[it->second.material]);
 		  return true;
 		}
diff --git a/Plugin/StructuralSolver.h b/Plugin/StructuralSolver.h
index a78ef1c2033f581b84ae85720a3b251a9161b610..e947fac4a9b3287ba879732882d67f24cb8bdc92 100644
--- a/Plugin/StructuralSolver.h
+++ b/Plugin/StructuralSolver.h
@@ -81,7 +81,7 @@ struct PhysicalPointInfo
 struct PhysicalLineInfo 
 {
   PhysicalLineInfo() : fx1(0),fx2(0),fy1(0),fy2(0),fz1(0),fz2(0){dirz[0]=0;dirz[1]=0;dirz[2]=1;}
-  std::string material, section;
+  std::string material, section, model;
   double fx1,fx2,fy1,fy2,fz1,fz2;
   double dirz[3];
 };