diff --git a/Box/Main.cpp b/Box/Main.cpp
index 3db67abcdb3e72ab0fd6116ce20719dff49422be..895f25ae7f6f4d38d5eac2a8703528e4885dc84b 100644
--- a/Box/Main.cpp
+++ b/Box/Main.cpp
@@ -1,6 +1,6 @@
-// $Id: Main.cpp,v 1.51 2005-10-24 15:38:13 geuzaine Exp $
+// $Id: Main.cpp,v 1.52 2006-01-06 00:34:20 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Box/Makefile b/Box/Makefile
index 7ffdf3625bef82ee46fb1b307140d391b1d007f3..7d45dc5b1d6458862af1290b1eb9959d4e4d2305 100644
--- a/Box/Makefile
+++ b/Box/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.28 2005-06-07 21:12:44 geuzaine Exp $
+# $Id: Makefile,v 1.29 2006-01-06 00:34:20 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Common/AdaptiveViews.cpp b/Common/AdaptiveViews.cpp
index afb1cd8aefc739d868858adff4ee5385478b572a..1ffca99b8a2ffc848d3b0d5d17ed3142072d0ddb 100644
--- a/Common/AdaptiveViews.cpp
+++ b/Common/AdaptiveViews.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/AdaptiveViews.h b/Common/AdaptiveViews.h
index 8c76f88959cd9063adbbdf9f49ab206cf5392dff..29dee4923dde50f3291894a03050ef4df1c27e6d 100644
--- a/Common/AdaptiveViews.h
+++ b/Common/AdaptiveViews.h
@@ -1,7 +1,7 @@
 #ifndef _ADAPTIVE_VIEWS_H_
 #define _ADAPTIVE_VIEWS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/ColorTable.cpp b/Common/ColorTable.cpp
index 8bc3d9831f26cc6af6848911b2a0a53b0467a300..42dffae9487b5d2266972433d14f0cb5aac2875b 100644
--- a/Common/ColorTable.cpp
+++ b/Common/ColorTable.cpp
@@ -1,6 +1,6 @@
-// $Id: ColorTable.cpp,v 1.30 2005-12-22 20:42:41 geuzaine Exp $
+// $Id: ColorTable.cpp,v 1.31 2006-01-06 00:34:20 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/ColorTable.h b/Common/ColorTable.h
index 94dabc9f31af69573baf8980525f09ae050da7df..096057512a4e9c61a29de3df08bd1947fbc739f5 100644
--- a/Common/ColorTable.h
+++ b/Common/ColorTable.h
@@ -1,7 +1,7 @@
 #ifndef _COLORTABLE_H_
 #define _COLORTABLE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Colors.h b/Common/Colors.h
index ffee871b65b38dad3e1da1baf4babfbd1fbc9c03..701c565f3b08ad6eba3b35ed91c4b6b3a911b4ae 100644
--- a/Common/Colors.h
+++ b/Common/Colors.h
@@ -1,7 +1,7 @@
 #ifndef _COLORS_H_
 #define _COLORS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index cf23789aa74f36459ba657638a12fb98356e672a..2e542c188a87a9b2606a1a0de2d7de04e283eebe 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -1,6 +1,6 @@
-// $Id: CommandLine.cpp,v 1.66 2005-10-24 15:38:13 geuzaine Exp $
+// $Id: CommandLine.cpp,v 1.67 2006-01-06 00:34:20 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -45,7 +45,7 @@ extern Context_T CTX;
 extern Mesh *THEM;
 
 char gmsh_progname[]  = "Gmsh, a 3D mesh generator with pre- and post-processing facilities" ;
-char gmsh_copyright[] = "Copyright (C) 1997-2005 Christophe Geuzaine and Jean-Francois Remacle";
+char gmsh_copyright[] = "Copyright (C) 1997-2006 Christophe Geuzaine and Jean-Francois Remacle";
 char gmsh_version[]   = "Version        : " ;
 char gmsh_license[]   = "License        : " GMSH_SHORT_LICENSE;
 char gmsh_gui[]       = "GUI toolkit    : " ;
diff --git a/Common/CommandLine.h b/Common/CommandLine.h
index cf255086994888490ca6d098b6913d8ac11055ec..129f59cc690cc014c2b8a85853e9725067196e24 100644
--- a/Common/CommandLine.h
+++ b/Common/CommandLine.h
@@ -1,7 +1,7 @@
 #ifndef _COMMAND_LINE_H_
 #define _COMMAND_LINE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Context.cpp b/Common/Context.cpp
index 0b2e1f69880c267d558ca8297f036b996791ef94..38bf1ac53bdbb2bfb7f4370af52e8f7b4982838c 100644
--- a/Common/Context.cpp
+++ b/Common/Context.cpp
@@ -1,6 +1,6 @@
-// $Id: Context.cpp,v 1.56 2005-12-08 20:35:34 geuzaine Exp $
+// $Id: Context.cpp,v 1.57 2006-01-06 00:34:20 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Context.h b/Common/Context.h
index a040095a6e652f4704e4e2e36cee6e742dd5d099..f9eaca9e0dc9bc83193426b4bbcb4fad59f57e03 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -1,7 +1,7 @@
 #ifndef _CONTEXT_H_
 #define _CONTEXT_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@
 class Context_T {
 
 public :
-  int big_endian;             // is the machine big-endian?
+
 
   // general options
   char filename[256];         // the name of the currently opened file
@@ -135,6 +135,8 @@ public :
 
   int forced_bbox; // dynamic variable tracking if the bbox is currently imposed
 
+  int enable_mouse_selection; // enable selection using the mouse
+
   // geometry options 
   struct{
     int vis_type;
@@ -148,6 +150,7 @@ public :
     double normals, tangents;
     double scaling_factor;
     int auto_coherence;
+    double snap[3];
   } geom;
 
   // mesh options 
@@ -243,6 +246,8 @@ public :
   void setQuaternionFromEulerAngles(void);
   void setEulerAnglesFromRotationMatrix(void);
 
+  int big_endian; // is the machine big-endian?
+
   // how RGBA values are packed and unpacked into/from an unsigned
   // integer to be fed to glColor4ubv (depends on machine byte
   // ordering!):
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 761146b26a91e5450d57097fe913f083f8e03626..0011a293c147b4a49b3379a3ca1495c25f8ca161 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1,7 +1,7 @@
 #ifndef _DEFAULT_OPTIONS_H_
 #define _DEFAULT_OPTIONS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -118,7 +118,7 @@ StringXString SolverOptions_String[] = {
     "Name of solver 0" },
   { F|O, "Help0" , opt_solver_help0 , 
     "A General environment for the treatment of\nDiscrete Problems\n\n"
-    "Copyright (C) 1997-2005\nPatrick Dular and Christophe Geuzaine\n\n"
+    "Copyright (C) 1997-2006\nPatrick Dular and Christophe Geuzaine\n\n"
     "Visit http://www.geuz.org/getdp/ for more info",
     "Help string for solver 0" },
   { F|O, "Executable0" , opt_solver_executable0 , 
@@ -808,6 +808,12 @@ StringXNumber GeometryOptions_Number[] = {
 
   { F|O, "ScalingFactor" , opt_geometry_scaling_factor , 1.0 , 
     "Global geometry scaling factor" },
+  { F|O, "SnapX" , opt_geometry_snap0 , 0.1 ,
+    "Snapping grid spacing along the X-axis" },
+  { F|O, "SnapY" , opt_geometry_snap1 , 0.1 ,
+    "Snapping grid spacing along the Y-axis" },
+  { F|O, "SnapZ" , opt_geometry_snap2 , 0.1 ,
+    "Snapping grid spacing along the Z-axis" },
   { F|O, "Surfaces" , opt_geometry_surfaces , 0. , 
     "Display geometry surfaces?" },
   { F|O, "SurfaceNumbers" , opt_geometry_surfaces_num , 0. , 
@@ -879,7 +885,7 @@ StringXNumber MeshOptions_Number[] = {
     "Show the construction of 2D anisotropic mesh in real time" },
 
   { F|O, "LabelType" , opt_mesh_label_type , 0. , 
-    "Type of element label (0=element number, 1=elementary entity number, 2=physical entity number, 3=partition number)" },
+    "Type of element label (0=element number, 1=elementary entity number, 2=physical entity number, 3=partition number, 4=coordinates)" },
   { F|O, "Light" , opt_mesh_light , 0. , 
     "Enable lighting for the mesh" },
   { F|O, "LightLines" , opt_mesh_light_lines , 1. , 
@@ -1398,16 +1404,16 @@ StringXColor GeometryOptions_Color[] = {
     {128, 128, 128, 255}, {128, 128, 128, 255}, {0, 0, 0, 255},
     "Normal geometry volume color" },
   { F|O, "PointsSelect" , opt_geometry_color_points_select ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
     "Selected geometry point color" },
   { F|O, "LinesSelect" , opt_geometry_color_lines_select ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
     "Selected geometry curve color" },
   { F|O, "SurfacesSelect" , opt_geometry_color_surfaces_select ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
     "Selected geometry surface color" },
   { F|O, "VolumesSelect" , opt_geometry_color_volumes_select ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
     "Selected geometry volume color" },
   { F|O, "Tangents" , opt_geometry_color_tangents ,
     {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255},
diff --git a/Common/Gmsh.h b/Common/Gmsh.h
index dd14dfb2b2702bc0459cf099fbce85870044e36d..799c2ca46b4157653444181e5a2435656e63aa69 100644
--- a/Common/Gmsh.h
+++ b/Common/Gmsh.h
@@ -1,7 +1,7 @@
 #ifndef _GMSH_H_
 #define _GMSH_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/GmshUI.h b/Common/GmshUI.h
index b20d4c46a6175329e32e8c58fe82663ad84605e2..a7d371bfff06816c9f7012a696f1e060e6e7f1d2 100644
--- a/Common/GmshUI.h
+++ b/Common/GmshUI.h
@@ -1,7 +1,7 @@
 #ifndef _GMSH_UI_H_
 #define _GMSH_UI_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/License.cpp b/Common/License.cpp
index fd8535c4d83f8dfb1c9dffe067cb2220f197ca94..6778ef76e9cd3f0cde70fdb64b53d165a9f7849e 100644
--- a/Common/License.cpp
+++ b/Common/License.cpp
@@ -1,6 +1,6 @@
-// $Id: License.cpp,v 1.5 2005-01-01 19:35:27 geuzaine Exp $
+// $Id: License.cpp,v 1.6 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Makefile b/Common/Makefile
index 37817b14bb046a16089b75175b5fa8f114febe82..764793ac99fa2733dc7a2f7712e21d43f82fb6ac 100644
--- a/Common/Makefile
+++ b/Common/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.78 2005-12-19 02:35:03 geuzaine Exp $
+# $Id: Makefile,v 1.79 2006-01-06 00:34:21 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Common/Message.h b/Common/Message.h
index 1055815a16f44fd4c59b310391bfdb053804c546..3b440a4c4da8ab6799df3a3e765da4b9374e3813 100644
--- a/Common/Message.h
+++ b/Common/Message.h
@@ -1,7 +1,7 @@
 #ifndef _MESSAGE_H_
 #define _MESSAGE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 8bf4d3b4e643881aee5adbee7f1a2155659c6c24..ccbdf0998307608ea96fed96f607ceb5bb63d928 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,6 +1,6 @@
-// $Id: Options.cpp,v 1.269 2005-12-22 20:42:41 geuzaine Exp $
+// $Id: Options.cpp,v 1.270 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -158,6 +158,7 @@ void Init_Options(int num)
 #endif
   CTX.solver.listen = 0;
   CTX.forced_bbox = 0;
+  CTX.enable_mouse_selection = 1;
 }
 
 void ReInit_Options(int num)
@@ -214,7 +215,7 @@ void Print_OptionCategory(int level, int diff, char *cat, FILE * file)
   }
 }
 
-void Print_Options(int num, int level, int diff, char *filename)
+void Print_Options(int num, int level, int diff, int help, char *filename)
 {
   FILE *file;
   char tmp[256];
@@ -256,72 +257,72 @@ void Print_Options(int num, int level, int diff, char *filename)
   }
 
   Print_OptionCategory(level, diff, "General options (strings)", file);
-  Print_StringOptions(num, level, diff, GeneralOptions_String, "General.", file);
+  Print_StringOptions(num, level, diff, help, GeneralOptions_String, "General.", file);
   Print_OptionCategory(level, diff, "General options (numbers)", file);
-  Print_NumberOptions(num, level, diff, GeneralOptions_Number, "General.", file);
+  Print_NumberOptions(num, level, diff, help, GeneralOptions_Number, "General.", file);
   Print_OptionCategory(level, diff, "General options (colors)", file);
-  Print_ColorOptions(num, level, diff, GeneralOptions_Color, "General.", file);
+  Print_ColorOptions(num, level, diff, help, GeneralOptions_Color, "General.", file);
 
   Print_OptionCategory(level, diff, "Geometry options (strings)", file);
-  Print_StringOptions(num, level, diff, GeometryOptions_String, "Geometry.", file);
+  Print_StringOptions(num, level, diff, help, GeometryOptions_String, "Geometry.", file);
   Print_OptionCategory(level, diff, "Geometry options (numbers)", file);
-  Print_NumberOptions(num, level, diff, GeometryOptions_Number, "Geometry.", file);
+  Print_NumberOptions(num, level, diff, help, GeometryOptions_Number, "Geometry.", file);
   Print_OptionCategory(level, diff, "Geometry options (colors)", file);
-  Print_ColorOptions(num, level, diff, GeometryOptions_Color, "Geometry.", file);
+  Print_ColorOptions(num, level, diff, help, GeometryOptions_Color, "Geometry.", file);
 
   Print_OptionCategory(level, diff, "Mesh options (strings)", file);
-  Print_StringOptions(num, level, diff, MeshOptions_String, "Mesh.", file);
+  Print_StringOptions(num, level, diff, help, MeshOptions_String, "Mesh.", file);
   Print_OptionCategory(level, diff, "Mesh options (numbers)", file);
-  Print_NumberOptions(num, level, diff, MeshOptions_Number, "Mesh.", file);
+  Print_NumberOptions(num, level, diff, help, MeshOptions_Number, "Mesh.", file);
   Print_OptionCategory(level, diff, "Mesh options (colors)", file);
-  Print_ColorOptions(num, level, diff, MeshOptions_Color, "Mesh.", file);
+  Print_ColorOptions(num, level, diff, help, MeshOptions_Color, "Mesh.", file);
 
   Print_OptionCategory(level, diff, "Solver options (strings)", file);
-  Print_StringOptions(num, level, diff, SolverOptions_String, "Solver.", file);
+  Print_StringOptions(num, level, diff, help, SolverOptions_String, "Solver.", file);
   Print_OptionCategory(level, diff, "Solver options (numbers)", file);
-  Print_NumberOptions(num, level, diff, SolverOptions_Number, "Solver.", file);
+  Print_NumberOptions(num, level, diff, help, SolverOptions_Number, "Solver.", file);
   Print_OptionCategory(level, diff, "Solver options (colors)", file);
-  Print_ColorOptions(num, level, diff, SolverOptions_Color, "Solver.", file);
+  Print_ColorOptions(num, level, diff, help, SolverOptions_Color, "Solver.", file);
 
   Print_OptionCategory(level, diff, "Post-processing options (strings)", file);
-  Print_StringOptions(num, level, diff, PostProcessingOptions_String,
+  Print_StringOptions(num, level, diff, help, PostProcessingOptions_String,
                       "PostProcessing.", file);
   Print_OptionCategory(level, diff, "Post-processing options (numbers)", file);
-  Print_NumberOptions(num, level, diff, PostProcessingOptions_Number,
+  Print_NumberOptions(num, level, diff, help, PostProcessingOptions_Number,
                       "PostProcessing.", file);
   Print_OptionCategory(level, diff, "Post-processing options (colors)", file);
-  Print_ColorOptions(num, level, diff, PostProcessingOptions_Color,
+  Print_ColorOptions(num, level, diff, help, PostProcessingOptions_Color,
                      "PostProcessing.", file);
 
   if(level & GMSH_FULLRC) {
     for(i = 0; i < List_Nbr(CTX.post.list); i++) {
       sprintf(tmp, "View[%d].", i);
       Print_OptionCategory(level, diff, "View options (strings)", file);
-      Print_StringOptions(i, level, diff, ViewOptions_String, tmp, file);
+      Print_StringOptions(i, level, diff, help, ViewOptions_String, tmp, file);
       Print_OptionCategory(level, diff, "View options (numbers)", file);
-      Print_NumberOptions(i, level, diff, ViewOptions_Number, tmp, file);
+      Print_NumberOptions(i, level, diff, help, ViewOptions_Number, tmp, file);
       Print_OptionCategory(level, diff, "View options (colors)", file);
-      Print_ColorOptions(i, level, diff, ViewOptions_Color, tmp, file);
+      Print_ColorOptions(i, level, diff, help, ViewOptions_Color, tmp, file);
       strcat(tmp, "ColorTable");
       Print_ColorTable(i, diff, tmp, file);
     }
   }
   else if(level & GMSH_OPTIONSRC) {
     Print_OptionCategory(level, diff, "View options (strings)", file);
-    Print_StringOptions(num, level, diff, ViewOptions_String, "View.", file);
+    Print_StringOptions(num, level, diff, help, ViewOptions_String, "View.", file);
     Print_OptionCategory(level, diff, "View options (numbers)", file);
-    Print_NumberOptions(num, level, diff, ViewOptions_Number, "View.", file);
+    Print_NumberOptions(num, level, diff, help, ViewOptions_Number, "View.", file);
     Print_OptionCategory(level, diff, "View options (colors)", file);
-    Print_ColorOptions(num, level, diff, ViewOptions_Color, "View.", file);
+    Print_ColorOptions(num, level, diff, help, ViewOptions_Color, "View.", file);
     Print_ColorTable(num, diff, "View.ColorTable", file);
   }
 
   Print_OptionCategory(level, diff, "Print options (strings)", file);
-  Print_StringOptions(num, level, diff, PrintOptions_String, "Print.", file);
+  Print_StringOptions(num, level, diff, help, PrintOptions_String, "Print.", file);
   Print_OptionCategory(level, diff, "Print options (numbers)", file);
-  Print_NumberOptions(num, level, diff, PrintOptions_Number, "Print.", file);
+  Print_NumberOptions(num, level, diff, help, PrintOptions_Number, "Print.", file);
   Print_OptionCategory(level, diff, "Print options (colors)", file);
-  Print_ColorOptions(num, level, diff, PrintOptions_Color, "Print.", file);
+  Print_ColorOptions(num, level, diff, help, PrintOptions_Color, "Print.", file);
 
   if(filename) {
     Msg(INFO, "Wrote option file '%s'", filename);
@@ -537,16 +538,17 @@ void *Get_StringOption(char *str, StringXString s[])
     return (void *)s[i].function;
 }
 
-void Print_StringOptions(int num, int level, int diff, StringXString s[], 
-			 char *prefix, FILE * file)
+void Print_StringOptions(int num, int level, int diff, int help, 
+			 StringXString s[], char *prefix, FILE * file)
 {
   int i = 0;
   char tmp[1024];
   while(s[i].str) {
     if(s[i].level & level) {
       if(!diff || strcmp(s[i].function(num, GMSH_GET, NULL), s[i].def)){
-	sprintf(tmp, "%s%s = \"%s\"; // %s", prefix,
-		s[i].str, s[i].function(num, GMSH_GET, NULL), s[i].help);
+	sprintf(tmp, "%s%s = \"%s\";%s%s", prefix,
+		s[i].str, s[i].function(num, GMSH_GET, NULL), 
+		help ? " // " : "", help ? s[i].help : "");
 	if(file)
 	  fprintf(file, "%s\n", tmp);
 	else
@@ -638,16 +640,17 @@ void *Get_NumberOption(char *str, StringXNumber s[])
   }
 }
 
-void Print_NumberOptions(int num, int level, int diff, StringXNumber s[], 
-			 char *prefix, FILE * file)
+void Print_NumberOptions(int num, int level, int diff, int help,
+			 StringXNumber s[], char *prefix, FILE * file)
 {
   int i = 0;
   char tmp[1024];
   while(s[i].str) {
     if(s[i].level & level) {
       if(!diff || (s[i].function(num, GMSH_GET, 0) != s[i].def)){
-	sprintf(tmp, "%s%s = %.16g; // %s", prefix,
-		s[i].str, s[i].function(num, GMSH_GET, 0), s[i].help);
+	sprintf(tmp, "%s%s = %.16g;%s%s", prefix,
+		s[i].str, s[i].function(num, GMSH_GET, 0), 
+		help ? " // " : "", help ? s[i].help : "");
 	if(file)
 	  fprintf(file, "%s\n", tmp);
 	else
@@ -741,8 +744,8 @@ void *Get_ColorOption(char *str, StringXColor s[])
     return (void *)s[i].function;
 }
 
-void Print_ColorOptions(int num, int level, int diff, StringXColor s[], 
-			char *prefix, FILE * file)
+void Print_ColorOptions(int num, int level, int diff, int help,
+			StringXColor s[], char *prefix, FILE * file)
 {
   int i = 0;
   char tmp[1024];
@@ -764,11 +767,12 @@ void Print_ColorOptions(int num, int level, int diff, StringXColor s[],
 	break;
       }
       if(!diff || (s[i].function(num, GMSH_GET, 0) != def)){
-	sprintf(tmp, "%sColor.%s = {%d,%d,%d}; // %s",
+	sprintf(tmp, "%sColor.%s = {%d,%d,%d};%s%s",
 		prefix, s[i].str,
 		CTX.UNPACK_RED(s[i].function(num, GMSH_GET, 0)),
 		CTX.UNPACK_GREEN(s[i].function(num, GMSH_GET, 0)),
-		CTX.UNPACK_BLUE(s[i].function(num, GMSH_GET, 0)), s[i].help);
+		CTX.UNPACK_BLUE(s[i].function(num, GMSH_GET, 0)), 
+		help ? " // " : "", help ? s[i].help : "");
 	if(file)
 	  fprintf(file, "%s\n", tmp);
 	else
@@ -3964,6 +3968,39 @@ double opt_geometry_scaling_factor(OPT_ARGS_NUM)
   return CTX.geom.scaling_factor;
 }
 
+double opt_geometry_snap0(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX.geom.snap[0] = val;
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI))
+    WID->context_geometry_value[0]->value(CTX.geom.snap[0]);
+#endif
+  return CTX.geom.snap[0];
+}
+
+double opt_geometry_snap1(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX.geom.snap[1] = val;
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI))
+    WID->context_geometry_value[1]->value(CTX.geom.snap[1]);
+#endif
+  return CTX.geom.snap[1];
+}
+
+double opt_geometry_snap2(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX.geom.snap[2] = val;
+#if defined(HAVE_FLTK)
+  if(WID && (action & GMSH_GUI))
+    WID->context_geometry_value[2]->value(CTX.geom.snap[2]);
+#endif
+  return CTX.geom.snap[2];
+}
+
 double opt_mesh_optimize(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
@@ -4124,7 +4161,7 @@ double opt_mesh_label_type(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
     CTX.mesh.label_type = (int)val;
-    if(CTX.mesh.label_type < 0 || CTX.mesh.label_type > 3)
+    if(CTX.mesh.label_type < 0 || CTX.mesh.label_type > 4)
       CTX.mesh.label_type = 0;
   }
 #if defined(HAVE_FLTK)
diff --git a/Common/Options.h b/Common/Options.h
index 9c482a1287903d46c0f9f16cbd227259cc34cd58..4b46d1bb3f56129dcc2920af513327e219d77062 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -1,7 +1,7 @@
 #ifndef _OPTIONS_H_
 #define _OPTIONS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -402,6 +402,9 @@ double opt_geometry_circle_points(OPT_ARGS_NUM);
 double opt_geometry_circle_warning(OPT_ARGS_NUM);
 double opt_geometry_extrude_spline_points(OPT_ARGS_NUM);
 double opt_geometry_scaling_factor(OPT_ARGS_NUM);
+double opt_geometry_snap0(OPT_ARGS_NUM);
+double opt_geometry_snap1(OPT_ARGS_NUM);
+double opt_geometry_snap2(OPT_ARGS_NUM);
 double opt_mesh_optimize(OPT_ARGS_NUM);
 double opt_mesh_quality(OPT_ARGS_NUM);
 double opt_mesh_normals(OPT_ARGS_NUM);
@@ -725,10 +728,10 @@ typedef struct {
   char *help ;
 } StringXColor ;
 
-void Init_Options (int num);
-void Init_Options_GUI (int num);
-void ReInit_Options (int num);
-void Print_Options(int num, int level, int diff, char *filename);
+void Init_Options(int num);
+void Init_Options_GUI(int num);
+void ReInit_Options(int num);
+void Print_Options(int num, int level, int diff, int help, char *filename);
 void Print_OptionsDoc();
 
 StringXString * Get_StringOptionCategory(char * cat);
@@ -747,12 +750,12 @@ void * Get_StringOption(char *str, StringXString s[]);
 void * Get_NumberOption(char *str, StringXNumber s[]);
 void * Get_ColorOption(char *str, StringXColor s[]);
 
-void Print_StringOptions(int num, int level, int diff, StringXString s[], 
-			 char *prefix, FILE *file);
-void Print_NumberOptions(int num, int level, int diff, StringXNumber s[], 
-			 char *prefix, FILE *file);
-void Print_ColorOptions(int num, int level, int diff, StringXColor s[], 
-			char *prefix, FILE *file);
+void Print_StringOptions(int num, int level, int diff, int help,
+			 StringXString s[], char *prefix, FILE *file);
+void Print_NumberOptions(int num, int level, int diff, int help,
+			 StringXNumber s[], char *prefix, FILE *file);
+void Print_ColorOptions(int num, int level, int diff, int help,
+			StringXColor s[], char *prefix, FILE *file);
 
 void Print_StringOptionsDoc(StringXString s[], char *prefix, FILE * file);
 void Print_NumberOptionsDoc(StringXNumber s[], char *prefix, FILE * file);
diff --git a/Common/SmoothNormals.cpp b/Common/SmoothNormals.cpp
index 043e7a5fd6a5cdfba1c3a19bc7cd5c3d97acd678..c6fbb1a49e75bcedd556cc2f03263ed5d5eff9b3 100644
--- a/Common/SmoothNormals.cpp
+++ b/Common/SmoothNormals.cpp
@@ -1,6 +1,6 @@
-// $Id: SmoothNormals.cpp,v 1.3 2005-01-01 19:35:27 geuzaine Exp $
+// $Id: SmoothNormals.cpp,v 1.4 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/SmoothNormals.h b/Common/SmoothNormals.h
index bad67f0bfca7c0b791a217bc2c18843b9b7234f7..4418e52236f438b0300943adaad0884c3510dc0d 100644
--- a/Common/SmoothNormals.h
+++ b/Common/SmoothNormals.h
@@ -1,7 +1,7 @@
 #ifndef _SMOOTH_NORMALS_H_
 #define _SMOOTH_NORMALS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Timer.cpp b/Common/Timer.cpp
index 1bef406c9c69355d9e5cef04a4398882ee0b9d44..9affa3423a54e3699fac787eee88751275bf802f 100644
--- a/Common/Timer.cpp
+++ b/Common/Timer.cpp
@@ -1,6 +1,6 @@
-// $Id: Timer.cpp,v 1.15 2005-08-31 21:44:44 geuzaine Exp $
+// $Id: Timer.cpp,v 1.16 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Timer.h b/Common/Timer.h
index 91fa66410f68528d253f03f6ad3866dfd0b01de6..4970006ebb57b9622cccb8934d4594e54920b0a0 100644
--- a/Common/Timer.h
+++ b/Common/Timer.h
@@ -1,7 +1,7 @@
 #ifndef _TIMER_H_
 #define _TIMER_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/VertexArray.cpp b/Common/VertexArray.cpp
index 7fd207970739644768eb6ba1170b6ac1349db751..7acb2399806bb39ff55750ac4b371fec17021a4b 100644
--- a/Common/VertexArray.cpp
+++ b/Common/VertexArray.cpp
@@ -1,6 +1,6 @@
-// $Id: VertexArray.cpp,v 1.9 2005-12-22 20:42:41 geuzaine Exp $
+// $Id: VertexArray.cpp,v 1.10 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/VertexArray.h b/Common/VertexArray.h
index 2d31f67ed3b4643caecbd96382c9bffd70f8e310..7ee16f1748081a9379ec2ea4158ced9f9a26abd2 100644
--- a/Common/VertexArray.h
+++ b/Common/VertexArray.h
@@ -1,7 +1,7 @@
 #ifndef _VERTEX_ARRAY_H_
 #define _VERTEX_ARRAY_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Views.cpp b/Common/Views.cpp
index db37e25dcde40cf48325ba7b5e2fac24941b0a23..6aae3f70b901a74a84d4750887cd183db45ab965 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,6 +1,6 @@
-// $Id: Views.cpp,v 1.179 2005-11-24 19:59:00 geuzaine Exp $
+// $Id: Views.cpp,v 1.180 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Views.h b/Common/Views.h
index 8428f4946c93051be261116ef04d1caeb796ed0c..857fd2ff590de7d5a46a08c16124b80538ed89cf 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -1,7 +1,7 @@
 #ifndef _VIEWS_H_
 #define _VIEWS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Visibility.cpp b/Common/Visibility.cpp
index 46a93d88ee6c334f0f5c64ea63f625e22d0715b9..1fd3ad5d5a86a2b26f72fec5014ff8aa7a008697 100644
--- a/Common/Visibility.cpp
+++ b/Common/Visibility.cpp
@@ -1,6 +1,6 @@
-// $Id: Visibility.cpp,v 1.11 2005-01-01 19:35:27 geuzaine Exp $
+// $Id: Visibility.cpp,v 1.12 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Common/Visibility.h b/Common/Visibility.h
index 00182b4109d447ad7d3674d221640c5006b8e84c..91504bd174b0a1733050e3bce4dc1c53f3ab5b1b 100644
--- a/Common/Visibility.h
+++ b/Common/Visibility.h
@@ -1,7 +1,7 @@
 #ifndef _VISIBILITY_H_
 #define _VISIBILITY_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/List.cpp b/DataStr/List.cpp
index d15f081d331e833e71c4c8eb82d21da96ce76c25..ad5c4e4e8ab7d87da6794620abb602447997e0a1 100644
--- a/DataStr/List.cpp
+++ b/DataStr/List.cpp
@@ -1,6 +1,6 @@
-// $Id: List.cpp,v 1.36 2005-04-06 19:09:10 geuzaine Exp $
+// $Id: List.cpp,v 1.37 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/List.h b/DataStr/List.h
index cf44adb2d2182aacde7770393cf741aba612554f..03a2703e401add8b1d216e7bf889e0ce56510426 100644
--- a/DataStr/List.h
+++ b/DataStr/List.h
@@ -1,7 +1,7 @@
 #ifndef _LIST_H_
 #define _LIST_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Makefile b/DataStr/Makefile
index 34c465bde24eab5b9c85c3da52a79a34fa4ec7ef..cc068dacd2d9686d4ba5dbbe2fce2b37546268ec 100644
--- a/DataStr/Makefile
+++ b/DataStr/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.28 2005-12-19 02:35:03 geuzaine Exp $
+# $Id: Makefile,v 1.29 2006-01-06 00:34:21 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Malloc.cpp b/DataStr/Malloc.cpp
index c075658c13531a4cd60ebf39b37eaf1841d99437..5262b3048fa8e4107ae54c260660ca62a52d7e47 100644
--- a/DataStr/Malloc.cpp
+++ b/DataStr/Malloc.cpp
@@ -1,6 +1,6 @@
-// $Id: Malloc.cpp,v 1.18 2005-01-01 19:35:27 geuzaine Exp $
+// $Id: Malloc.cpp,v 1.19 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Malloc.h b/DataStr/Malloc.h
index 06b7bca560a46effdeda0eea73e5da15db655cfb..2c0ca21eb5f315519f07a21c96264a86a16f22b1 100644
--- a/DataStr/Malloc.h
+++ b/DataStr/Malloc.h
@@ -1,7 +1,7 @@
 #ifndef _MALLOC_H_
 #define _MALLOC_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/SafeIO.cpp b/DataStr/SafeIO.cpp
index ffe92cd866aa7ec9fb39fefc714e276e1653cb10..e5f2efadc25c94a1bf541f034277687e17f70cf1 100644
--- a/DataStr/SafeIO.cpp
+++ b/DataStr/SafeIO.cpp
@@ -1,6 +1,6 @@
-// $Id: SafeIO.cpp,v 1.5 2005-01-01 19:35:27 geuzaine Exp $
+// $Id: SafeIO.cpp,v 1.6 2006-01-06 00:34:21 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/SafeIO.h b/DataStr/SafeIO.h
index 5c2df11a5fe7c34df4270435063f6f1c46aa3e7c..75739abacf43874e39142cd534addd687ffd7ee0 100644
--- a/DataStr/SafeIO.h
+++ b/DataStr/SafeIO.h
@@ -1,6 +1,6 @@
 #ifndef _SAFE_IO_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Tools.cpp b/DataStr/Tools.cpp
index 00c06ccb9c4a0de73d783c68bc13f9214b314ece..20181e57f6ed6d00caa9199aee5b06a686fcdf77 100644
--- a/DataStr/Tools.cpp
+++ b/DataStr/Tools.cpp
@@ -1,6 +1,6 @@
-// $Id: Tools.cpp,v 1.14 2005-05-27 19:35:06 geuzaine Exp $
+// $Id: Tools.cpp,v 1.15 2006-01-06 00:34:22 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Tools.h b/DataStr/Tools.h
index 155721114e22d19e51a6c6f618f4e6629321e45b..24f1a416b8491370fd0200044b1b69f22dd39330 100644
--- a/DataStr/Tools.h
+++ b/DataStr/Tools.h
@@ -1,7 +1,7 @@
 #ifndef _TOOLS_H_
 #define _TOOLS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Tree.cpp b/DataStr/Tree.cpp
index 3fee24ac591049693bc8e060c456532c2dac91d2..84babdfaf7cd5fad90b958f7e83c3665cd5b5607 100644
--- a/DataStr/Tree.cpp
+++ b/DataStr/Tree.cpp
@@ -1,6 +1,6 @@
-// $Id: Tree.cpp,v 1.19 2005-01-01 19:35:27 geuzaine Exp $
+// $Id: Tree.cpp,v 1.20 2006-01-06 00:34:22 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/DataStr/Tree.h b/DataStr/Tree.h
index 99d3751bdec4656bd2eb82437f22a79731b98c9a..407d02b9e4f32889790776b67e438a07bb7d34c4 100644
--- a/DataStr/Tree.h
+++ b/DataStr/Tree.h
@@ -1,7 +1,7 @@
 #ifndef _TREE_H_
 #define _TREE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Bitmaps.h b/Fltk/Bitmaps.h
index ec615af45b768eb21774d45d8272ad00f2e169a8..5d73aabd597fca91ee2ffcd7e344776b59bc5edb 100644
--- a/Fltk/Bitmaps.h
+++ b/Fltk/Bitmaps.h
@@ -1,7 +1,7 @@
 #ifndef _BITMAPS_H_
 #define _BITMAPS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index e67b477e0e9089dd8d8959df4bfd46a61b05442d..8168a3d7e4889266cb017181c267e4d26d65c4ec 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,6 +1,6 @@
-// $Id: Callbacks.cpp,v 1.389 2005-12-22 20:42:41 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.390 2006-01-06 00:34:22 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <signal.h>
+#include <time.h>
 #include <map>
 
 #include "BDS.h"
@@ -460,9 +461,23 @@ void status_xyz1p_cb(CALLBACK_ARGS)
     Draw();
   }
   else if(!strcmp(str, "?")){ // display options
-    Print_Options(0, GMSH_FULLRC, false, NULL);
+    Print_Options(0, GMSH_FULLRC, 0, 1, NULL);
     WID->create_message_window();
   }
+  else if(!strcmp(str, "S")){ // mouse selection
+    if(CTX.enable_mouse_selection){
+      CTX.enable_mouse_selection = 0;
+      Msg(STATUS1N, "Mouse selection OFF");
+      WID->g_status_butt[9]->color(FL_RED);
+      WID->g_opengl_window->cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
+    }
+    else{
+      CTX.enable_mouse_selection = 1;
+      Msg(STATUS1N, "Mouse selection ON");
+      WID->g_status_butt[9]->color(FL_BACKGROUND_COLOR);
+    }
+    WID->g_status_butt[9]->redraw();
+  }
   WID->update_manip_window();
 }
 
@@ -552,14 +567,14 @@ void file_new_cb(CALLBACK_ARGS)
       else
 	goto test;
     }
-    // create a zero length file so that it actually exists (and stupid
-    // Mac/Windows editors accept to deal with it)
     FILE *fp = fopen(name, "w");
     if(!fp){
       Msg(GERROR, "Unable to open file '%s'", name);
       return;
     }
-    fprintf(fp, "");
+    time_t now;
+    time(&now);
+    fprintf(fp, "// Gmsh project created on %s", ctime(&now));
     fclose(fp);
     OpenProblem(name);
     Draw();
@@ -872,7 +887,7 @@ void options_browser_cb(CALLBACK_ARGS)
 
 void options_save_cb(CALLBACK_ARGS)
 {
-  Print_Options(0, GMSH_OPTIONSRC, true, CTX.options_filename_fullpath);
+  Print_Options(0, GMSH_OPTIONSRC, 1, 1, CTX.options_filename_fullpath);
 }
 
 void options_restore_defaults_cb(CALLBACK_ARGS)
@@ -913,16 +928,17 @@ void general_options_color_scheme_cb(CALLBACK_ARGS)
 
 void general_options_rotation_center_select_cb(CALLBACK_ARGS)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   Draw();
 
   Msg(STATUS3N, "Setting rotation center");
   Msg(ONSCREEN, "Select point\n[Press 'q' to abort]");
-  char ib = SelectEntity(ENT_POINT, &v, &c, &s);
+  char ib = SelectEntity(ENT_POINT, &ne, v, c, s);
   if(ib == 'l') {
     // This would bypass the "Apply" button... Not necessarily bad,
     // but it's not consistent with the rest of the GUI.
@@ -931,9 +947,9 @@ void general_options_rotation_center_select_cb(CALLBACK_ARGS)
     //opt_general_rotation_center2(0, GMSH_SET|GMSH_GUI, v->Pos.Z);
 
     // This is more conform to the way we do things elsewhere:
-    WID->gen_value[8]->value(v->Pos.X);
-    WID->gen_value[9]->value(v->Pos.Y);
-    WID->gen_value[10]->value(v->Pos.Z);
+    WID->gen_value[8]->value(v[0]->Pos.X);
+    WID->gen_value[9]->value(v[0]->Pos.Y);
+    WID->gen_value[10]->value(v[0]->Pos.Z);
   }
   ZeroHighlight(THEM);
   Draw();
@@ -953,7 +969,7 @@ void general_options_ok_cb(CALLBACK_ARGS)
   double sessionrc = opt_general_session_save(0, GMSH_GET, 0);
   opt_general_session_save(0, GMSH_SET, WID->gen_butt[8]->value());
   if(sessionrc && !opt_general_session_save(0, GMSH_GET, 0))
-    Print_Options(0, GMSH_SESSIONRC, true, CTX.session_filename_fullpath);
+    Print_Options(0, GMSH_SESSIONRC, 1, 1, CTX.session_filename_fullpath);
   opt_general_options_save(0, GMSH_SET, WID->gen_butt[9]->value());
   opt_general_tooltips(0, GMSH_SET, WID->gen_butt[13]->value());
   opt_general_confirm_overwrite(0, GMSH_SET, WID->gen_butt[14]->value());
@@ -1300,14 +1316,12 @@ void message_save_cb(CALLBACK_ARGS)
   }
 }
 
-// Option Visibility Menu
+// Visibility Menu
 
 void select_vis_browser(int mode)
 {
-  int i;
-  Entity *e;
-  for(i = 1; i <= WID->vis_browser->size(); i++) {
-    e = (Entity *) WID->vis_browser->data(i);
+  for(int i = 1; i <= WID->vis_browser->size(); i++) {
+    Entity *e = (Entity *) WID->vis_browser->data(i);
     if((mode & VIS_GEOM) && (mode & VIS_MESH)){
       if((e->Visible() & VIS_GEOM) && (e->Visible() & VIS_MESH))
 	WID->vis_browser->select(i);
@@ -1325,13 +1339,10 @@ void select_vis_browser(int mode)
 
 void visibility_cb(CALLBACK_ARGS)
 {
-  int i, type, mode;
-  List_T *list;
-  Entity *e;
-
   WID->create_visibility_window();
   WID->vis_browser->clear();
 
+  int type;
   switch (WID->vis_type->value()) {
   case 0:
     type = ELEMENTARY;
@@ -1343,6 +1354,8 @@ void visibility_cb(CALLBACK_ARGS)
     type = PARTITION;
     break;
   }
+
+  int mode;
   switch (WID->vis_browser_mode->value()) {
   case 0:
     mode = VIS_GEOM | VIS_MESH;
@@ -1355,10 +1368,10 @@ void visibility_cb(CALLBACK_ARGS)
     break;
   }
 
-  list = GetVisibilityList(type);
+  List_T *list = GetVisibilityList(type);
 
-  for(i = 0; i < List_Nbr(list); i++) {
-    e = (Entity *) List_Pointer(list, i);
+  for(int i = 0; i < List_Nbr(list); i++) {
+    Entity *e = (Entity *) List_Pointer(list, i);
     WID->vis_browser->add(e->BrowserLine(), e);
   }
   select_vis_browser(mode);
@@ -1366,9 +1379,6 @@ void visibility_cb(CALLBACK_ARGS)
 
 void visibility_ok_cb(CALLBACK_ARGS)
 {
-  int i, mode;
-  Entity *e;
-
   InitVisibilityThroughPhysical();
 
   switch (WID->vis_type->value()) {
@@ -1382,6 +1392,8 @@ void visibility_ok_cb(CALLBACK_ARGS)
     // partitions: do nothing
     break;
   }
+
+  int mode;
   switch (WID->vis_browser_mode->value()) {
   case 0:
     mode = VIS_GEOM | VIS_MESH;
@@ -1396,8 +1408,8 @@ void visibility_ok_cb(CALLBACK_ARGS)
     break;
   }
 
-  for(i = 1; i <= WID->vis_browser->size(); i++) {
-    e = (Entity *) WID->vis_browser->data(i);
+  for(int i = 1; i <= WID->vis_browser->size(); i++) {
+    Entity *e = (Entity *) WID->vis_browser->data(i);
     if(WID->vis_browser->selected(i)) {
       e->Visible(e->Visible() | mode);
     }
@@ -1423,8 +1435,8 @@ void visibility_ok_cb(CALLBACK_ARGS)
   }
 
   if(WID->vis_butt[0]->value()) {
-    for(i = 1; i <= WID->vis_browser->size(); i++) {
-      e = (Entity *) WID->vis_browser->data(i);
+    for(int i = 1; i <= WID->vis_browser->size(); i++) {
+      Entity *e = (Entity *) WID->vis_browser->data(i);
       e->RecurVisible();
     }
     select_vis_browser(mode);
@@ -1435,7 +1447,7 @@ void visibility_ok_cb(CALLBACK_ARGS)
 
 void visibility_sort_cb(CALLBACK_ARGS)
 {
-  int selectall, val;
+  int val;
   char *str = (char*)data;
 
   if(!strcmp(str, "type"))
@@ -1444,11 +1456,13 @@ void visibility_sort_cb(CALLBACK_ARGS)
     val = 2;
   else if(!strcmp(str, "name"))
     val = 3;
+  else if(!strcmp(str, "-"))
+    val = -1;
   else
     val = 0;
 
-  if(!val) {
-    selectall = 0;
+  if(val == 0) { // (de)select everything
+    int selectall = 0;
     for(int i = 1; i <= WID->vis_browser->size(); i++)
       if(!WID->vis_browser->selected(i)) {
         selectall = 1;
@@ -1460,7 +1474,16 @@ void visibility_sort_cb(CALLBACK_ARGS)
     else
       WID->vis_browser->deselect();
   }
-  else {
+  else if(val == -1){ // invert the selection
+    int *state = new int[WID->vis_browser->size()];
+    for(int i = 1; i <= WID->vis_browser->size(); i++)
+      state[i-1] = WID->vis_browser->selected(i);
+    WID->vis_browser->deselect();
+    for(int i = 1; i <= WID->vis_browser->size(); i++)
+      if(!state[i-1]) WID->vis_browser->select(i);
+    delete [] state;
+  }
+  else { // sort
     SetVisibilitySort(val);
     visibility_cb(NULL, NULL);
   }
@@ -1468,7 +1491,7 @@ void visibility_sort_cb(CALLBACK_ARGS)
 
 void visibility_number_cb(CALLBACK_ARGS)
 {
-  int pos, mode, type = (int)(long)data;
+  int mode, type = (int)(long)data;
 
   if(type >= 100){ // show
     mode = VIS_GEOM | VIS_MESH;
@@ -1482,7 +1505,7 @@ void visibility_number_cb(CALLBACK_ARGS)
   
   char *str = (char *)WID->vis_input[type]->value();  
   SetVisibilityByNumber(str, type, mode);
-  pos = WID->vis_browser->position();
+  int pos = WID->vis_browser->position();
   visibility_cb(NULL, NULL);
   WID->vis_browser->position(pos);
 
@@ -1586,10 +1609,11 @@ void help_short_cb(CALLBACK_ARGS)
   Msg(DIRECT, " ");
   Msg(DIRECT, "  <             Go back to previous context");
   Msg(DIRECT, "  >             Go forward to next context");
-  Msg(DIRECT, "  0 or Esc      Reload project file");
+  Msg(DIRECT, "  0             Reload project file");
   Msg(DIRECT, "  1 or F1       Mesh lines");
   Msg(DIRECT, "  2 or F2       Mesh surfaces");
   Msg(DIRECT, "  3 or F3       Mesh volumes");
+  Msg(DIRECT, "  Escape        Cancel lasso zoom/selection, toggle mouse selection ON/OFF");
   Msg(DIRECT, " ");
   Msg(DIRECT, "  g             Go to geometry module");
   Msg(DIRECT, "  m             Go to mesh module");
@@ -1661,19 +1685,21 @@ void help_mouse_cb(CALLBACK_ARGS)
   Msg(DIRECT, " ");
   Msg(DIRECT, "Mouse actions:");
   Msg(DIRECT, " ");
-  Msg(DIRECT, "  move                - Highlight the elementary geometrical entity");
+  Msg(DIRECT, "  Move                - Highlight the elementary geometrical entity");
   Msg(DIRECT, "                        currently under the mouse pointer and display");
   Msg(DIRECT, "                        its properties in the status bar");
-  Msg(DIRECT, "                      - Size a rubber zoom started with Ctrl+Left button");
+  Msg(DIRECT, "                      - Resize a lasso zoom/selection");
   Msg(DIRECT, "  Left button         - Rotate");
-  Msg(DIRECT, "                      - Accept a rubber zoom started with Ctrl+Left button"); 
-  Msg(DIRECT, "  Ctrl+Left button    Start (anisotropic) rubber zoom"); 
-  Msg(DIRECT, "  Middle button       - Zoom (isotropic)");
-  Msg(DIRECT, "                      - Cancel a rubber zoom");
+  Msg(DIRECT, "                      - Select an entity");
+  Msg(DIRECT, "                      - Accept a lasso zoom/selection"); 
+  Msg(DIRECT, "  Ctrl+Left button    Start a lasso zoom/selection"); 
+  Msg(DIRECT, "  Middle button       - Zoom");
+  Msg(DIRECT, "                      - Unselect an entity");
+  Msg(DIRECT, "                      - Cancel a lasso zoom/selection");
   Msg(DIRECT, "  Ctrl+Middle button  Orthogonalize display"); 
   Msg(DIRECT, "  Right button        - Pan");
-  Msg(DIRECT, "                      - Cancel a rubber zoom");
-  Msg(DIRECT, "                      - Pop up menu on post-processing view button");
+  Msg(DIRECT, "                      - Cancel a lasso zoom/selection");
+  Msg(DIRECT, "                      - Pop-up menu on post-processing view button");
   Msg(DIRECT, "  Ctrl+Right button   Reset to default viewpoint");   
   Msg(DIRECT, " ");   
   Msg(DIRECT, "  For a 2 button mouse, Middle button = Shift+Left button");
@@ -1830,10 +1856,11 @@ void geometry_elementary_add_new_point_cb(CALLBACK_ARGS)
     WID->g_opengl_window->AddPointMode = true;
     Msg(ONSCREEN, "Move mouse and/or enter coordinates\n"
 	"[Press 'Shift' to hold position, 'e' to add point or 'q' to abort]");
-    Vertex *v;
-    Curve *c;
-    Surface *s;
-    char ib = SelectEntity(ENT_NONE, &v, &c, &s);
+    Vertex *v[SELECTION_MAX_HITS];
+    Curve *c[SELECTION_MAX_HITS];
+    Surface *s[SELECTION_MAX_HITS];
+    int ne;
+    char ib = SelectEntity(ENT_NONE, &ne, v, c, s);
     if(ib == 'e'){
       add_point(CTX.filename,
 		(char*)WID->context_geometry_input[2]->value(),
@@ -1844,7 +1871,6 @@ void geometry_elementary_add_new_point_cb(CALLBACK_ARGS)
     }
     if(ib == 'q'){
       WID->g_opengl_window->AddPointMode = false;
-      WID->g_opengl_window->cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
       break;
     }
   }
@@ -1854,10 +1880,10 @@ void geometry_elementary_add_new_point_cb(CALLBACK_ARGS)
 
 static void _new_multiline(int type)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n, p[100], ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
@@ -1872,9 +1898,13 @@ static void _new_multiline(int type)
     else
       Msg(ONSCREEN, "Select control points\n"
 	  "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
-    char ib = SelectEntity(ENT_POINT, &v, &c, &s);
+    char ib = SelectEntity(ENT_POINT, &ne, v, c, s);
     if(ib == 'l') {
-      p[n++] = v->Num;
+      for(int i = 0; i < ne; i++)
+	p[n++] = v[i]->Num;
+    }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during multi-line creation");
     }
     if(ib == 'e') {
       if(n >= 2) {
@@ -1922,10 +1952,10 @@ void geometry_elementary_add_new_line_cb(CALLBACK_ARGS)
   //
   //_new_multiline(0);
   //
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n, p[100], ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
@@ -1940,9 +1970,12 @@ void geometry_elementary_add_new_line_cb(CALLBACK_ARGS)
     if(n == 1)
       Msg(ONSCREEN, "Select end point\n"
 	  "[Press 'u' to undo last selection or 'q' to abort]");
-    char ib = SelectEntity(ENT_POINT, &v, &c, &s);
+    char ib = SelectEntity(ENT_POINT, &ne, v, c, s);
     if(ib == 'l') {
-      p[n++] = v->Num;
+      p[n++] = v[0]->Num;
+    }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during line creation");
     }
     if(ib == 'u') {
       if(n > 0){
@@ -1980,10 +2013,10 @@ void geometry_elementary_add_new_bspline_cb(CALLBACK_ARGS)
 
 void geometry_elementary_add_new_circle_cb(CALLBACK_ARGS)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n, p[100], ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
@@ -2001,9 +2034,12 @@ void geometry_elementary_add_new_circle_cb(CALLBACK_ARGS)
     if(n == 2)
       Msg(ONSCREEN, "Select end point\n"
 	  "[Press 'u' to undo last selection or 'q' to abort]");
-    char ib = SelectEntity(ENT_POINT, &v, &c, &s);
+    char ib = SelectEntity(ENT_POINT, &ne, v, c, s);
     if(ib == 'l') {
-      p[n++] = v->Num;
+      p[n++] = v[0]->Num;
+    }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during circle creation");
     }
     if(ib == 'u') {
       if(n > 0){
@@ -2031,10 +2067,10 @@ void geometry_elementary_add_new_circle_cb(CALLBACK_ARGS)
 
 void geometry_elementary_add_new_ellipse_cb(CALLBACK_ARGS)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n, p[100], ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
@@ -2055,9 +2091,12 @@ void geometry_elementary_add_new_ellipse_cb(CALLBACK_ARGS)
     if(n == 3)
       Msg(ONSCREEN, "Select end point\n"
 	  "[Press 'u' to undo last selection or 'q' to abort]");
-    char ib = SelectEntity(ENT_POINT, &v, &c, &s);
+    char ib = SelectEntity(ENT_POINT, &ne, v, c, s);
     if(ib == 'l') {
-      p[n++] = v->Num;
+      p[n++] = v[0]->Num;
+    }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during ellipse creation");
     }
     if(ib == 'u') {
       if(n > 0){
@@ -2085,10 +2124,10 @@ void geometry_elementary_add_new_ellipse_cb(CALLBACK_ARGS)
 
 static void _new_surface_volume(int mode)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int type, num;
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int type, num, ne;
 
   List_T *List1 = List_Create(10, 10, sizeof(int));
   List_T *List2 = List_Create(10, 10, sizeof(int));
@@ -2129,7 +2168,7 @@ static void _new_surface_volume(int mode)
 	      "[Press 'u' to undo last selection or 'q' to abort]");
       }
 
-      char ib = SelectEntity(type, &v, &c, &s);
+      char ib = SelectEntity(type, &ne, v, c, s);
       if(ib == 'q') {
         ZeroHighlight(THEM);
         Draw();
@@ -2137,7 +2176,7 @@ static void _new_surface_volume(int mode)
       }
       if(ib == 'u') {
 	if(List_Nbr(List1) > 0){
-	  List_Read(List1, List_Nbr(List1)-1, &num);	    
+	  List_Read(List1, List_Nbr(List1)-1, &num);
 	  ZeroHighlightEntityNum(0,
 				 (type == ENT_LINE) ? abs(num) : 0, 
 				 (type != ENT_LINE) ? abs(num) : 0);
@@ -2145,8 +2184,11 @@ static void _new_surface_volume(int mode)
 	  Draw();
 	}
       }
+      if(ib == 'r') {
+	Msg(WARNING, "Entity de-selection not supported yet during surface/volume creation");
+      }
       if(ib == 'l') {
-	int num = (type == ENT_LINE) ? c->Num : s->Num;
+	int num = (type == ENT_LINE) ? c[0]->Num : s[0]->Num;
 	if(SelectContour(type, num, List1)) {
 	  if(type == ENT_LINE)
 	    add_loop(List1, CTX.filename, &num);
@@ -2161,7 +2203,7 @@ static void _new_surface_volume(int mode)
 	    else
 	      Msg(ONSCREEN, "Select hole boundaries\n"
 		  "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
-	    ib = SelectEntity(type, &v, &c, &s);
+	    ib = SelectEntity(type, &ne, v, c, s);
 	    if(ib == 'q') {
 	      ZeroHighlight(THEM);
 	      Draw();
@@ -2184,7 +2226,7 @@ static void _new_surface_volume(int mode)
 	      }
 	    }
 	    if(ib == 'l') {
-	      num = (type == ENT_LINE) ? c->Num : s->Num;
+	      num = (type == ENT_LINE) ? c[0]->Num : s[0]->Num;
 	      if(SelectContour(type, num, List1)) {
 		if(type == ENT_LINE)
 		  add_loop(List1, CTX.filename, &num);
@@ -2194,6 +2236,9 @@ static void _new_surface_volume(int mode)
 		List_Add(List2, &num);
 	      }
 	    }
+	    if(ib == 'r') {
+	      Msg(WARNING, "Entity de-selection not supported yet during surface/volume creation");
+	    }
 	  }
 	  if(List_Nbr(List2)) {
 	    switch (mode) {
@@ -2234,10 +2279,10 @@ void geometry_elementary_add_new_volume_cb(CALLBACK_ARGS)
 
 static void _transform_point_line_surface(int transfo, int mode, char *what)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int type, num = 0;
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int type, num = 0, ne;
   char *str;
 
   if(!strcmp(what, "Point")) {
@@ -2261,7 +2306,7 @@ static void _transform_point_line_surface(int transfo, int mode, char *what)
 
   while(1) {
     Msg(STATUS3N, "Transforming %s", str);
-    char ib = SelectEntity(type, &v, &c, &s);
+    char ib = SelectEntity(type, &ne, v, c, s);
     if(ib == 'q') {
       ZeroHighlight(THEM);
       Draw();
@@ -2270,13 +2315,13 @@ static void _transform_point_line_surface(int transfo, int mode, char *what)
     if(ib == 'l') {
       switch (type) {
       case ENT_POINT:
-	num = v->Num;
+	num = v[0]->Num;
 	break;
       case ENT_LINE:
-	num = c->Num;
+	num = c[0]->Num;
 	break;
       case ENT_SURFACE:
-	num = s->Num;
+	num = s[0]->Num;
 	break;
       }
       switch (transfo) {
@@ -2602,10 +2647,10 @@ void geometry_elementary_delete_surface_cb(CALLBACK_ARGS)
 
 static void _add_physical(char *what)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int type, num;
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int type, num, ne;
   char *str;
   List_T *List1;
 
@@ -2643,19 +2688,40 @@ static void _add_physical(char *what)
     else
       Msg(ONSCREEN, "Select %s\n"
 	  "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]", str);
-    char ib = SelectEntity(type, &v, &c, &s);
+    char ib = SelectEntity(type, &ne, v, c, s);
     if(ib == 'l') {
-      switch (type) {
-      case ENT_POINT:
-        List_Add(List1, &v->Num);
-        break;
-      case ENT_LINE:
-        List_Add(List1, &c->Num);
-        break;
-      case ENT_SURFACE:
-        List_Add(List1, &s->Num);
-        break;
+      for(int i = 0; i < ne; i++){
+	switch (type) {
+	case ENT_POINT:
+	  List_Add(List1, &v[i]->Num);
+	  break;
+	case ENT_LINE:
+	  List_Add(List1, &c[i]->Num);
+	  break;
+	case ENT_SURFACE:
+	  List_Add(List1, &s[i]->Num);
+	  break;
+	}
+      }
+    }
+    if(ib == 'r') {
+      for(int i = 0; i < ne; i++){
+	switch (type) {
+	case ENT_POINT:
+	  List_Suppress(List1, &v[i]->Num, fcmp_int);
+	  ZeroHighlightEntity(v[i], NULL, NULL);
+	  break;
+	case ENT_LINE:
+	  List_Suppress(List1, &c[i]->Num, fcmp_int);
+	  ZeroHighlightEntity(NULL, c[i], NULL);
+	  break;
+	case ENT_SURFACE:
+	  List_Suppress(List1, &s[i]->Num, fcmp_int);
+	  ZeroHighlightEntity(NULL, NULL, s[i]);
+	  break;
+	}
       }
+      Draw();
     }
     if(ib == 'u') {
       if(List_Nbr(List1)) {
@@ -2817,10 +2883,10 @@ void mesh_update_edges_cb(CALLBACK_ARGS)
 
 void mesh_update_more_edges_cb(CALLBACK_ARGS)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n, p[100], ne;
   extern void BDS_To_Mesh(Mesh *m);
 
   if (THEM && THEM->bds && WID) {
@@ -2834,15 +2900,17 @@ void mesh_update_more_edges_cb(CALLBACK_ARGS)
       Msg(STATUS3N, "Adding new Model Edges");
       if(n == 0)
 	Msg(ONSCREEN, "Select Model Edges\n"
-	    "[Press 'q' to abort or 'e' end]");
+	    "[Press 'e' to end selection or 'q' to abort]");
       if(n == 1)
 	Msg(ONSCREEN, "Select Model Edge\n"
-	    "[Press 'u' to undo last selection, 'q' to abort, 'e' end]");
-      char ib = SelectEntity(ENT_LINE, &v, &c, &s);
-      printf("ib = %c\n",ib);
+	    "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
+      char ib = SelectEntity(ENT_LINE, &ne, v, c, s);
       if(ib == 'l') {
-	p[n++] = c->Num;
-	printf("line %d has been selected\n",c->Num);
+	for(int i = 0; i < ne; i++)
+	  p[n++] = c[i]->Num;
+      }
+      if(ib == 'r') {
+	Msg(WARNING, "Entity de-selection not supported yet during edge selection");
       }
       if(ib == 'u') {
 	if(n > 0){
@@ -2872,7 +2940,6 @@ void mesh_update_more_edges_cb(CALLBACK_ARGS)
 	    ++it;
 	  }
 	}
-	
 	ZeroHighlight(THEM);
 	Draw();
 	n = 0;
@@ -2883,10 +2950,10 @@ void mesh_update_more_edges_cb(CALLBACK_ARGS)
 
 void mesh_define_length_cb(CALLBACK_ARGS)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n = 0, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n = 0, p[100], ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   Draw();
@@ -2901,9 +2968,13 @@ void mesh_define_length_cb(CALLBACK_ARGS)
     else
       Msg(ONSCREEN, "Select points\n"
 	  "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
-    char ib = SelectEntity(ENT_POINT, &v, &c, &s);
+    char ib = SelectEntity(ENT_POINT, &ne, v, c, s);
     if(ib == 'l') {
-      p[n++] = v->Num;
+      for(int i = 0; i < ne; i++)
+	p[n++] = v[i]->Num;
+    }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during char. length definition");
     }
     if(ib == 'e') {
       if(n > 0)
@@ -2931,10 +3002,10 @@ void mesh_define_length_cb(CALLBACK_ARGS)
 
 void mesh_define_recombine_cb(CALLBACK_ARGS)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
-  int n, p[100];
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
+  int n, p[100], ne;
 
   opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
   Draw();
@@ -2948,9 +3019,13 @@ void mesh_define_recombine_cb(CALLBACK_ARGS)
     else
       Msg(ONSCREEN, "Select surfaces\n"
 	  "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
-    char ib = SelectEntity(ENT_SURFACE, &v, &c, &s);
+    char ib = SelectEntity(ENT_SURFACE, &ne, v, c, s);
     if(ib == 'l') {
-      p[n++] = s->Num;
+      for(int i = 0; i < ne; i++)
+	p[n++] = s[i]->Num;
+    }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during recombine definition");
     }
     if(ib == 'e') {
       if(n > 0)
@@ -2983,11 +3058,11 @@ void mesh_define_transfinite_cb(CALLBACK_ARGS)
 
 static void _add_transfinite_elliptic(int type, int dim)
 {
-  Vertex *v;
-  Curve *c;
-  Surface *s;
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
   char ib;
-  int n, p[100];
+  int n, p[100], ne;
 
   opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   switch (dim) {
@@ -3008,11 +3083,11 @@ static void _add_transfinite_elliptic(int type, int dim)
       else
 	Msg(ONSCREEN, "Select lines\n"
 	    "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
-      ib = SelectEntity(ENT_LINE, &v, &c, &s);
+      ib = SelectEntity(ENT_LINE, &ne, v, c, s);
       break;
     case 2:
       Msg(ONSCREEN, "Select surface\n[Press 'q' to abort]");
-      ib = SelectEntity(ENT_SURFACE, &v, &c, &s);
+      ib = SelectEntity(ENT_SURFACE, &ne, v, c, s);
       break;
     default:
       ib = 'l';
@@ -3045,13 +3120,16 @@ static void _add_transfinite_elliptic(int type, int dim)
       Draw();
       break;
     }
+    if(ib == 'r') {
+      Msg(WARNING, "Entity de-selection not supported yet during transfinite definition");
+    }
     if(ib == 'l') {
       switch (dim) {
       case 1:
-        p[n++] = c->Num;
+        p[n++] = c[0]->Num;
         break;
       case 2:
-        p[n++] = s->Num; // fall-through
+        p[n++] = s[0]->Num; // fall-through
       case 3:
         while(1) {
 	  if(n == ((dim == 2) ? 1 : 0))
@@ -3060,9 +3138,9 @@ static void _add_transfinite_elliptic(int type, int dim)
 	  else
 	    Msg(ONSCREEN, "Select (ordered) boundary points\n"
 		"[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]");
-          ib = SelectEntity(ENT_POINT, &v, &c, &s);
+          ib = SelectEntity(ENT_POINT, &ne, v, c, s);
           if(ib == 'l') {
-            p[n++] = v->Num;
+            p[n++] = v[0]->Num;
           }
 	  if(ib == 'u') {
 	    if(n > ((dim == 2) ? 1 : 0)){
@@ -3071,6 +3149,9 @@ static void _add_transfinite_elliptic(int type, int dim)
 	      n--;
 	    }
 	  }
+	  if(ib == 'r') {
+	    Msg(WARNING, "Entity de-selection not supported yet during transfinite definition");
+	  }
           if(ib == 'e') {
             switch (dim) {
             case 2:
@@ -4324,3 +4405,10 @@ void con_geometry_define_point_cb(CALLBACK_ARGS)
   CalculateMinMax(THEM->Points, NULL);
   Draw();
 }
+
+void con_geometry_snap_cb(CALLBACK_ARGS)
+{
+  CTX.geom.snap[0] = WID->context_geometry_value[0]->value();
+  CTX.geom.snap[1] = WID->context_geometry_value[1]->value();
+  CTX.geom.snap[2] = WID->context_geometry_value[2]->value();
+}
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index ca39962dcfe7eace241211e2a5ce65cfa1f53e7b..695cae000f2738cfc1856f67cc75a63be6ad1d06 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -1,7 +1,7 @@
 #ifndef _CALLBACKS_H_
 #define _CALLBACKS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -262,6 +262,7 @@ void geometry_reload_cb(CALLBACK_ARGS);
 
 void con_geometry_define_parameter_cb(CALLBACK_ARGS);
 void con_geometry_define_point_cb(CALLBACK_ARGS);
+void con_geometry_snap_cb(CALLBACK_ARGS);
 
 // Dynamic Mesh Menus
 
diff --git a/Fltk/Colorbar_Window.cpp b/Fltk/Colorbar_Window.cpp
index d377dac8c558a5609842f1fa632207433a16705a..e4a506ca852a5dcb488ce10d0742faca825b7da7 100644
--- a/Fltk/Colorbar_Window.cpp
+++ b/Fltk/Colorbar_Window.cpp
@@ -1,6 +1,6 @@
-// $Id: Colorbar_Window.cpp,v 1.49 2005-12-22 20:42:41 geuzaine Exp $
+// $Id: Colorbar_Window.cpp,v 1.50 2006-01-06 00:34:22 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Colorbar_Window.h b/Fltk/Colorbar_Window.h
index 9843e9e92e00fb7070c71b185c738755847da94b..69e92502e2d9b9d809b7e0ca94b5f2c5c7dc579c 100644
--- a/Fltk/Colorbar_Window.h
+++ b/Fltk/Colorbar_Window.h
@@ -1,7 +1,7 @@
 #ifndef _COLORBAR_WINDOW_H
 #define _COLORBAR_WINDOW_H
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/File_Picker.h b/Fltk/File_Picker.h
index 4ba8059e39087baab76d948d9d747c9273708e13..3da6ef5ce873ebd1760e972bd849389f11770ed3 100644
--- a/Fltk/File_Picker.h
+++ b/Fltk/File_Picker.h
@@ -1,7 +1,7 @@
 #ifndef _FILE_PICKER_H_
 #define _FILE_PICKER_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 7ced953cf89dc162169fca1b4a81793e92d44581..d0f72cab98fb4652cd94d028d260d7f62172a1b8 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,6 +1,6 @@
-// $Id: GUI.cpp,v 1.476 2005-12-28 13:55:58 geuzaine Exp $
+// $Id: GUI.cpp,v 1.477 2006-01-06 00:34:22 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -514,7 +514,7 @@ int GUI::global_shortcuts(int event)
     return 1;
   }
 
-  if(Fl::test_shortcut('0') || Fl::test_shortcut(FL_Escape)) {
+  if(Fl::test_shortcut('0')) {
     geometry_reload_cb(0, 0);
     mod_geometry_cb(0, 0);
     return 1;
@@ -576,6 +576,16 @@ int GUI::global_shortcuts(int event)
     quit_selection = 1;
     return 0;   // trick: do as if we didn't use it
   }
+  else if(Fl::test_shortcut(FL_Escape)) {
+    if(g_opengl_window->LassoMode){
+      g_opengl_window->LassoMode = false;
+      redraw_opengl();
+    }
+    else{
+      status_xyz1p_cb(0, (void *)"S");
+    }
+    return 1;
+  }
   else if(Fl::test_shortcut(FL_SHIFT + 'a')) { 
     window_cb(0, (void*)"front");
     return 1;
@@ -821,8 +831,6 @@ int GUI::arrow_shortcuts()
 
 GUI::GUI(int argc, char **argv)
 {
-  int i;
-
   // initialize static windows
   m_window = NULL;
   g_window = NULL;
@@ -843,6 +851,7 @@ GUI::GUI(int argc, char **argv)
   // initialize selection bits
   selection = ENT_NONE;
   try_selection = quit_selection = end_selection = undo_selection = 0;
+  for(int i = 0; i < 4; i++) try_selection_xywh[i] = 0;
 
   // set X display
   if(strlen(CTX.display))
@@ -911,7 +920,7 @@ GUI::GUI(int argc, char **argv)
   create_about_window();
   create_geometry_context_window(0);
   create_mesh_context_window(0);
-  for(i = 0; i < MAXSOLVERS; i++) {
+  for(int i = 0; i < MAXSOLVERS; i++) {
     solver[i].window = NULL;
     create_solver_window(i);
   }
@@ -1366,6 +1375,11 @@ void GUI::create_graphic_window()
   ortho_bmp = new Fl_Bitmap(ortho_bits, ortho_width, ortho_height);
   ortho_bmp->label(g_status_butt[8]);
 
+  g_status_butt[9] = new Fl_Button(x, glheight + 2, sw, sh - 4, "S");
+  x += sw;
+  g_status_butt[9]->callback(status_xyz1p_cb, (void *)"S");
+  g_status_butt[9]->tooltip("Toggle mouse selection ON/OFF (Escape)");
+
   g_status_butt[5] = new Fl_Button(x, glheight + 2, sw, sh - 4, "?");
   x += sw;
   g_status_butt[5]->callback(status_xyz1p_cb, (void *)"?");
@@ -1388,7 +1402,7 @@ void GUI::create_graphic_window()
   stop_bmp = new Fl_Bitmap(stop_bits, stop_width, stop_height);
   g_status_butt[7]->deactivate();
 
-  for(i = 0; i < 9; i++) {
+  for(i = 0; i < 10; i++) {
     g_status_butt[i]->box(FL_FLAT_BOX);
     g_status_butt[i]->selection_color(FL_WHITE);
     g_status_butt[i]->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
@@ -2339,7 +2353,7 @@ void GUI::create_option_window()
       mesh_butt[11]->down_box(GMSH_TOGGLE_BOX);
       mesh_butt[11]->selection_color(GMSH_TOGGLE_COLOR);
 
-      mesh_butt[12] = new Fl_Check_Button(L + width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Node numbers");
+      mesh_butt[12] = new Fl_Check_Button(L + width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Node labels");
       mesh_butt[12]->type(FL_TOGGLE_BUTTON);
       mesh_butt[12]->down_box(GMSH_TOGGLE_BOX);
       mesh_butt[12]->selection_color(GMSH_TOGGLE_COLOR);
@@ -2360,17 +2374,18 @@ void GUI::create_option_window()
       mesh_butt[15]->selection_color(GMSH_TOGGLE_COLOR);
 
       static Fl_Menu_Item menu_label_type[] = {
-        {"Element numbers", 0, 0, 0},
-        {"Elementary entity numbers", 0, 0, 0},
-        {"Physical entity numbers", 0, 0, 0},
-        {"Partition numbers", 0, 0, 0},
+        {"Number", 0, 0, 0},
+        {"Elementary entity", 0, 0, 0},
+        {"Physical entity", 0, 0, 0},
+        {"Partition", 0, 0, 0},
+        {"Coordinates", 0, 0, 0},
         {0}
       };
-      mesh_choice[7] = new Fl_Choice(L + width / 2, 2 * WB + 5 * BH, IW, BH, "Labels");
+      mesh_choice[7] = new Fl_Choice(L + width / 2, 2 * WB + 5 * BH, width/4 - 2*WB, BH, "Label type");
       mesh_choice[7]->menu(menu_label_type);
       mesh_choice[7]->align(FL_ALIGN_RIGHT);
 
-      mesh_value[12] = new Fl_Value_Input(L + width / 2, 2 * WB + 6 * BH, IW / 2, BH, "Labels frequency");
+      mesh_value[12] = new Fl_Value_Input(L + width / 2, 2 * WB + 6 * BH, width/4 - 2*WB, BH, "Label frequency");
       mesh_value[12]->minimum(0.0);
       mesh_value[12]->maximum(100.0);
       mesh_value[12]->step(0.1);
@@ -2394,7 +2409,7 @@ void GUI::create_option_window()
         {"Rho", 0, 0, 0},
         {0}
       };
-      mesh_choice[6] = new Fl_Choice(L + width - BB - 5 * WB, 2 * WB + 7 * BH, BB, BH);
+      mesh_choice[6] = new Fl_Choice(L + (3 * width)/4 - WB, 2 * WB + 7 * BH, width/4 - 2*WB, BH);
       mesh_choice[6]->menu(menu_quality_type);
       mesh_choice[6]->align(FL_ALIGN_LEFT);
 
@@ -3810,20 +3825,29 @@ void GUI::create_visibility_window()
     vis_butt[0]->selection_color(GMSH_TOGGLE_COLOR);
     vis_butt[0]->value(1);
 
-    Fl_Button *o0 = new Fl_Button(2 * WB, 3 * WB + 2 * BH, cols[0], BH, "*");
+    Fl_Button *o0 = new Fl_Button(2 * WB, 3 * WB + 2 * BH, cols[0], BH/2, "*");
+    o0->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
+    o0->tooltip("Select/unselect all");
     o0->callback(visibility_sort_cb, (void *)"*");
-    
-    Fl_Button *o1 = new Fl_Button(2 * WB + cols[0], 3 * WB + 2 * BH, cols[1], BH, "Type");
-    o1->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
-    o1->callback(visibility_sort_cb, (void *)"type");
 
-    Fl_Button *o2 = new Fl_Button(2 * WB + cols[0] + cols[1], 3 * WB + 2 * BH, cols[2], BH, "Number");
+    Fl_Button *o1 = new Fl_Button(2 * WB, 3 * WB + 2 * BH + BH/2, cols[0], BH - BH/2, "-");
+    o1->tooltip("Invert selection");
+    o1->callback(visibility_sort_cb, (void *)"-");
+    
+    Fl_Button *o2 = new Fl_Button(2 * WB + cols[0], 3 * WB + 2 * BH, cols[1], BH, "Type");
     o2->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
-    o2->callback(visibility_sort_cb, (void *)"number");
+    o2->tooltip("Sort by type");
+    o2->callback(visibility_sort_cb, (void *)"type");
 
-    Fl_Button *o3 = new Fl_Button(2 * WB + cols[0] + cols[1] + cols[2], 3 * WB + 2 * BH, cols[3], BH, "Name");
+    Fl_Button *o3 = new Fl_Button(2 * WB + cols[0] + cols[1], 3 * WB + 2 * BH, cols[2], BH, "Number");
     o3->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
-    o3->callback(visibility_sort_cb, (void *)"name");
+    o3->tooltip("Sort by number");
+    o3->callback(visibility_sort_cb, (void *)"number");
+
+    Fl_Button *o4 = new Fl_Button(2 * WB + cols[0] + cols[1] + cols[2], 3 * WB + 2 * BH, cols[3], BH, "Name");
+    o4->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
+    o4->tooltip("Sort by name");
+    o4->callback(visibility_sort_cb, (void *)"name");
     
     {
       Fl_Group *o = new Fl_Group(2 * WB, 3 * WB + 3 * BH, brw, height - 7 * WB - 5 * BH);
@@ -4104,7 +4128,7 @@ void GUI::create_about_window()
     o->add("@c@.A three-dimensional finite element mesh generator");
     o->add("@c@.with built-in pre- and post-processing facilities");
     o->add(" ");
-    o->add("@c@.Copyright (C) 1997-2005");
+    o->add("@c@.Copyright (C) 1997-2006");
 #if defined(__APPLE__)
     o->add("@c@.Christophe Geuzaine and Jean-Francois Remacle");
 #else
@@ -4229,6 +4253,13 @@ void GUI::create_geometry_context_window(int num)
       for(i = 2; i < 6; i++) {
         context_geometry_input[i]->align(FL_ALIGN_RIGHT);
       }
+      context_geometry_value[0] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW/3, BH);
+      context_geometry_value[1] = new Fl_Value_Input(2 * WB + IW/3, 2 * WB + 5 * BH, IW/3, BH);
+      context_geometry_value[2] = new Fl_Value_Input(2 * WB + 2*IW/3, 2 * WB + 5 * BH, IW/3, BH, "Snapping grid spacing");
+      for(i = 0; i < 3; i++) {
+        context_geometry_value[i]->align(FL_ALIGN_RIGHT);
+        context_geometry_value[i]->callback(con_geometry_snap_cb);
+      }
       {
         Fl_Return_Button *o = new Fl_Return_Button(width - BB - 2 * WB, 2 * WB + 7 * BH, BB, BH, "Add");
         o->callback(con_geometry_define_point_cb);
diff --git a/Fltk/GUI.h b/Fltk/GUI.h
index df3a05ccce6e1f677accfc0372c792bf185d7f6b..77fb46db644c7ff0236f5b1ee839ef206b2b9eae 100644
--- a/Fltk/GUI.h
+++ b/Fltk/GUI.h
@@ -1,7 +1,7 @@
 #ifndef _GUI_H_
 #define _GUI_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -151,7 +151,7 @@ public:
   // graphic window
   Fl_Window        *g_window ;
   Opengl_Window    *g_opengl_window ;
-  Fl_Button        *g_status_butt[9] ;
+  Fl_Button        *g_status_butt[10] ;
   Fl_Box           *g_status_label[3] ;
 
   // Option window
@@ -241,6 +241,7 @@ public:
   // geometry context window
   Fl_Window        *context_geometry_window ;
   Fl_Input         *context_geometry_input[30] ;
+  Fl_Value_Input   *context_geometry_value[10] ;
 
   // mesh context window
   Fl_Window        *context_mesh_window ;
@@ -307,7 +308,7 @@ public:
   void update_manip_window(int force=0);
   void reset_external_view_list();
   int  selection, try_selection, quit_selection, end_selection, undo_selection;
-
+  int  try_selection_xywh[4];
 };
 
 // some utility font functions
diff --git a/Fltk/GUI_Extras.cpp b/Fltk/GUI_Extras.cpp
index d7f052f37bfe481a491362378f2d703035577fe7..5c96ec5fb51b87518cd8da1165908d00112c9c24 100644
--- a/Fltk/GUI_Extras.cpp
+++ b/Fltk/GUI_Extras.cpp
@@ -1,6 +1,6 @@
-// $Id: GUI_Extras.cpp,v 1.13 2005-12-18 22:13:26 geuzaine Exp $
+// $Id: GUI_Extras.cpp,v 1.14 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -453,22 +453,27 @@ int options_dialog(char *name)
 {
   struct _options_dialog{
     Fl_Window *window;
-    Fl_Check_Button *b;
+    Fl_Check_Button *b[2];
     Fl_Button *ok, *cancel;
   };
   static _options_dialog *dialog = NULL;
 
   if(!dialog){
     dialog = new _options_dialog;
-    int h = 3*10 + 25 + 1*25, y = 0;
+    int h = 3*10 + 25 + 2*25, y = 0;
     // not a "Dialog_Window" since it is modal 
     dialog->window = new Fl_Double_Window(200, h, "Options"); y = 10;
     dialog->window->box(GMSH_WINDOW_BOX);
-    dialog->b = new Fl_Check_Button(10, y, 180, 25, "Save only modified options"); y += 25;
-    dialog->b->value(1);
-    dialog->b->type(FL_TOGGLE_BUTTON);
-    dialog->b->down_box(GMSH_TOGGLE_BOX);
-    dialog->b->selection_color(GMSH_TOGGLE_COLOR);
+    dialog->b[0] = new Fl_Check_Button(10, y, 180, 25, "Save only modified options"); y += 25;
+    dialog->b[0]->value(1);
+    dialog->b[0]->type(FL_TOGGLE_BUTTON);
+    dialog->b[0]->down_box(GMSH_TOGGLE_BOX);
+    dialog->b[0]->selection_color(GMSH_TOGGLE_COLOR);
+    dialog->b[1] = new Fl_Check_Button(10, y, 180, 25, "Print help strings"); y += 25;
+    dialog->b[1]->value(1);
+    dialog->b[1]->type(FL_TOGGLE_BUTTON);
+    dialog->b[1]->down_box(GMSH_TOGGLE_BOX);
+    dialog->b[1]->selection_color(GMSH_TOGGLE_COLOR);
     dialog->ok = new Fl_Return_Button(10, y+10, 85, 25, "OK");
     dialog->cancel = new Fl_Button(105, y+10, 85, 25, "Cancel");
     dialog->window->set_modal();
@@ -484,7 +489,7 @@ int options_dialog(char *name)
       Fl_Widget* o = Fl::readqueue();
       if (!o) break;
       if (o == dialog->ok) {
-	Print_Options(0, GMSH_FULLRC, dialog->b->value(), name);
+	Print_Options(0, GMSH_FULLRC, dialog->b[0]->value(), dialog->b[1]->value(), name);
 	dialog->window->hide();
 	return 1;
       }
diff --git a/Fltk/GUI_Extras.h b/Fltk/GUI_Extras.h
index 0cb151459cc3590c15d7f34a98fd84271f86be80..798ba31cfb735c38c84d34be416d9eb779cc5092 100644
--- a/Fltk/GUI_Extras.h
+++ b/Fltk/GUI_Extras.h
@@ -1,7 +1,7 @@
 #ifndef _GUI_EXTRAS_H_
 #define _GUI_EXTRAS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/GmshServer.h b/Fltk/GmshServer.h
index 8fd292ff8830d3df676928e3de0a5d9584509466..788d08cb918e1c3268bec2d20e4f9b74c68327f0 100644
--- a/Fltk/GmshServer.h
+++ b/Fltk/GmshServer.h
@@ -1,7 +1,7 @@
 #ifndef _GMSH_SERVER_H_
 #define _GMSH_SERVER_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // Permission is hereby granted, free of charge, to any person
 // obtaining a copy of this software and associated documentation
diff --git a/Fltk/MacIcons.icns b/Fltk/MacIcons.icns
index 739de1245d358aff43ea96eaf749806cdc48e096..803849e61210bc4838f8533dbd490d0907ac6510 100644
Binary files a/Fltk/MacIcons.icns and b/Fltk/MacIcons.icns differ
diff --git a/Fltk/MacIconsGeo.icns b/Fltk/MacIconsGeo.icns
index 439c6e737b3f3a2fdf328825e59cf971a9f6d576..6ac95423b260251013e6437500f32ad1cdd1697f 100644
Binary files a/Fltk/MacIconsGeo.icns and b/Fltk/MacIconsGeo.icns differ
diff --git a/Fltk/MacIconsMsh.icns b/Fltk/MacIconsMsh.icns
index 8ab3d78407bb61777da159e05ea2837ea87b274a..59c81f49474649280cc49268d963d739f9507b46 100644
Binary files a/Fltk/MacIconsMsh.icns and b/Fltk/MacIconsMsh.icns differ
diff --git a/Fltk/MacIconsPos.icns b/Fltk/MacIconsPos.icns
index df67b94f47c6a78d1d847eaa701dc93380c724d7..353bccbd7ec47ecd8efd4d96a792767455234f3c 100644
Binary files a/Fltk/MacIconsPos.icns and b/Fltk/MacIconsPos.icns differ
diff --git a/Fltk/Main.cpp b/Fltk/Main.cpp
index e2720f41b155f1daeb42b9786d4f460b618df9fd..0cb20f06d8308cd4989f16ee03bceda7b9e32829 100644
--- a/Fltk/Main.cpp
+++ b/Fltk/Main.cpp
@@ -1,6 +1,6 @@
-// $Id: Main.cpp,v 1.84 2005-10-24 15:38:13 geuzaine Exp $
+// $Id: Main.cpp,v 1.85 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Makefile b/Fltk/Makefile
index f7f898a42ab60ca5a577317203d5f521fda09ebc..3445d5c76f6a2555275d9c910bc7440e83e3064d 100644
--- a/Fltk/Makefile
+++ b/Fltk/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.76 2005-12-19 02:35:03 geuzaine Exp $
+# $Id: Makefile,v 1.77 2006-01-06 00:34:23 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Message.cpp b/Fltk/Message.cpp
index 2dfe0c580f318d9d63924bd9f0c8d883a2bcaab2..5d6c9980411c0560865f390f94800cf06fbc4757 100644
--- a/Fltk/Message.cpp
+++ b/Fltk/Message.cpp
@@ -1,6 +1,6 @@
-// $Id: Message.cpp,v 1.66 2005-12-21 02:32:05 geuzaine Exp $
+// $Id: Message.cpp,v 1.67 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -259,10 +259,10 @@ void Exit(int level)
       CTX.solver_position[1] = WID->solver[0].window->y();
       file_chooser_get_position(&CTX.file_chooser_position[0],
 				&CTX.file_chooser_position[1]);
-      Print_Options(0, GMSH_SESSIONRC, false, CTX.session_filename_fullpath);
+      Print_Options(0, GMSH_SESSIONRC, 0, 1, CTX.session_filename_fullpath);
     }
     if(CTX.options_save)
-      Print_Options(0, GMSH_OPTIONSRC, true, CTX.options_filename_fullpath);
+      Print_Options(0, GMSH_OPTIONSRC, 1, 1, CTX.options_filename_fullpath);
   }
 
   exit(0);
diff --git a/Fltk/Opengl.cpp b/Fltk/Opengl.cpp
index 4a716479444f386e30d19135f99a65274371a11b..2033bb6017d096c0c29e5a5b002caa4f2b6b7ec9 100644
--- a/Fltk/Opengl.cpp
+++ b/Fltk/Opengl.cpp
@@ -1,6 +1,6 @@
-// $Id: Opengl.cpp,v 1.56 2005-12-16 17:35:33 geuzaine Exp $
+// $Id: Opengl.cpp,v 1.57 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -179,14 +179,15 @@ void Draw_OnScreenMessages()
   }
 }
 
-// Select entity routines
+// Select entity routine
 
-char SelectEntity(int type, Vertex ** v, Curve ** c, Surface ** s)
+char SelectEntity(int type, int *n,
+		  Vertex *v[SELECTION_MAX_HITS], 
+		  Curve *c[SELECTION_MAX_HITS], 
+		  Surface *s[SELECTION_MAX_HITS])
 {
-  int numhits;
-  hit hits[SELECTION_BUFFER_SIZE];
-
   WID->g_opengl_window->take_focus(); // force keyboard focus in GL window 
+  WID->g_opengl_window->SelectionMode = true; // enable lasso selection
 
   WID->selection = type;
   WID->try_selection = 0;
@@ -195,14 +196,20 @@ char SelectEntity(int type, Vertex ** v, Curve ** c, Surface ** s)
   WID->undo_selection = 0;
 
   while(1) {
-    *v = NULL;
-    *c = NULL;
-    *s = NULL;
+    *n = 0;
+    for(int i = 0; i < SELECTION_MAX_HITS; i++){
+      v[i] = NULL;
+      c[i] = NULL;
+      s[i] = NULL;
+    }
 
     WID->wait();
     if(WID->quit_selection) {
-      WID->quit_selection = 0;
       WID->selection = ENT_NONE;
+      WID->g_opengl_window->SelectionMode = false;
+      WID->g_opengl_window->LassoMode = false;
+      WID->g_opengl_window->AddPointMode = false;
+      WID->g_opengl_window->cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
       return 'q';
     }
     if(WID->end_selection) {
@@ -215,20 +222,37 @@ char SelectEntity(int type, Vertex ** v, Curve ** c, Surface ** s)
       return 'u';
     }
     if(WID->try_selection) {
+      bool add = (WID->try_selection > 0) ? true : false;
+      bool multi = (WID->try_selection > 1) ? true : false;
       WID->try_selection = 0;
       if(WID->selection == ENT_NONE){ // just report the mouse click
+	WID->g_opengl_window->SelectionMode = false;
 	return 'c';
       }
       else{
-	Process_SelectionBuffer(Fl::event_x(), Fl::event_y(), &numhits, hits);
-	if(Filter_SelectionBuffer(WID->selection, numhits, hits, v, c, s, &M)){
-	  HighlightEntity(*v, *c, *s, 1);
-	  Draw();
+	*n = Process_SelectionBuffer(WID->selection, multi,
+				     WID->try_selection_xywh[0],
+				     WID->try_selection_xywh[1], 
+				     WID->try_selection_xywh[2],
+				     WID->try_selection_xywh[3], 
+				     v, c, s, &M);
+	if(*n){
+	  if(add){
+	    for(int i = 0; i < *n; i++)
+	      HighlightEntity(v[i], c[i], s[i], 1);
+	    Draw();
+	  }
+	  // don't call ZeroHighlight here if we (try to) deselect:
+	  // deselection is not supported in all cases, so it's better
+	  // to de-highlight the entities in the callback
 	  WID->selection = ENT_NONE;
-	  return 'l';
+	  WID->g_opengl_window->SelectionMode = false;
+	  if(add)
+	    return 'l';
+	  else
+	    return 'r';
 	}
       }
     }
   }
-
 }
diff --git a/Fltk/Opengl_Window.cpp b/Fltk/Opengl_Window.cpp
index 84d8c9789e4e641693ad0e2d9df6299b66e0ba60..6a1ddf231d78257b7f835cc5a955eeb003ebb8f2 100644
--- a/Fltk/Opengl_Window.cpp
+++ b/Fltk/Opengl_Window.cpp
@@ -1,6 +1,6 @@
-// $Id: Opengl_Window.cpp,v 1.57 2005-12-28 13:55:58 geuzaine Exp $
+// $Id: Opengl_Window.cpp,v 1.58 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -110,12 +110,9 @@ void Opengl_Window::draw()
     }
   }
 
-  if(!ZoomMode) {
-    ClearOpengl();
-    Draw3d();
-    Draw2d();
-  }
-  else {
+  if(LassoMode) { 
+    // draw the zoom or selection lasso on top of the current scene
+    // (without using overlays!)
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho((double)CTX.viewport[0], (double)CTX.viewport[2],
@@ -124,6 +121,10 @@ void Opengl_Window::draw()
     glLoadIdentity();
     glColor3d(1., 1., 1.);
     glDisable(GL_DEPTH_TEST);
+    if(SelectionMode){
+      glEnable(GL_LINE_STIPPLE);
+      glLineStipple(1, 0x0F0F);
+    }
     // glBlendEquation(GL_FUNC_ADD);
     glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
     glEnable(GL_BLEND);
@@ -131,16 +132,42 @@ void Opengl_Window::draw()
     for(int i = 0; i < 2; i++){
       glBegin(GL_LINE_STRIP);
       glVertex2d(click.win[0], CTX.viewport[3] - click.win[1]);
-      glVertex2d(zoom.win[0], CTX.viewport[3] - click.win[1]);
-      glVertex2d(zoom.win[0], CTX.viewport[3] - zoom.win[1]);
-      glVertex2d(click.win[0], CTX.viewport[3] - zoom.win[1]);
+      glVertex2d(lasso.win[0], CTX.viewport[3] - click.win[1]);
+      glVertex2d(lasso.win[0], CTX.viewport[3] - lasso.win[1]);
+      glVertex2d(click.win[0], CTX.viewport[3] - lasso.win[1]);
       glVertex2d(click.win[0], CTX.viewport[3] - click.win[1]);
       glEnd();
-      if(!i) zoom.set();
+      if(!i) lasso.set();
     }
     glDisable(GL_BLEND);
+    if(SelectionMode)
+      glDisable(GL_LINE_STIPPLE);
     glEnable(GL_DEPTH_TEST);
   }
+  else if(AddPointMode) { 
+    // draw the whole scene and the point to add
+    if(CTX.fast_redraw) {
+      CTX.mesh.draw = 0;
+      CTX.post.draw = 0;
+    }
+    ClearOpengl();
+    Draw3d();
+    glColor4ubv((GLubyte *) & CTX.color.fg);
+    glPointSize(CTX.geom.point_size);
+    glBegin(GL_POINTS);
+    glVertex3d(point[0], point[1], point[2]);
+    glEnd();
+    Draw2d();
+    CTX.mesh.draw = 1;
+    CTX.post.draw = 1;
+  }
+  else{
+    // draw the whole scene
+    ClearOpengl();
+    Draw3d();
+    Draw2d();
+  }
+
   locked = 0;
 }
 
@@ -152,9 +179,10 @@ void Opengl_Window::draw()
 
 int Opengl_Window::handle(int event)
 {
+  Vertex *v[SELECTION_MAX_HITS];
+  Curve *c[SELECTION_MAX_HITS];
+  Surface *s[SELECTION_MAX_HITS];
   double dx, dy;
-  int numhits;
-  hit hits[SELECTION_BUFFER_SIZE];
 
   switch (event) {
 
@@ -172,34 +200,54 @@ int Opengl_Window::handle(int event)
   case FL_PUSH:
     take_focus(); // force keyboard focus when we click in the window
     curr.set();
-    
     if(Fl::event_button() == 1 && 
        !Fl::event_state(FL_SHIFT) && !Fl::event_state(FL_ALT)) {
-      if(!ZoomMode && Fl::event_state(FL_CTRL)) {
-        ZoomMode = true;
-	zoom.set();
+      if(!LassoMode && Fl::event_state(FL_CTRL)) {
+        LassoMode = true;
+	lasso.set();
       }
-      else if(ZoomMode) {
-        ZoomMode = false;
-	lasso_zoom(click, curr);
+      else if(LassoMode) {
+        LassoMode = false;
+	if(SelectionMode){
+	  WID->try_selection = 2; // will try to select multiple entities
+	  WID->try_selection_xywh[0] = (int)(click.win[0] + curr.win[0])/2;
+	  WID->try_selection_xywh[1] = (int)(click.win[1] + curr.win[1])/2;
+	  WID->try_selection_xywh[2] = (int)fabs(click.win[0] - curr.win[0]);
+	  WID->try_selection_xywh[3] = (int)fabs(click.win[1] - curr.win[1]);
+	}
+	else{
+	  lasso_zoom(click, curr);
+	}
       }
-      else {
-        WID->try_selection = 1;
+      else if(CTX.enable_mouse_selection){
+        WID->try_selection = 1; // will try to select clicked entity
+	WID->try_selection_xywh[0] = (int)curr.win[0];
+	WID->try_selection_xywh[1] = (int)curr.win[1];
+	WID->try_selection_xywh[2] = 5;
+	WID->try_selection_xywh[3] = 5;
       }
     }
     else if(Fl::event_button() == 2 || 
 	    (Fl::event_button() == 1 && Fl::event_state(FL_SHIFT))) {
-      if(Fl::event_state(FL_CTRL) && !ZoomMode) {
+      if(Fl::event_state(FL_CTRL) && !LassoMode) {
+	// make zoom isotropic
         CTX.s[1] = CTX.s[0];
         CTX.s[2] = CTX.s[0];
         redraw();
       }
-      else {
-        ZoomMode = false;
+      else if(LassoMode) {
+        LassoMode = false;
+      }
+      else if(CTX.enable_mouse_selection){
+        WID->try_selection = -1; // will try to unselect clicked entity
+	WID->try_selection_xywh[0] = (int)curr.win[0];
+	WID->try_selection_xywh[1] = (int)curr.win[1];
+	WID->try_selection_xywh[2] = 5;
+	WID->try_selection_xywh[3] = 5;
       }
     }
     else {
-      if(Fl::event_state(FL_CTRL) && !ZoomMode) {
+      if(Fl::event_state(FL_CTRL) && !LassoMode) {
         if(CTX.useTrackball)
           CTX.setQuaternion(0., 0., 0., 1.);
         else
@@ -209,10 +257,9 @@ int Opengl_Window::handle(int event)
         redraw();
       }
       else {
-        ZoomMode = false;
+        LassoMode = false;
       }
     }
-
     click.set();
     prev.set();
     WID->update_manip_window();
@@ -220,7 +267,7 @@ int Opengl_Window::handle(int event)
 
   case FL_RELEASE:
     curr.set();
-    if(!ZoomMode) {
+    if(!LassoMode) {
       CTX.mesh.draw = 1;
       CTX.post.draw = 1;
       redraw();
@@ -232,8 +279,7 @@ int Opengl_Window::handle(int event)
     curr.set();
     dx = curr.win[0] - prev.win[0];
     dy = curr.win[1] - prev.win[1];
-
-    if(ZoomMode) {
+    if(LassoMode) {
       redraw();
     }
     else {
@@ -272,46 +318,53 @@ int Opengl_Window::handle(int event)
       }
       redraw();
     }
-
     prev.set();
     WID->update_manip_window();
     return 1;
 
   case FL_MOVE:
     curr.set();
-
-    if(AddPointMode && !Fl::event_state(FL_SHIFT)){
+    if(LassoMode) {
+      redraw();
+    }
+    else if(AddPointMode && !Fl::event_state(FL_SHIFT)){
       WID->g_opengl_window->cursor(FL_CURSOR_CROSS, FL_BLACK, FL_WHITE);
       // find line in real space corresponding to current cursor position
       double p[3],d[3];
       unproject(curr.win[0], curr.win[1], p, d);
       // fin closest point to the center of gravity
       double r[3] = {CTX.cg[0] - p[0], CTX.cg[1] - p[1], CTX.cg[2] - p[2]}, t;
-      prosca(r,d,&t);
-      double sol[3] = {p[0] + t * d[0], p[1] + t * d[1], p[2] + t * d[2]};
+      prosca(r, d, &t);
+      for(int i = 0; i < 3; i++){
+	point[i] = p[i] + t * d[i];
+	if(CTX.geom.snap[i]){
+	  double d = point[i]/CTX.geom.snap[i];
+	  double f = floor(d);
+	  double c = ceil(d);
+	  double n = (d - f < c - d) ? f : c;
+	  point[i] = n * CTX.geom.snap[i];
+	}
+      }
       char str[32];
-      sprintf(str, "%g", sol[0]); WID->context_geometry_input[2]->value(str);
-      sprintf(str, "%g", sol[1]); WID->context_geometry_input[3]->value(str);
-      sprintf(str, "%g", sol[2]); WID->context_geometry_input[4]->value(str);
-    }
-    else if(ZoomMode) {
+      sprintf(str, "%g", point[0]); WID->context_geometry_input[2]->value(str);
+      sprintf(str, "%g", point[1]); WID->context_geometry_input[3]->value(str);
+      sprintf(str, "%g", point[2]); WID->context_geometry_input[4]->value(str);
       redraw();
     }
-    else {
-      WID->make_opengl_current();
-      Process_SelectionBuffer((int)curr.win[0], (int)curr.win[1], &numhits, hits);
-      ov = v; v = NULL;
-      oc = c; c = NULL;
-      os = s; s = NULL;
-      Filter_SelectionBuffer(WID->selection, numhits, hits, &v, &c, &s, &M);
-      if(ov != v || oc != c || os != s) {
-        if((WID->selection == ENT_POINT && v) ||
-	   (WID->selection == ENT_LINE && c) || 
-	   (WID->selection == ENT_SURFACE && s))
-          WID->g_window->cursor(FL_CURSOR_CROSS, FL_BLACK, FL_WHITE);
-        else
-          WID->g_window->cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
-        HighlightEntity(v, c, s, 0);
+    else if(CTX.enable_mouse_selection){
+      if(curr.win[0] != prev.win[0] || curr.win[1] != prev.win[1]){
+	WID->make_opengl_current();
+	v[0] = NULL; c[0] = NULL; s[0] = NULL;
+	Process_SelectionBuffer(WID->selection, 0, 
+				(int)curr.win[0], (int)curr.win[1], 5, 5, 
+				v, c, s, &M);
+	if((WID->selection == ENT_POINT && v[0]) ||
+	   (WID->selection == ENT_LINE && c[0]) || 
+	   (WID->selection == ENT_SURFACE && s[0]))
+	  WID->g_window->cursor(FL_CURSOR_CROSS, FL_BLACK, FL_WHITE);
+	else
+	  WID->g_window->cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
+	HighlightEntity(v[0], c[0], s[0], 0);
       }
     }
     prev.set();
diff --git a/Fltk/Opengl_Window.h b/Fltk/Opengl_Window.h
index 0525470918f629f9f3e98b999dbdb641a27ce63b..bb85fa1a4db1eb69035fcebd1a8c635b132c29b2 100644
--- a/Fltk/Opengl_Window.h
+++ b/Fltk/Opengl_Window.h
@@ -1,7 +1,7 @@
 #ifndef _OPENGL_WINDOW_H_
 #define _OPENGL_WINDOW_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -48,23 +48,19 @@ class MousePosition {
 
 class Opengl_Window : public Fl_Gl_Window {
  public:
-  bool AddPointMode, ZoomMode;
+  bool AddPointMode, LassoMode, SelectionMode;
  private:
   int hits;
-  Vertex *v, *ov;
-  Curve *c, *oc;
-  Surface *s, *os;
-  MousePosition click, curr, prev, zoom;
+  MousePosition click, curr, prev, lasso;
+  double point[3];
   void draw();
   int handle(int);
  public:
   Opengl_Window(int x,int y,int w,int h,const char *l=0)
     : Fl_Gl_Window(x, y, w, h, l) {
-    AddPointMode = ZoomMode = false;
+    AddPointMode = LassoMode = SelectionMode = false;
     hits = 0;
-    v = ov = NULL;
-    c = oc = NULL;
-    s = os = NULL;
+    point[0] = point[1] = point[2] = 0.;
   }
 };
 
diff --git a/Fltk/Shortcut_Window.h b/Fltk/Shortcut_Window.h
index ec3ec52a42dde47333480f006c7b14e12319157d..f4f7c5ea9c7d3bdea76dfde0e551e4c3e334c0d0 100644
--- a/Fltk/Shortcut_Window.h
+++ b/Fltk/Shortcut_Window.h
@@ -1,7 +1,7 @@
 #ifndef _SHORTCUT_WINDOW_H
 #define _SHORTCUT_WINDOW_H
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Solvers.cpp b/Fltk/Solvers.cpp
index 92e715fe7f265fdd32b7e8608c0ce29da5aaff57..f620a5bb29b519c00cfdaff1cfca3204c68844cd 100644
--- a/Fltk/Solvers.cpp
+++ b/Fltk/Solvers.cpp
@@ -1,6 +1,6 @@
-// $Id: Solvers.cpp,v 1.41 2005-09-26 19:37:16 geuzaine Exp $
+// $Id: Solvers.cpp,v 1.42 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Solvers.h b/Fltk/Solvers.h
index 8d68e207cb1c3013393758052da45fd38af94d4a..bfc4bf8bbc3dc342173136859d43ceb40974f4d0 100644
--- a/Fltk/Solvers.h
+++ b/Fltk/Solvers.h
@@ -1,7 +1,7 @@
 #ifndef _SOLVERS_H_
 #define _SOLVERS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Fltk/Win32Icon.ico b/Fltk/Win32Icon.ico
index d0761decbc9dbe7e407c0b37adbbead28a395e89..aa72778021b63df4de54e8439d8b805067b50eac 100644
Binary files a/Fltk/Win32Icon.ico and b/Fltk/Win32Icon.ico differ
diff --git a/Fltk/Win32Icon.res b/Fltk/Win32Icon.res
index 696570cb91f14508277e69aafc31db200536c7e9..04daed22718ff4dc1b30de50f172380f5ca6228c 100644
Binary files a/Fltk/Win32Icon.res and b/Fltk/Win32Icon.res differ
diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
index 89f71b40cecc4e1f58a8258c17ce7fcf2cd53773..e051adb9cbd7063797eeef5ee4fb629c11278a2b 100644
--- a/Geo/CAD.cpp
+++ b/Geo/CAD.cpp
@@ -1,6 +1,6 @@
-// $Id: CAD.cpp,v 1.85 2005-03-01 00:01:12 geuzaine Exp $
+// $Id: CAD.cpp,v 1.86 2006-01-06 00:34:23 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/CAD.h b/Geo/CAD.h
index 87d85cb520228b6dfcafb1f158988d0d50bd0428..87f8c13074bb358fa75e5b536f5148db1ef1b0ab 100644
--- a/Geo/CAD.h
+++ b/Geo/CAD.h
@@ -1,7 +1,7 @@
 #ifndef _CAD_H_
 #define _CAD_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/ExtractContour.cpp b/Geo/ExtractContour.cpp
index 746ec4890e8bede8088acc08948087be5f793250..ac83f166ba88f72e378d38d31b4950a0837e5678 100644
--- a/Geo/ExtractContour.cpp
+++ b/Geo/ExtractContour.cpp
@@ -1,6 +1,6 @@
-// $Id: ExtractContour.cpp,v 1.7 2005-03-15 20:13:27 geuzaine Exp $
+// $Id: ExtractContour.cpp,v 1.8 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/ExtractContour.h b/Geo/ExtractContour.h
index d5a9a3fb1833cd965d3f872f35a91ad48db4a78b..76cc354d79b3d021607d201bde9588315488452e 100644
--- a/Geo/ExtractContour.h
+++ b/Geo/ExtractContour.h
@@ -1,7 +1,7 @@
 #ifndef _EXTRACT_CONTOUR_H_
 #define _EXTRACT_CONTOUR_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/ExtrudeParams.cpp b/Geo/ExtrudeParams.cpp
index d444636b45ab6f462c2925092e62e301f620b345..6afdedcda48a7398673ba7023798c8a75a250def 100644
--- a/Geo/ExtrudeParams.cpp
+++ b/Geo/ExtrudeParams.cpp
@@ -1,6 +1,6 @@
-// $Id: ExtrudeParams.cpp,v 1.17 2005-01-01 19:35:28 geuzaine Exp $
+// $Id: ExtrudeParams.cpp,v 1.18 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/ExtrudeParams.h b/Geo/ExtrudeParams.h
index 3fc66aff410df872143bb620a9bb8bbcb9b3cdac..857ba394d4080cc79d86ac73aa058e3ec107ec73 100644
--- a/Geo/ExtrudeParams.h
+++ b/Geo/ExtrudeParams.h
@@ -1,7 +1,7 @@
 #ifndef _EXTRUDE_PARAMS_H_
 #define _EXTRUDE_PARAMS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index e31f16466a8b431e1c48b38e4204f145ef27637a..fb395206355fd6c7735e1befbc4b3a3f2c78402e 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -1,6 +1,6 @@
-// $Id: Geo.cpp,v 1.44 2005-07-14 14:28:15 remacle Exp $
+// $Id: Geo.cpp,v 1.45 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/Geo.h b/Geo/Geo.h
index aee22da8fe70abfbb33124505c208bbade3ff8f6..a6140caab909311129368e7985459dbe02ae287e 100644
--- a/Geo/Geo.h
+++ b/Geo/Geo.h
@@ -1,7 +1,7 @@
 #ifndef _GEO_H_
 #define _GEO_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/GeoUtils.cpp b/Geo/GeoUtils.cpp
index df802f3e59932c4a85b5988b08ac109211bde05b..8a0042c4f74319ba83578c161e20fc0370e6d385 100644
--- a/Geo/GeoUtils.cpp
+++ b/Geo/GeoUtils.cpp
@@ -1,6 +1,6 @@
-// $Id: GeoUtils.cpp,v 1.7 2005-01-20 19:05:09 geuzaine Exp $
+// $Id: GeoUtils.cpp,v 1.8 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/GeoUtils.h b/Geo/GeoUtils.h
index b189bdee5b9c1430c2ba83a3dda2b849b50a8388..f60eed5d0923f8b7e51a7093e18a497a48657523 100644
--- a/Geo/GeoUtils.h
+++ b/Geo/GeoUtils.h
@@ -1,7 +1,7 @@
 #ifndef _GEO_UTILS_H_
 #define _GEO_UTILS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/Makefile b/Geo/Makefile
index 0b212e8de6cab422e1014cd0fd15aa1dd6d589ac..722c7f2dfe732aaa61f17f69775e2f6e9a9134a1 100644
--- a/Geo/Makefile
+++ b/Geo/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.67 2005-12-19 02:35:04 geuzaine Exp $
+# $Id: Makefile,v 1.68 2006-01-06 00:34:24 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Geo/MinMax.cpp b/Geo/MinMax.cpp
index d313f5ad467f370eeb62ccfd371b1aa843004b6f..5207250a8fd0d62b59e684bc1f420d51c80232b4 100644
--- a/Geo/MinMax.cpp
+++ b/Geo/MinMax.cpp
@@ -1,6 +1,6 @@
-// $Id: MinMax.cpp,v 1.20 2005-11-19 04:01:13 geuzaine Exp $
+// $Id: MinMax.cpp,v 1.21 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/MinMax.h b/Geo/MinMax.h
index a36b7b79e14b8c89756d43de41c0c08beec74bf4..b0bfd63b00fbbcc89c1d51cf6e89675d0542ecde 100644
--- a/Geo/MinMax.h
+++ b/Geo/MinMax.h
@@ -1,7 +1,7 @@
 #ifndef _MINMAX_H_
 #define _MINMAX_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/Print_Geo.cpp b/Geo/Print_Geo.cpp
index 4739a0a864884b51c3c7304605939c838fcfa986..bb11a2472cc2dfcd74f285bf63cf874a5cd4c34b 100644
--- a/Geo/Print_Geo.cpp
+++ b/Geo/Print_Geo.cpp
@@ -1,6 +1,6 @@
-// $Id: Print_Geo.cpp,v 1.41 2005-06-10 20:59:15 geuzaine Exp $
+// $Id: Print_Geo.cpp,v 1.42 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/StepGeomDatabase.cpp b/Geo/StepGeomDatabase.cpp
index 38eaee6769bb386e636f742d4d5b1608b9b5796d..5f735c8a30e34923e4af20f78cd9141c523ed0f5 100644
--- a/Geo/StepGeomDatabase.cpp
+++ b/Geo/StepGeomDatabase.cpp
@@ -1,6 +1,6 @@
-// $Id: StepGeomDatabase.cpp,v 1.18 2005-06-20 17:02:45 geuzaine Exp $
+// $Id: StepGeomDatabase.cpp,v 1.19 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Geo/StepGeomDatabase.h b/Geo/StepGeomDatabase.h
index 23b8b1a6f2ec753318b20051f54d3e2a368e5eda..47c6ddea521204d5039d7f8f2bcf5031b1883793 100644
--- a/Geo/StepGeomDatabase.h
+++ b/Geo/StepGeomDatabase.h
@@ -1,7 +1,7 @@
 #ifndef _STEP_GEOM_DATABASE_H_
 #define _STEP_GEOM_DATABASE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/CreateFile.cpp b/Graphics/CreateFile.cpp
index 0acba96fb6b4d6f5e12038d04c66047429b79221..585f3af0c2e368f52f6aea25ab28bac3b7b73d62 100644
--- a/Graphics/CreateFile.cpp
+++ b/Graphics/CreateFile.cpp
@@ -1,6 +1,6 @@
-// $Id: CreateFile.cpp,v 1.75 2005-12-22 20:42:42 geuzaine Exp $
+// $Id: CreateFile.cpp,v 1.76 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -113,7 +113,7 @@ void CreateOutputFile(char *name, int format)
     break;
 
   case FORMAT_OPT:
-    Print_Options(0, GMSH_FULLRC, true, name);
+    Print_Options(0, GMSH_FULLRC, 1, 1, name);
     break;
 
   case FORMAT_MSH:
diff --git a/Graphics/CreateFile.h b/Graphics/CreateFile.h
index c7117d5e53bd407da39022d070b24b114e3d675a..0c6917b79212ae6ab7c2228d95152fbf03706d72 100644
--- a/Graphics/CreateFile.h
+++ b/Graphics/CreateFile.h
@@ -1,7 +1,7 @@
 #ifndef _CREATE_FILE_H_
 #define _CREATE_FILE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/Draw.cpp b/Graphics/Draw.cpp
index d2ddec8235f4fe0851bad7e6ebf466bf7e8c38b7..04c14ece98194397a3815f8d5a9c21cca2528c35 100644
--- a/Graphics/Draw.cpp
+++ b/Graphics/Draw.cpp
@@ -1,6 +1,6 @@
-// $Id: Draw.cpp,v 1.92 2005-12-22 20:42:42 geuzaine Exp $
+// $Id: Draw.cpp,v 1.93 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -349,8 +349,23 @@ void InitPosition(void)
 
 // Entity selection
 
-void Process_SelectionBuffer(int x, int y, int *n, hit *hits)
+typedef struct{
+  unsigned int type, ient, depth;
+} hit;
+
+int fcmp_hit_depth(const void *a, const void *b)
+{
+  return ((hit*)a)->depth - ((hit*)b)->depth;
+}
+
+int Process_SelectionBuffer(int type, bool multi,
+			    int x, int y, int w, int h,
+			    Vertex *v[SELECTION_MAX_HITS],
+			    Curve *c[SELECTION_MAX_HITS],
+			    Surface *s[SELECTION_MAX_HITS],
+			    Mesh *m)
 {
+  hit hits[SELECTION_BUFFER_SIZE];
   GLuint selectBuf[SELECTION_BUFFER_SIZE];
 
   glSelectBuffer(SELECTION_BUFFER_SIZE, selectBuf);
@@ -364,7 +379,7 @@ void Process_SelectionBuffer(int x, int y, int *n, hit *hits)
 		 // an entity is drawn
 
   glPushMatrix();
-  InitProjection(x, y, 5, 5);
+  InitProjection(x, y, w, h);
   InitPosition();
   Draw_Mesh(&M);
   glPopMatrix();
@@ -372,10 +387,12 @@ void Process_SelectionBuffer(int x, int y, int *n, hit *hits)
   GLint numhits = glRenderMode(GL_RENDER);
   CTX.render_mode = GMSH_RENDER;
 
-  if(numhits < 0){
-    // selection buffer overflow
-    *n = 0;
-    return;
+  if(!numhits){ // no hits
+    return 0;
+  }
+  else if(numhits < 0){ // overflow
+    Msg(WARNING, "Selection buffer size exceeded");
+    return 0;
   }
 
   GLint *ptr = (GLint *) selectBuf;
@@ -400,51 +417,43 @@ void Process_SelectionBuffer(int x, int y, int *n, hit *hits)
       ptr++;
     }
   }
-  *n = numhits;
-}
 
-int fcmp_hit_depth(const void *a, const void *b)
-{
-  return ((hit*)a)->depth - ((hit*)b)->depth;
-}
-
-int Filter_SelectionBuffer(int type, int n, hit *hits, 
-			   Vertex **thev, Curve **thec, Surface **thes, Mesh *m)
-{
-  // If type == ENT_NONE, return the closest entity of "lowest
-  // dimension" (point < line < surface < volume). Otherwise, return
-  // the closest entity of type "type"
+  // filter result: if type == ENT_NONE, return the closest entity of
+  // "lowest dimension" (point < line < surface < volume). Otherwise,
+  // return the closest entity of type "type"
 
   unsigned int typmin = 4;
-
-  for(int i = 0; i < n; i++) {
+  for(int i = 0; i < numhits; i++) {
     if(hits[i].type < typmin)
       typmin = hits[i].type;
   }
 
   // sort hits to get closest entities first
-  qsort(hits, n, sizeof(hit), fcmp_hit_depth);
-
-  for(int i = 0; i < n; i++) {
+  qsort(hits, numhits, sizeof(hit), fcmp_hit_depth);
+  
+  int j = 0;
+  for(int i = 0; i < numhits; i++) {
     if((type == ENT_NONE && hits[i].type == typmin) ||
        (type == ENT_POINT && hits[i].type == 0) ||
        (type == ENT_LINE && hits[i].type == 1) ||
        (type == ENT_SURFACE && hits[i].type == 2)){
       switch (hits[i].type) {
       case 0:
-	*thev = FindPoint(hits[i].ient, m);
-        return 1;
+	v[j++] = FindPoint(hits[i].ient, m);
+	if(!multi) return 1;
+	break;
       case 1:
-	*thec = FindCurve(hits[i].ient, m);
-	return 1;
+	c[j++] = FindCurve(hits[i].ient, m);
+	if(!multi) return 1;
+	break;
       case 2:
-	*thes = FindSurface(hits[i].ient, m);
-	return 1;
+	s[j++] = FindSurface(hits[i].ient, m);
+	if(!multi) return 1;
+	break;
       }
     }
   }
-  
-  return 0;
+  return j;
 }
 
 // Takes a cursor position in window coordinates and returns the line
diff --git a/Graphics/Draw.h b/Graphics/Draw.h
index 66b0be577d4261679c93024df2ca8bead5056e26..271e77426bd949c810a6b4103a8ff3a1695ffd51 100644
--- a/Graphics/Draw.h
+++ b/Graphics/Draw.h
@@ -1,7 +1,7 @@
 #ifndef _DRAW_H_
 #define _DRAW_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -28,7 +28,9 @@
 #define GMSH_SELECT    2
 #define GMSH_FEEDBACK  3
 
-#define SELECTION_BUFFER_SIZE  1024
+// selection buffer size = 5 * number of hits (in our case)
+#define SELECTION_BUFFER_SIZE  50000
+#define SELECTION_MAX_HITS     10000
 
 void SetOpenglContext(void);
 void ClearOpengl(void);
@@ -37,13 +39,16 @@ void InitProjection(int xpick=0, int ypick=0, int wpick=0, int hpick=0);
 void InitPosition(void);
 void InitRenderModel(void);
 
-typedef struct{
-  unsigned int type, ient, depth;
-} hit;
-
-void Process_SelectionBuffer(int x, int y, int *n, hit *hits);
-int Filter_SelectionBuffer(int type, int n, hit *hits, 
-			    Vertex **thev, Curve **thec, Surface **thes, Mesh *m);
+int Process_SelectionBuffer(int type, bool multi, 
+			    int x, int y, int w, int h, 
+			    Vertex *v[SELECTION_MAX_HITS], 
+			    Curve *c[SELECTION_MAX_HITS], 
+			    Surface *s[SELECTION_MAX_HITS], 
+			    Mesh *m);
+char SelectEntity(int type, int *n,
+		  Vertex *v[SELECTION_MAX_HITS], 
+		  Curve *c[SELECTION_MAX_HITS], 
+		  Surface *s[SELECTION_MAX_HITS]);
 
 void unproject(double x, double y, double p[3], double d[3]);
 void Viewport2World(double win[3], double xyz[3]);
@@ -53,11 +58,11 @@ unsigned int PaletteContinuous(Post_View * View, double min, double max, double
 unsigned int PaletteContinuousLinear(Post_View * v, double min, double max, double val);
 unsigned int PaletteDiscrete(Post_View * View, int nbi, int i);
 
-char SelectEntity(int type, Vertex **v, Curve **c, Surface **s);
 void HighlightEntity(Vertex *v,Curve *c, Surface *s, int permanent);
 void HighlightEntityNum(int v, int c, int s, int permanant);
-void ZeroHighlight(Mesh *m);
+void ZeroHighlightEntity(Vertex *v,Curve *c, Surface *s);
 void ZeroHighlightEntityNum(int v, int c, int s);
+void ZeroHighlight(Mesh *m);
 
 void Draw3d(void);
 void Draw2d(void);
diff --git a/Graphics/Entity.cpp b/Graphics/Entity.cpp
index f752bf16f41e566d4d2bb0bb087ed89650c37fbb..dbce136bd7208a14fe93da9227bb13e00f5abd85 100644
--- a/Graphics/Entity.cpp
+++ b/Graphics/Entity.cpp
@@ -1,6 +1,6 @@
-// $Id: Entity.cpp,v 1.61 2005-03-13 09:10:35 geuzaine Exp $
+// $Id: Entity.cpp,v 1.62 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
index 2444d3e817109eeabcb0a0d47fbab7434a1e1379..7f9105285896882eed952fc84b8bd5056c0d392b 100644
--- a/Graphics/Geom.cpp
+++ b/Graphics/Geom.cpp
@@ -1,6 +1,6 @@
-// $Id: Geom.cpp,v 1.95 2005-12-13 23:18:20 geuzaine Exp $
+// $Id: Geom.cpp,v 1.96 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -797,6 +797,13 @@ void ZeroHighlight(Mesh * m)
   Tree_Action(m->Surfaces, ZeroHighlightSurface);
 }
 
+void ZeroHighlightEntity(Vertex * v, Curve * c, Surface * s)
+{
+  if(v) ZeroHighlightPoint(&v, NULL);
+  if(c) ZeroHighlightCurve(&c, NULL);
+  if(s) ZeroHighlightSurface(&s, NULL);
+}
+
 void ZeroHighlightEntityNum(int v, int c, int s)
 {
   if(v) {
diff --git a/Graphics/Graph2D.cpp b/Graphics/Graph2D.cpp
index 13b525dcb9c331419e6a1a9829ecaaaa9f81511d..c5822774bacb492f333365421b3eb1877dd531b8 100644
--- a/Graphics/Graph2D.cpp
+++ b/Graphics/Graph2D.cpp
@@ -1,6 +1,6 @@
-// $Id: Graph2D.cpp,v 1.55 2005-08-09 23:39:25 geuzaine Exp $
+// $Id: Graph2D.cpp,v 1.56 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/Iso.cpp b/Graphics/Iso.cpp
index 61d03af6fbef05bf991da6f0afc2fc565890ee39..a6875a062b783f043e81e06593bb7a2ffcd367c1 100644
--- a/Graphics/Iso.cpp
+++ b/Graphics/Iso.cpp
@@ -1,6 +1,6 @@
-// $Id: Iso.cpp,v 1.34 2005-05-21 17:27:03 geuzaine Exp $
+// $Id: Iso.cpp,v 1.35 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/Iso.h b/Graphics/Iso.h
index 2a04457df3b29159d6f1d4ad01274b0c4a9b37f2..cb1a351389aaf23f16a7e76833e5748ee6f09724 100644
--- a/Graphics/Iso.h
+++ b/Graphics/Iso.h
@@ -1,7 +1,7 @@
 #ifndef _ISO_H_
 #define _ISO_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/Makefile b/Graphics/Makefile
index a641d1a6a0a90d43efaf8fdac4f6a7cccb2617de..e029815e3ed35cde9bfab6ef48f66c42f8be9e4f 100644
--- a/Graphics/Makefile
+++ b/Graphics/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.74 2005-12-19 02:35:04 geuzaine Exp $
+# $Id: Makefile,v 1.75 2006-01-06 00:34:24 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index c8ad137e580c30f33920a1fb0c3bacaf5ceafe12..bbf00d5bdcb8bd685f8f320491ad4739f4c8385d 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,6 +1,6 @@
-// $Id: Mesh.cpp,v 1.147 2005-12-21 23:09:52 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.148 2006-01-06 00:34:24 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -551,7 +551,8 @@ void Draw_Mesh_Curve(void *a, void *b)
   theCurve = NULL;
 }
 
-void Draw_Mesh_Point(int num, double x, double y, double z, int degree, int visible)
+void Draw_Mesh_Point(int num, double x, double y, double z, int degree, int visible,
+		     int elementary=-1, int physical=-1, int partition=-1)
 {
   if(!(visible & VIS_MESH))
     return;
@@ -577,7 +578,28 @@ void Draw_Mesh_Point(int num, double x, double y, double z, int degree, int visi
 
   if(CTX.mesh.points_num) {
     char Num[100];
-    sprintf(Num, "%d", num);
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", x, y, z);
+    else if(CTX.mesh.label_type == 3){
+      if(partition > 0)
+	sprintf(Num, "%d", partition);
+      else
+	strcpy(Num, "NA");
+    }
+    else if(CTX.mesh.label_type == 2){
+      if(physical > 0)
+	sprintf(Num, "%d", physical);
+      else
+	strcpy(Num, "NA");
+    }
+    else if(CTX.mesh.label_type == 1){
+      if(elementary > 0)
+	sprintf(Num, "%d", elementary);
+      else
+	strcpy(Num, "NA");
+    }
+    else
+      sprintf(Num, "%d", num);
     double offset = 0.3 * (CTX.mesh.point_size + CTX.gl_fontsize) * CTX.pixel_equiv_x;
     glRasterPos3d(x + offset / CTX.s[0],
                   y + offset / CTX.s[1],
@@ -632,7 +654,8 @@ void Draw_Mesh_Line(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(s->V[i]->Num, X[i], Y[i], Z[i], 
-		      s->V[i]->Degree, s->V[i]->Visible);
+		      s->V[i]->Degree, s->V[i]->Visible,
+		      s->iEnt, thePhysical, iPart);
   }
   
   if(N == 3){
@@ -644,7 +667,8 @@ void Draw_Mesh_Line(void *a, void *b)
     Z[1] = Zc + CTX.mesh.explode * (s->VSUP[0]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(s->VSUP[0]->Num, X[1], Y[1], Z[1], 
-		      s->VSUP[0]->Degree, s->VSUP[0]->Visible);
+		      s->VSUP[0]->Degree, s->VSUP[0]->Visible,
+		      s->iEnt, thePhysical, iPart);
   }
 
   unsigned int col;
@@ -686,7 +710,9 @@ void Draw_Mesh_Line(void *a, void *b)
 
   if(CTX.mesh.lines_num && (numLabelsDisplayed % stepLabelsDisplayed == 0)) {
     glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
@@ -953,7 +979,8 @@ void Draw_Mesh_Triangle(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(s->V[i]->Num, X[i], Y[i], Z[i], 
-		      s->V[i]->Degree, s->V[i]->Visible);
+		      s->V[i]->Degree, s->V[i]->Visible,
+		      s->iEnt, thePhysical, iPart);
   }
 
   if(s->VSUP){
@@ -968,7 +995,8 @@ void Draw_Mesh_Triangle(void *a, void *b)
       Z2[i] = Zc + CTX.mesh.explode * (s->VSUP[i]->Pos.Z - Zc);
       if(CTX.mesh.points_per_element)
 	Draw_Mesh_Point(s->VSUP[i]->Num, X2[i], Y2[i], Z2[i], 
-			s->VSUP[i]->Degree, s->VSUP[i]->Visible);
+			s->VSUP[i]->Degree, s->VSUP[i]->Visible,
+			s->iEnt, thePhysical, iPart);
     }
   }
 
@@ -1056,7 +1084,9 @@ void Draw_Mesh_Triangle(void *a, void *b)
       glColor4ubv((GLubyte *) & CTX.color.mesh.line);
     else
       glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
@@ -1143,7 +1173,8 @@ void Draw_Mesh_Quadrangle(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (q->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(q->V[i]->Num, X[i], Y[i], Z[i], 
-		      q->V[i]->Degree, q->V[i]->Visible);
+		      q->V[i]->Degree, q->V[i]->Visible,
+		      q->iEnt, thePhysical, iPart);
   }
 
   if(q->VSUP){
@@ -1158,7 +1189,8 @@ void Draw_Mesh_Quadrangle(void *a, void *b)
       Z2[i] = Zc + CTX.mesh.explode * (q->VSUP[i]->Pos.Z - Zc);
       if(CTX.mesh.points_per_element)
 	Draw_Mesh_Point(q->VSUP[i]->Num, X2[i], Y2[i], Z2[i], 
-			q->VSUP[i]->Degree, q->VSUP[i]->Visible);
+			q->VSUP[i]->Degree, q->VSUP[i]->Visible,
+			q->iEnt, thePhysical, iPart);
     }
   }
 
@@ -1246,7 +1278,9 @@ void Draw_Mesh_Quadrangle(void *a, void *b)
       glColor4ubv((GLubyte *) & CTX.color.mesh.line);
     else
       glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
@@ -1335,7 +1369,8 @@ void Draw_Mesh_Tetrahedron(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(s->V[i]->Num, X[i], Y[i], Z[i], 
-		      s->V[i]->Degree, s->V[i]->Visible);
+		      s->V[i]->Degree, s->V[i]->Visible,
+		      s->iEnt, thePhysical, iPart);
   }
 
   if(s->VSUP){
@@ -1350,7 +1385,8 @@ void Draw_Mesh_Tetrahedron(void *a, void *b)
       Z2[i] = Zc + CTX.mesh.explode * (s->VSUP[i]->Pos.Z - Zc);
       if(CTX.mesh.points_per_element)
 	Draw_Mesh_Point(s->VSUP[i]->Num, X2[i], Y2[i], Z2[i], 
-			s->VSUP[i]->Degree, s->VSUP[i]->Visible);
+			s->VSUP[i]->Degree, s->VSUP[i]->Visible,
+			s->iEnt, thePhysical, iPart);
     }
   }
 
@@ -1446,7 +1482,9 @@ void Draw_Mesh_Tetrahedron(void *a, void *b)
       glColor4ubv((GLubyte *) & CTX.color.mesh.line);
     else
       glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
@@ -1523,7 +1561,8 @@ void Draw_Mesh_Hexahedron(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (h->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(h->V[i]->Num, X[i], Y[i], Z[i], 
-		      h->V[i]->Degree, h->V[i]->Visible);
+		      h->V[i]->Degree, h->V[i]->Visible,
+		      h->iEnt, thePhysical, iPart);
   }
 
   if(h->VSUP){
@@ -1538,7 +1577,8 @@ void Draw_Mesh_Hexahedron(void *a, void *b)
       Z2[i] = Zc + CTX.mesh.explode * (h->VSUP[i]->Pos.Z - Zc);
       if(CTX.mesh.points_per_element)
 	Draw_Mesh_Point(h->VSUP[i]->Num, X2[i], Y2[i], Z2[i], 
-			h->VSUP[i]->Degree, h->VSUP[i]->Visible);
+			h->VSUP[i]->Degree, h->VSUP[i]->Visible,
+			h->iEnt, thePhysical, iPart);
     }
   }
 
@@ -1646,7 +1686,9 @@ void Draw_Mesh_Hexahedron(void *a, void *b)
       glColor4ubv((GLubyte *) & CTX.color.mesh.line);
     else
       glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
@@ -1723,7 +1765,8 @@ void Draw_Mesh_Prism(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(p->V[i]->Num, X[i], Y[i], Z[i], 
-		      p->V[i]->Degree, p->V[i]->Visible);
+		      p->V[i]->Degree, p->V[i]->Visible,
+		      p->iEnt, thePhysical, iPart);
   }
 
   if(p->VSUP){
@@ -1743,7 +1786,8 @@ void Draw_Mesh_Prism(void *a, void *b)
       Z2[i] = Zc + CTX.mesh.explode * (p->VSUP[i]->Pos.Z - Zc);
       if(CTX.mesh.points_per_element)
 	Draw_Mesh_Point(p->VSUP[i]->Num, X2[i], Y2[i], Z2[i], 
-			p->VSUP[i]->Degree, p->VSUP[i]->Visible);
+			p->VSUP[i]->Degree, p->VSUP[i]->Visible,
+			p->iEnt, thePhysical, iPart);
     }
   }
 
@@ -1861,7 +1905,9 @@ void Draw_Mesh_Prism(void *a, void *b)
       glColor4ubv((GLubyte *) & CTX.color.mesh.line);
     else
       glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
@@ -1938,7 +1984,8 @@ void Draw_Mesh_Pyramid(void *a, void *b)
     Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc);
     if(CTX.mesh.points_per_element)
       Draw_Mesh_Point(p->V[i]->Num, X[i], Y[i], Z[i], 
-		      p->V[i]->Degree, p->V[i]->Visible);
+		      p->V[i]->Degree, p->V[i]->Visible,
+		      p->iEnt, thePhysical, iPart);
   }
 
   if(p->VSUP){
@@ -1958,7 +2005,8 @@ void Draw_Mesh_Pyramid(void *a, void *b)
       Z2[i] = Zc + CTX.mesh.explode * (p->VSUP[i]->Pos.Z - Zc);
       if(CTX.mesh.points_per_element)
 	Draw_Mesh_Point(p->VSUP[i]->Num, X2[i], Y2[i], Z2[i], 
-			p->VSUP[i]->Degree, p->VSUP[i]->Visible);
+			p->VSUP[i]->Degree, p->VSUP[i]->Visible,
+			p->iEnt, thePhysical, iPart);
     }
   }
 
@@ -2048,7 +2096,9 @@ void Draw_Mesh_Pyramid(void *a, void *b)
       glColor4ubv((GLubyte *) & CTX.color.mesh.line);
     else
       glColor4ubv((GLubyte *) & col);
-    if(CTX.mesh.label_type == 3)
+    if(CTX.mesh.label_type == 4)
+      sprintf(Num, "(%g,%g,%g)", Xc, Yc, Zc);
+    else if(CTX.mesh.label_type == 3)
       sprintf(Num, "%d", iPart);
     else if(CTX.mesh.label_type == 2)
       sprintf(Num, "%d", thePhysical);
diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp
index fcef5511eba9652542f6b30cdc976b5cc582d02c..eb941c110168fafac24330b86009df9a7c703844 100644
--- a/Graphics/Post.cpp
+++ b/Graphics/Post.cpp
@@ -1,6 +1,6 @@
-// $Id: Post.cpp,v 1.102 2005-09-02 18:04:02 geuzaine Exp $
+// $Id: Post.cpp,v 1.103 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp
index 369d8e1708c8bb99beef93bc530625e4094af75a..41c947c35c8b10b2c1e7d6bfeaf253a3872dc196 100644
--- a/Graphics/PostElement.cpp
+++ b/Graphics/PostElement.cpp
@@ -1,6 +1,6 @@
-// $Id: PostElement.cpp,v 1.69 2005-11-20 03:58:29 geuzaine Exp $
+// $Id: PostElement.cpp,v 1.70 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/ReadImg.cpp b/Graphics/ReadImg.cpp
index 72aff6de2a46bda4d659d922695809b3d801b10f..7866b9ae31e6e8d04adaba5d7a3d32d93d01e278 100644
--- a/Graphics/ReadImg.cpp
+++ b/Graphics/ReadImg.cpp
@@ -1,6 +1,6 @@
-// $Id: ReadImg.cpp,v 1.9 2005-01-01 19:35:29 geuzaine Exp $
+// $Id: ReadImg.cpp,v 1.10 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Graphics/ReadImg.h b/Graphics/ReadImg.h
index 66a7d4c72b4bc8a36e033801fd726a92c3947ada..bd92bc4b2e30d80a77836a044295fb3dcc380c74 100644
--- a/Graphics/ReadImg.h
+++ b/Graphics/ReadImg.h
@@ -1,25 +1,25 @@
-#ifndef _READ_IMG_
-#define _READ_IMG_
-
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-// USA.
-// 
-// Please report all bugs and problems to <gmsh@geuz.org>.
-
-void read_pnm (char *name);
-
-#endif
+#ifndef _READ_IMG_
+#define _READ_IMG_
+
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+// 
+// Please report all bugs and problems to <gmsh@geuz.org>.
+
+void read_pnm (char *name);
+
+#endif
diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp
index b9ec804ed3a850d10e8b928c7fb7b620e8ca63d9..3b49eff6d595d3fc3a7f8d4e5000226334a2d64f 100644
--- a/Graphics/Scale.cpp
+++ b/Graphics/Scale.cpp
@@ -1,6 +1,6 @@
-// $Id: Scale.cpp,v 1.61 2005-07-08 22:07:39 geuzaine Exp $
+// $Id: Scale.cpp,v 1.62 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Makefile b/Makefile
index 2bfb4c2e2c110461910465f785f00c071b9fe3d6..28be10ac0b54df5e38113edab67fc5c87e1193f5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.407 2005-11-28 16:56:27 geuzaine Exp $
+# $Id: Makefile,v 1.408 2006-01-06 00:34:20 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,8 +22,8 @@
 include variables
 
 GMSH_MAJOR_VERSION = 1
-GMSH_MINOR_VERSION = 61
-GMSH_PATCH_VERSION = 3
+GMSH_MINOR_VERSION = 62
+GMSH_PATCH_VERSION = 0
 GMSH_EXTRA_VERSION = "-cvs"
 
 GMSH_VERSION = ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}
@@ -223,7 +223,7 @@ package-mac:
         "    <key>CFBundleIconFile</key><string>Gmsh.icns</string>\n"\
         "    <key>CFBundleSignature</key><string>GMSH</string>\n"\
         "    <key>CFBundleGetInfoString</key><string>Gmsh ${GMSH_VERSION},"\
-                  "Copyright (C) 1997-2005 C. Geuzaine and J.-F. Remacle</string>\n"\
+                  "Copyright (C) 1997-2006 C. Geuzaine and J.-F. Remacle</string>\n"\
         "    <key>CFBundleIdentifier</key><string>org.geuz.Gmsh</string>\n"\
         "    <key>CFBundleDocumentTypes</key>\n"\
         "      <array>\n"\
diff --git a/Mesh/1D_Mesh.cpp b/Mesh/1D_Mesh.cpp
index d5167d461fc7fdc98d60e650f8f010286a2146fe..f111c62d010ae9b3c68a0b43010e392c0c4131b8 100644
--- a/Mesh/1D_Mesh.cpp
+++ b/Mesh/1D_Mesh.cpp
@@ -1,6 +1,6 @@
-// $Id: 1D_Mesh.cpp,v 1.45 2005-05-15 01:44:26 geuzaine Exp $
+// $Id: 1D_Mesh.cpp,v 1.46 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_BGMesh.cpp b/Mesh/2D_BGMesh.cpp
index 58e0c3926753c3851de7dbcb5a71cb227890aa97..345acd67887e31a97217e5f7bd12685ce4b2cc56 100644
--- a/Mesh/2D_BGMesh.cpp
+++ b/Mesh/2D_BGMesh.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_BGMesh.cpp,v 1.16 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_BGMesh.cpp,v 1.17 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Bowyer.cpp b/Mesh/2D_Bowyer.cpp
index 870a1cbbbfc2ec9b2c526ae5f18df474902d6d71..12eaeff90a776cc3a31f859cdec851d6ce12a4b0 100644
--- a/Mesh/2D_Bowyer.cpp
+++ b/Mesh/2D_Bowyer.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Bowyer.cpp,v 1.16 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Bowyer.cpp,v 1.17 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Bricks.cpp b/Mesh/2D_Bricks.cpp
index 1407e2a0e404a774c1f0dab8cbe72341e8c65641..d39540129c7096eda4b763e60bd66f5eec78c66a 100644
--- a/Mesh/2D_Bricks.cpp
+++ b/Mesh/2D_Bricks.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Bricks.cpp,v 1.14 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Bricks.cpp,v 1.15 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Cylindrical.cpp b/Mesh/2D_Cylindrical.cpp
index b26432d53c53df9c5b6e0b36ca96d2df9d6a35b3..7c53788e880f7865858d7f2d96f8cffd0da608ad 100644
--- a/Mesh/2D_Cylindrical.cpp
+++ b/Mesh/2D_Cylindrical.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Cylindrical.cpp,v 1.19 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Cylindrical.cpp,v 1.20 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_DivAndConq.cpp b/Mesh/2D_DivAndConq.cpp
index 63580b3858a72be178ae985741298bdad784e138..bdb0131b99b0b87e1b0f381f178bc34dd708c8be 100644
--- a/Mesh/2D_DivAndConq.cpp
+++ b/Mesh/2D_DivAndConq.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_DivAndConq.cpp,v 1.20 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_DivAndConq.cpp,v 1.21 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Elliptic.cpp b/Mesh/2D_Elliptic.cpp
index 2db66d13d2388a50e2e99d5f615188fcfadba372..31f4b9e09ebeaba26fcb5dd37140c3b0fd67c1d2 100644
--- a/Mesh/2D_Elliptic.cpp
+++ b/Mesh/2D_Elliptic.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Elliptic.cpp,v 1.22 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Elliptic.cpp,v 1.23 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_InitMesh.cpp b/Mesh/2D_InitMesh.cpp
index 72a99285d9845855cfc2b9adc77982f2748f1721..4fdcc883f48e80b37752391a0713a4b5ce4bdee2 100644
--- a/Mesh/2D_InitMesh.cpp
+++ b/Mesh/2D_InitMesh.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_InitMesh.cpp,v 1.21 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_InitMesh.cpp,v 1.22 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Links.cpp b/Mesh/2D_Links.cpp
index dcee70da5d37c3b2ff71f67fafa4295c56f5f642..af549451145a0c8854339963354b4c4de2d93c37 100644
--- a/Mesh/2D_Links.cpp
+++ b/Mesh/2D_Links.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Links.cpp,v 1.20 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Links.cpp,v 1.21 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
index 2fcc67e0e7c79ae048f3ca6175bab769b06d2af7..e67b0c4e3a06860a9e51f8117be7af88f5f22265 100644
--- a/Mesh/2D_Mesh.cpp
+++ b/Mesh/2D_Mesh.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Mesh.cpp,v 1.79 2005-08-19 14:07:32 remacle Exp $
+// $Id: 2D_Mesh.cpp,v 1.80 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Mesh.h b/Mesh/2D_Mesh.h
index 0cbef4b0ebc99e3ab648db9be71dbf3a8504c36e..191eb222c9c0f08d5499d143e0ef35f53d3f1de4 100644
--- a/Mesh/2D_Mesh.h
+++ b/Mesh/2D_Mesh.h
@@ -1,7 +1,7 @@
 #ifndef _2D_MESH_H_
 #define _2D_MESH_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Mesh_Aniso.cpp b/Mesh/2D_Mesh_Aniso.cpp
index eb2b2ecbf9d7ce742be2133333cfbae8b125525b..5d05bc1dd166c965087b08b8c5729540c5bfc349 100644
--- a/Mesh/2D_Mesh_Aniso.cpp
+++ b/Mesh/2D_Mesh_Aniso.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Mesh_Aniso.cpp,v 1.45 2005-06-20 17:02:45 geuzaine Exp $
+// $Id: 2D_Mesh_Aniso.cpp,v 1.46 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Mesh_Triangle.cpp b/Mesh/2D_Mesh_Triangle.cpp
index ba900f0701705d7a20e087a28bcb036629fc9f44..66a7bb346f6980be13b14552dd0087abbbe8aaeb 100644
--- a/Mesh/2D_Mesh_Triangle.cpp
+++ b/Mesh/2D_Mesh_Triangle.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Mesh_Triangle.cpp,v 1.13 2005-11-25 23:49:04 geuzaine Exp $
+// $Id: 2D_Mesh_Triangle.cpp,v 1.14 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Parametric.cpp b/Mesh/2D_Parametric.cpp
index 2599d58b55c91b5ccb5d6ba4987b596ccc2781de..a1b3d63a6b7497bbdfdf0e7f66207706559890b1 100644
--- a/Mesh/2D_Parametric.cpp
+++ b/Mesh/2D_Parametric.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Parametric.cpp,v 1.15 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Parametric.cpp,v 1.16 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Recombine.cpp b/Mesh/2D_Recombine.cpp
index 05450a548b251758a9f3c90bf6e20ad93348f558..0738a6062686439c44e863a999d0e2fbe93f3235 100644
--- a/Mesh/2D_Recombine.cpp
+++ b/Mesh/2D_Recombine.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Recombine.cpp,v 1.25 2005-06-10 00:31:28 geuzaine Exp $
+// $Id: 2D_Recombine.cpp,v 1.26 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Transfinite.cpp b/Mesh/2D_Transfinite.cpp
index ea0915918de647aae930964c49eda82c0a75d93d..df5581e06612047b65f823cbd03debcb89149858 100644
--- a/Mesh/2D_Transfinite.cpp
+++ b/Mesh/2D_Transfinite.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Transfinite.cpp,v 1.4 2005-07-15 10:31:06 geuzaine Exp $
+// $Id: 2D_Transfinite.cpp,v 1.5 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Tree.cpp b/Mesh/2D_Tree.cpp
index c49b518c83aa1b6f5e3285a7aa30dc109130aa77..86a3580f13ee8ec315e0a50c63d82b17fc2fd385 100644
--- a/Mesh/2D_Tree.cpp
+++ b/Mesh/2D_Tree.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Tree.cpp,v 1.14 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Tree.cpp,v 1.15 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/2D_Util.cpp b/Mesh/2D_Util.cpp
index f3f0ce4480e8b012cef1f84bf18cb0d266aba65c..5c9086b5af9de236ab58d17758c79307a6e2e213 100644
--- a/Mesh/2D_Util.cpp
+++ b/Mesh/2D_Util.cpp
@@ -1,6 +1,6 @@
-// $Id: 2D_Util.cpp,v 1.23 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 2D_Util.cpp,v 1.24 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_BGMesh.cpp b/Mesh/3D_BGMesh.cpp
index 6e6d8fb435e9c371c64a403ef93e0dbfa2d48509..a641fe9a397da5d01be610f4a3135307b303740b 100644
--- a/Mesh/3D_BGMesh.cpp
+++ b/Mesh/3D_BGMesh.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_BGMesh.cpp,v 1.37 2005-06-08 19:12:05 geuzaine Exp $
+// $Id: 3D_BGMesh.cpp,v 1.38 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Bricks.cpp b/Mesh/3D_Bricks.cpp
index 57e9d28f1560a3c68aedaf95d88e0f5e3285915f..40a16fe5e17c05ecedcbb7aa3405b2687affb21a 100644
--- a/Mesh/3D_Bricks.cpp
+++ b/Mesh/3D_Bricks.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Bricks.cpp,v 1.16 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 3D_Bricks.cpp,v 1.17 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Coherence.cpp b/Mesh/3D_Coherence.cpp
index fdfeeced999be2e0319414373afb049eed2c6895..83da4aaa4bce483aed0466e68e5653d368eab2d1 100644
--- a/Mesh/3D_Coherence.cpp
+++ b/Mesh/3D_Coherence.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Coherence.cpp,v 1.35 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 3D_Coherence.cpp,v 1.36 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Divide.cpp b/Mesh/3D_Divide.cpp
index 8032271bb86dfc18ec1d00d459e8927fcc4c7ccd..24caf4ca7208bcb4c12d45855c87a9887378327b 100644
--- a/Mesh/3D_Divide.cpp
+++ b/Mesh/3D_Divide.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Divide.cpp,v 1.23 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 3D_Divide.cpp,v 1.24 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index 45393e02317db767fdf2f91adb37a5a357ccdb32..a0a96e01806426b981213e983171149e829a5918 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Extrude.cpp,v 1.90 2005-06-10 22:50:49 geuzaine Exp $
+// $Id: 3D_Extrude.cpp,v 1.91 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Extrude_Old.cpp b/Mesh/3D_Extrude_Old.cpp
index 7aef18d3b91cd7bbdcd40ba6bcaa51815ec93bad..b62d7f20c81e1c7480f144c62f541faa6155b8a7 100644
--- a/Mesh/3D_Extrude_Old.cpp
+++ b/Mesh/3D_Extrude_Old.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Extrude_Old.cpp,v 1.38 2005-07-03 08:00:58 geuzaine Exp $
+// $Id: 3D_Extrude_Old.cpp,v 1.39 2006-01-06 00:34:25 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Mesh.cpp b/Mesh/3D_Mesh.cpp
index 2c99463e1080fb4de045770be1ccf649be20276a..e6e777b7558c07f0fa232cbcaa56a1732c1a8e26 100644
--- a/Mesh/3D_Mesh.cpp
+++ b/Mesh/3D_Mesh.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Mesh.cpp,v 1.68 2005-12-08 15:35:20 remacle Exp $
+// $Id: 3D_Mesh.cpp,v 1.69 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Mesh.h b/Mesh/3D_Mesh.h
index f0faf7e6564cee8b104d4abc6dfa9a097ff10301..f4c082be2f233b22c615fde516ca8d7c47802047 100644
--- a/Mesh/3D_Mesh.h
+++ b/Mesh/3D_Mesh.h
@@ -1,7 +1,7 @@
 #ifndef _3D_MESH_H_
 #define _3D_MESH_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Mesh_Netgen.cpp b/Mesh/3D_Mesh_Netgen.cpp
index 416ec523588a824f12ccabcc221af4602b64874e..d200e8eaa88dd40f5ed585c172e886d2fb0a65d7 100644
--- a/Mesh/3D_Mesh_Netgen.cpp
+++ b/Mesh/3D_Mesh_Netgen.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Mesh_Netgen.cpp,v 1.17 2005-11-28 19:19:45 geuzaine Exp $
+// $Id: 3D_Mesh_Netgen.cpp,v 1.18 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Mesh_Old.cpp b/Mesh/3D_Mesh_Old.cpp
index 4d5e22bceb735a57a68a5941ab07c76b721db783..e17eaf6b05f8f476d499ab5bb9cecb0fa2d47071 100644
--- a/Mesh/3D_Mesh_Old.cpp
+++ b/Mesh/3D_Mesh_Old.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Mesh_Old.cpp,v 1.14 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: 3D_Mesh_Old.cpp,v 1.15 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Mesh_Tetgen.cpp b/Mesh/3D_Mesh_Tetgen.cpp
index 3e1ba5b3454908069842a366e85ffa6ee49d236d..2ff9102a36f64468925f5624afca87b17e758407 100644
--- a/Mesh/3D_Mesh_Tetgen.cpp
+++ b/Mesh/3D_Mesh_Tetgen.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Mesh_Tetgen.cpp,v 1.3 2005-08-22 00:29:11 geuzaine Exp $
+// $Id: 3D_Mesh_Tetgen.cpp,v 1.4 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/3D_Transfinite.cpp b/Mesh/3D_Transfinite.cpp
index 40c717f4a8b9b2329006863819596bbf88f8c53a..3ea0e019a691450cd27ecb4e38d5058891375675 100644
--- a/Mesh/3D_Transfinite.cpp
+++ b/Mesh/3D_Transfinite.cpp
@@ -1,6 +1,6 @@
-// $Id: 3D_Transfinite.cpp,v 1.4 2005-11-28 19:19:45 geuzaine Exp $
+// $Id: 3D_Transfinite.cpp,v 1.5 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/BDS.cpp b/Mesh/BDS.cpp
index bfa28416a0c6caaf6aba1a6431effe123a6d8eab..388634ceb3c8e4debc694c586743988444150bf2 100644
--- a/Mesh/BDS.cpp
+++ b/Mesh/BDS.cpp
@@ -1,6 +1,6 @@
-// $Id: BDS.cpp,v 1.46 2005-12-11 14:27:46 remacle Exp $
+// $Id: BDS.cpp,v 1.47 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/BDS.h b/Mesh/BDS.h
index a09014ebdc18d1a25a2c76d274301c9a0523cd20..c3b957cc32f907f6a1131f861ce242855246dd43 100644
--- a/Mesh/BDS.h
+++ b/Mesh/BDS.h
@@ -1,4 +1,4 @@
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
index 1df8e6ed8ab12acf88bf3652fcb241f057ae7a3d..d02ae8ec864dc765f80f9d26f0ff2e272c590ebe 100644
--- a/Mesh/Create.cpp
+++ b/Mesh/Create.cpp
@@ -1,6 +1,6 @@
-// $Id: Create.cpp,v 1.79 2005-11-28 19:13:49 geuzaine Exp $
+// $Id: Create.cpp,v 1.80 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Create.h b/Mesh/Create.h
index e3a23c14bcc09377f62a5b9c4b4f07da4b584e95..25e2e755b85e741fab4b9daafd23fc7557946f5d 100644
--- a/Mesh/Create.h
+++ b/Mesh/Create.h
@@ -1,7 +1,7 @@
 #ifndef _CREATE_H_
 #define _CREATE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/CrossData.cpp b/Mesh/CrossData.cpp
index 417b0a3aaeb763f28d8373c80776b3490442e14e..1dc581bd5b6a94bf7847a92b1b450d912101fb37 100644
--- a/Mesh/CrossData.cpp
+++ b/Mesh/CrossData.cpp
@@ -1,6 +1,6 @@
-// $Id: CrossData.cpp,v 1.13 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: CrossData.cpp,v 1.14 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/DiscreteSurface.cpp b/Mesh/DiscreteSurface.cpp
index cb1b6ea8b89a8d0c9ef5ae9d4fff5204e31490a4..aa153a996b486342d3995be08ae97e905e6e0880 100644
--- a/Mesh/DiscreteSurface.cpp
+++ b/Mesh/DiscreteSurface.cpp
@@ -1,6 +1,6 @@
-// $Id: DiscreteSurface.cpp,v 1.34 2005-12-08 15:35:20 remacle Exp $
+// $Id: DiscreteSurface.cpp,v 1.35 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Edge.cpp b/Mesh/Edge.cpp
index 1c77f113328abf6762d26d7645454f57c58f791a..756768e63e869848847f1670de4b5cc7aa73750f 100644
--- a/Mesh/Edge.cpp
+++ b/Mesh/Edge.cpp
@@ -1,6 +1,6 @@
-// $Id: Edge.cpp,v 1.19 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: Edge.cpp,v 1.20 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Edge.h b/Mesh/Edge.h
index 99e0e4d691418a0a86a76c37d6832b7e9b10b92e..94175f7a9646efe41554d18c0db6e237a431cf5b 100644
--- a/Mesh/Edge.h
+++ b/Mesh/Edge.h
@@ -1,7 +1,7 @@
 #ifndef _EDGE_H_
 #define _EDGE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Element.cpp b/Mesh/Element.cpp
index 3cabd1be036950f42a078a92257145e35e3fbddf..91299174585ec37aee2816ab6189e6f50c84a425 100644
--- a/Mesh/Element.cpp
+++ b/Mesh/Element.cpp
@@ -1,6 +1,6 @@
-// $Id: Element.cpp,v 1.9 2005-11-28 15:59:52 geuzaine Exp $
+// $Id: Element.cpp,v 1.10 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Element.h b/Mesh/Element.h
index 387da33950b9b3062fc6ffd8dae004017e61f080..078a355bd5cc664fa848edce0372fb3f79ea52dd 100644
--- a/Mesh/Element.h
+++ b/Mesh/Element.h
@@ -1,7 +1,7 @@
 #ifndef _ELEMENT_H_
 #define _ELEMENT_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Face.cpp b/Mesh/Face.cpp
index a4c47109087eb7369755ae1e1988d1c8ca760696..c2db9dc190bf5d1e9d39434fab626d4c889ba4ad 100644
--- a/Mesh/Face.cpp
+++ b/Mesh/Face.cpp
@@ -1,6 +1,6 @@
-// $Id: Face.cpp,v 1.3 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: Face.cpp,v 1.4 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Face.h b/Mesh/Face.h
index 85c34bed7876cee526ed169bd3c481c8e6b7e609..0557a6105df715cc5ba062ef4499694bbba0d240 100644
--- a/Mesh/Face.h
+++ b/Mesh/Face.h
@@ -1,7 +1,7 @@
 #ifndef _FACE_H_
 #define _FACE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index 83f108f9c4f7172f3177c18da54ea959b21d4371..50e0f073ac4ff17bddb2872c4564c82eb85ae6df 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -1,6 +1,6 @@
-// $Id: Generator.cpp,v 1.73 2005-10-26 15:19:24 geuzaine Exp $
+// $Id: Generator.cpp,v 1.74 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Interpolation.cpp b/Mesh/Interpolation.cpp
index d75c81b9256b9a9f11d69bc33c121f1c6adcd4fc..16b51a20ddf4412728bfdf72b28320cb775fd080 100644
--- a/Mesh/Interpolation.cpp
+++ b/Mesh/Interpolation.cpp
@@ -1,6 +1,6 @@
-// $Id: Interpolation.cpp,v 1.26 2005-01-01 19:35:30 geuzaine Exp $
+// $Id: Interpolation.cpp,v 1.27 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Interpolation.h b/Mesh/Interpolation.h
index 8adeb24bbca11658d0aea2f3a2bb65228579fc90..f58638c91bb690d41b8168d29ed37d52768679ea 100644
--- a/Mesh/Interpolation.h
+++ b/Mesh/Interpolation.h
@@ -1,7 +1,7 @@
 #ifndef _INTERPOLATION_H_
 #define _INTERPOLATION_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Makefile b/Mesh/Makefile
index a1d4947797a770569a695195d2e89d1210b98443..e9c5693cfcbb10b1a7f62462c8a236c582625029 100644
--- a/Mesh/Makefile
+++ b/Mesh/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.99 2005-12-19 02:35:04 geuzaine Exp $
+# $Id: Makefile,v 1.100 2006-01-06 00:34:26 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Matrix.h b/Mesh/Matrix.h
index 07461d84e28669cdb61d3a96c470015326770404..cd2f278862b34ea40573a79ab24c4bee9c8c47de 100644
--- a/Mesh/Matrix.h
+++ b/Mesh/Matrix.h
@@ -1,7 +1,7 @@
 #ifndef _GMSH_MATRIX_
 #define _GMSH_MATRIX_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 1f2a763246a6c34a7c86e19b04cc3db942629533..daf026dc0353bfd5cbefa92efaf435e8f2aca6b5 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -1,7 +1,7 @@
 #ifndef _MESH_H_
 #define _MESH_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/MeshQuality.cpp b/Mesh/MeshQuality.cpp
index 265ae70e210238d5bf30d3600fa6b623bbc6b08a..ea27491bc00c35b51c36797965eaddd7abc8ae0b 100644
--- a/Mesh/MeshQuality.cpp
+++ b/Mesh/MeshQuality.cpp
@@ -1,6 +1,6 @@
-// $Id: MeshQuality.cpp,v 1.16 2005-01-01 19:35:31 geuzaine Exp $
+// $Id: MeshQuality.cpp,v 1.17 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Metric.cpp b/Mesh/Metric.cpp
index ba3811fa57f6b71f64a7c4dcc3137b73fb31acd1..2fc659ea82919095308dc37e988e58fef9c817b0 100644
--- a/Mesh/Metric.cpp
+++ b/Mesh/Metric.cpp
@@ -1,6 +1,6 @@
-// $Id: Metric.cpp,v 1.20 2005-01-01 19:35:31 geuzaine Exp $
+// $Id: Metric.cpp,v 1.21 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Metric.h b/Mesh/Metric.h
index bbf27f1d7a0dbad87f416bda0da2713be550f403..896e1427a301195d381ba5660ad7d76012b0941f 100644
--- a/Mesh/Metric.h
+++ b/Mesh/Metric.h
@@ -1,7 +1,7 @@
 #ifndef _METRIC_H_
 #define _METRIC_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Nurbs.cpp b/Mesh/Nurbs.cpp
index 06b7bbbf0d03ad3b05a201cddfc5ccbfc3b9e5c9..2aec85d72ca9ff154ece3abca23994a69f606d8b 100644
--- a/Mesh/Nurbs.cpp
+++ b/Mesh/Nurbs.cpp
@@ -1,6 +1,6 @@
-// $Id: Nurbs.cpp,v 1.16 2005-01-01 19:35:31 geuzaine Exp $
+// $Id: Nurbs.cpp,v 1.17 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Nurbs.h b/Mesh/Nurbs.h
index b0fddb6e1cd9a448271261e7bbb8efea57644264..c7057f7f57dda1baba64934ae1d79d9f45027f70 100644
--- a/Mesh/Nurbs.h
+++ b/Mesh/Nurbs.h
@@ -1,7 +1,7 @@
 #ifndef _NURBS_H_
 #define _NURBS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/PartitionMesh.cpp b/Mesh/PartitionMesh.cpp
index b07224452380c1692ac82c1c011dc695a55f48de..8f72583d6dda700de0fcd6832d6cf3a50c6adfc2 100644
--- a/Mesh/PartitionMesh.cpp
+++ b/Mesh/PartitionMesh.cpp
@@ -1,6 +1,6 @@
-// $Id: PartitionMesh.cpp,v 1.6 2005-12-08 15:35:20 remacle Exp $
+// $Id: PartitionMesh.cpp,v 1.7 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Print_Mesh.cpp b/Mesh/Print_Mesh.cpp
index 811c2ada87d37d474a47c2c11f2012abf99694ad..6c54a7aece6733488ff322d7d876af67dbf95613 100644
--- a/Mesh/Print_Mesh.cpp
+++ b/Mesh/Print_Mesh.cpp
@@ -1,6 +1,6 @@
-// $Id: Print_Mesh.cpp,v 1.67 2005-11-03 06:46:54 geuzaine Exp $
+// $Id: Print_Mesh.cpp,v 1.68 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Read_Mesh.cpp b/Mesh/Read_Mesh.cpp
index c2041c63eb9e6857799221f0c8dee453e124f575..68d6089158e63e1ea707049f10f36bfde2d7877e 100644
--- a/Mesh/Read_Mesh.cpp
+++ b/Mesh/Read_Mesh.cpp
@@ -1,6 +1,6 @@
-// $Id: Read_Mesh.cpp,v 1.95 2005-10-16 03:15:31 geuzaine Exp $
+// $Id: Read_Mesh.cpp,v 1.96 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/SecondOrder.cpp b/Mesh/SecondOrder.cpp
index a7a17cdd2e4ac4371afe34742521fede8b98790e..128135a8a915942fccc9dcd6d5b4f8b1328a26d4 100644
--- a/Mesh/SecondOrder.cpp
+++ b/Mesh/SecondOrder.cpp
@@ -1,6 +1,6 @@
-// $Id: SecondOrder.cpp,v 1.34 2005-10-26 15:19:24 geuzaine Exp $
+// $Id: SecondOrder.cpp,v 1.35 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Simplex.cpp b/Mesh/Simplex.cpp
index 0fb506c7fcfc9ac8becdd5922ed5da3e9d7e5c3b..276727ee6c18b94431f936120974df21e03a6e48 100644
--- a/Mesh/Simplex.cpp
+++ b/Mesh/Simplex.cpp
@@ -1,6 +1,6 @@
-// $Id: Simplex.cpp,v 1.44 2005-07-03 08:02:24 geuzaine Exp $
+// $Id: Simplex.cpp,v 1.45 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Simplex.h b/Mesh/Simplex.h
index 39f6070c653fee47793d257e88e9202c2a76b472..041f8ec7a0566ab7ac498bd454c8ec2a14a6c2ae 100644
--- a/Mesh/Simplex.h
+++ b/Mesh/Simplex.h
@@ -1,7 +1,7 @@
 #ifndef _SIMPLEX_H_
 #define _SIMPLEX_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Smoothing.cpp b/Mesh/Smoothing.cpp
index 8634831d804c99053672a1a48b41df5adbab2664..df0a826bed75e0e53001475c797acfa87b1ccfeb 100644
--- a/Mesh/Smoothing.cpp
+++ b/Mesh/Smoothing.cpp
@@ -1,6 +1,6 @@
-// $Id: Smoothing.cpp,v 1.15 2005-01-01 19:35:31 geuzaine Exp $
+// $Id: Smoothing.cpp,v 1.16 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/SwapEdge.cpp b/Mesh/SwapEdge.cpp
index 5e896a7872f89f436fb54a966a2c23a86661c13e..283badcc43f24875de8f01589a829f23bfe96747 100644
--- a/Mesh/SwapEdge.cpp
+++ b/Mesh/SwapEdge.cpp
@@ -1,6 +1,6 @@
-// $Id: SwapEdge.cpp,v 1.17 2005-01-01 19:35:31 geuzaine Exp $
+// $Id: SwapEdge.cpp,v 1.18 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/SwapPatterns.h b/Mesh/SwapPatterns.h
index 89a79669b2faa612766212a28fc70556f7e2eaa8..879e68c298bc8cd63bf6a3f554bbfac0ba873a66 100644
--- a/Mesh/SwapPatterns.h
+++ b/Mesh/SwapPatterns.h
@@ -1,7 +1,7 @@
 #ifndef _SWAP_PATTERNS_H_
 #define _SWAP_PATTERNS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Utils.cpp b/Mesh/Utils.cpp
index 6027816e8b743e1f958643ba0f5bae32d1bab410..58366d45c1af7aa4625a8b8d4e8676961e6408a4 100644
--- a/Mesh/Utils.cpp
+++ b/Mesh/Utils.cpp
@@ -1,6 +1,6 @@
-// $Id: Utils.cpp,v 1.29 2005-12-13 23:29:15 geuzaine Exp $
+// $Id: Utils.cpp,v 1.30 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Utils.h b/Mesh/Utils.h
index 89595939e0543614a3da8781e5c9c84add43a536..c3eeff146809268251f7609dfc29f976e4eef45f 100644
--- a/Mesh/Utils.h
+++ b/Mesh/Utils.h
@@ -1,7 +1,7 @@
 #ifndef _UTILS_H_
 #define _UTILS_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Vertex.cpp b/Mesh/Vertex.cpp
index ed810296fa30dc498c5fad72fad9d33fd88acd4b..887638c54f6a72a3db1a36ce875f90301982212f 100644
--- a/Mesh/Vertex.cpp
+++ b/Mesh/Vertex.cpp
@@ -1,6 +1,6 @@
-// $Id: Vertex.cpp,v 1.28 2005-11-28 19:13:49 geuzaine Exp $
+// $Id: Vertex.cpp,v 1.29 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Mesh/Vertex.h b/Mesh/Vertex.h
index b59dfd33c2d893f914a20ae74bfc4f7338009a84..da09302928ab7dbefa6b09e6008f0b3e6a64a0a1 100644
--- a/Mesh/Vertex.h
+++ b/Mesh/Vertex.h
@@ -1,7 +1,7 @@
 #ifndef _VERTEX_H_
 #define _VERTEX_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Numeric/EigSolve.cpp b/Numeric/EigSolve.cpp
index fe353e104a5bb6803e81b58f2b57dd7176259ec3..f04c0bffb9ecc34729686a44e7194bbf6c9f24cc 100644
--- a/Numeric/EigSolve.cpp
+++ b/Numeric/EigSolve.cpp
@@ -1,6 +1,6 @@
-// $Id: EigSolve.cpp,v 1.5 2005-01-01 19:35:32 geuzaine Exp $
+// $Id: EigSolve.cpp,v 1.6 2006-01-06 00:34:26 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Numeric/EigSolve.h b/Numeric/EigSolve.h
index b7984a06774c7734a593a24f01b9fe26f38c1a49..a392aab6f727feb39dfb608d39cb4efa575a555d 100644
--- a/Numeric/EigSolve.h
+++ b/Numeric/EigSolve.h
@@ -1,7 +1,7 @@
 #ifndef _EIGSOLVE_H_
 #define _EIGSOLVE_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Numeric/Makefile b/Numeric/Makefile
index 2e6752736dbf68be28322810b587676b10de18ff..81669352cb61c9a01985ed544e1452ad9d98e3c3 100644
--- a/Numeric/Makefile
+++ b/Numeric/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.22 2005-12-19 02:35:04 geuzaine Exp $
+# $Id: Makefile,v 1.23 2006-01-06 00:34:27 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Numeric/Numeric.cpp b/Numeric/Numeric.cpp
index 75700c0c224b95671ca8f928246cd296ebeef300..c052ea5dfa3e257fa01f70556481f9dea33e3aa6 100644
--- a/Numeric/Numeric.cpp
+++ b/Numeric/Numeric.cpp
@@ -1,6 +1,6 @@
-// $Id: Numeric.cpp,v 1.23 2005-03-11 05:47:56 geuzaine Exp $
+// $Id: Numeric.cpp,v 1.24 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Numeric/Numeric.h b/Numeric/Numeric.h
index 19afc092b19126df04ff7963c6db59bf84dfcde3..3265f240296105df13bf43b8655422db211db51f 100644
--- a/Numeric/Numeric.h
+++ b/Numeric/Numeric.h
@@ -1,7 +1,7 @@
 #ifndef _NUMERIC_H_
 #define _NUMERIC_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Numeric/gsl_brent.cpp b/Numeric/gsl_brent.cpp
index dd4ccea2c02101f660a2fe32c3f2ea4b618ebb11..e1aa2959119114e0f7f9722294e5698935346d2e 100644
--- a/Numeric/gsl_brent.cpp
+++ b/Numeric/gsl_brent.cpp
@@ -1,6 +1,6 @@
-// $Id: gsl_brent.cpp,v 1.12 2005-01-01 19:35:32 geuzaine Exp $
+// $Id: gsl_brent.cpp,v 1.13 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Numeric/gsl_newt.cpp b/Numeric/gsl_newt.cpp
index ca25655649e42c0d0217ed5243cbb0072a3019d9..64798a5555d30017bb6bff4016c906f1554cc386 100644
--- a/Numeric/gsl_newt.cpp
+++ b/Numeric/gsl_newt.cpp
@@ -1,6 +1,6 @@
-// $Id: gsl_newt.cpp,v 1.13 2005-01-01 19:35:32 geuzaine Exp $
+// $Id: gsl_newt.cpp,v 1.14 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parallel/Makefile b/Parallel/Makefile
index cca003a7ca7d9c84d1ab00f234e4cafbde9673ce..0a7e32bb65d036f03082a10a9621cf87c9c605dd 100644
--- a/Parallel/Makefile
+++ b/Parallel/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.23 2005-12-19 02:35:04 geuzaine Exp $
+# $Id: Makefile,v 1.24 2006-01-06 00:34:27 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/Parallel/ParUtil.cpp b/Parallel/ParUtil.cpp
index 56108a86dcd0e9b90e398b0ad6b8bab6b940e89d..91e7ee884c59e05bba2576abcb5fff4aad9bc79f 100644
--- a/Parallel/ParUtil.cpp
+++ b/Parallel/ParUtil.cpp
@@ -1,6 +1,6 @@
-// $Id: ParUtil.cpp,v 1.13 2005-08-31 21:44:44 geuzaine Exp $
+// $Id: ParUtil.cpp,v 1.14 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parallel/ParUtil.h b/Parallel/ParUtil.h
index b26a91a9e73905854a368b89bcc6dbc6d0bf6577..c1b11fa56ebc51c6828f1f72ee595e0714ba72b1 100644
--- a/Parallel/ParUtil.h
+++ b/Parallel/ParUtil.h
@@ -1,7 +1,7 @@
 #ifndef _H_ParUtil
 #define _H_ParUtil
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/FunctionManager.cpp b/Parser/FunctionManager.cpp
index b759e0cb8ae6765640cbe2abd1c2bd297215e48c..7d07cfec5bae7c900d0be0e5f3f673c570497e2a 100644
--- a/Parser/FunctionManager.cpp
+++ b/Parser/FunctionManager.cpp
@@ -1,6 +1,6 @@
-// $Id: FunctionManager.cpp,v 1.21 2005-01-01 19:35:32 geuzaine Exp $
+// $Id: FunctionManager.cpp,v 1.22 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/FunctionManager.h b/Parser/FunctionManager.h
index f19eae69da39e554cd34bccfb98ae5d276bb32ad..496df7a5faf91907dbf7fc2078239dae4dedc221 100644
--- a/Parser/FunctionManager.h
+++ b/Parser/FunctionManager.h
@@ -1,7 +1,7 @@
 #ifndef _FUNCTION_MANAGER_H_
 #define _FUNCTION_MANAGER_H_
 
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l
index 374841286eae23ce6f5e9d5519c7552163454154..cc6f7e144e454e9fbbb1522c148c5b22c006ba0c 100644
--- a/Parser/Gmsh.l
+++ b/Parser/Gmsh.l
@@ -1,7 +1,7 @@
 %{
-// $Id: Gmsh.l,v 1.73 2005-08-09 23:41:13 geuzaine Exp $
+// $Id: Gmsh.l,v 1.74 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 314e7d0857906cd76f5f6ffd208b53e505817a73..15c6884ff3027aee7183a47e7b9132207b83207c 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -168,9 +168,9 @@
 
 #line 1 "Gmsh.y"
 
-// $Id: Gmsh.tab.cpp,v 1.246 2005-12-22 20:42:42 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.247 2006-01-06 00:34:27 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index dc02828c8fc05afc7dfb42ea1c2c65f063a57d45..5a904dc95562837557b9e011c97d85470090ad85 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,7 +1,7 @@
 %{
-// $Id: Gmsh.y,v 1.214 2005-12-22 20:42:45 geuzaine Exp $
+// $Id: Gmsh.y,v 1.215 2006-01-06 00:34:29 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index 78640ed96aec03fa7ab50a1b5e18bd7912f177e2..e9033f1aef2b29851c5744800d4dc308cf19f9a1 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -2,7 +2,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.245 2005-12-22 20:42:45 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.246 2006-01-06 00:34:29 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -1026,9 +1026,9 @@ char *yytext;
 #line 1 "Gmsh.l"
 #define INITIAL 0
 #line 2 "Gmsh.l"
-// $Id: Gmsh.yy.cpp,v 1.245 2005-12-22 20:42:45 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.246 2006-01-06 00:34:29 geuzaine Exp $
 //
-// Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
diff --git a/Parser/Makefile b/Parser/Makefile
index 739f3a29fdae22ced83ac75a0465b4e01845eba8..afdd9a0b888b04981eee02a57120044d22a83c77 100644
--- a/Parser/Makefile
+++ b/Parser/Makefile
@@ -1,6 +1,6 @@
-# $Id: Makefile,v 1.76 2005-12-19 02:35:04 geuzaine Exp $
+# $Id: Makefile,v 1.77 2006-01-06 00:34:32 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/TODO b/TODO
index 1212001611a44cd8e94f6acdf2bfe34ebb55c401..9e4e8daa0d1129b870a61e634ce10a80556b10de 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-$Id: TODO,v 1.110 2005-12-18 18:19:22 geuzaine Exp $
+$Id: TODO,v 1.111 2006-01-06 00:34:20 geuzaine Exp $
 
 ********************************************************************
 
@@ -13,12 +13,7 @@ mesh file (in MSH format)
 
 ********************************************************************
 
-Add a way to select multiple entities using a lasso + add a way to
-remove entities from a selection by clicking on them
-
-********************************************************************
-
-On Windows without Cygwin:
+On Windows WITHOUT Cygwin:
 - rewrite solver interface (GmshServer and GmshClient)
 - Functions in parser don't seem to work
 - fix compilation issues in triangle (timezone) and gl2ps (zlib??)
@@ -64,11 +59,6 @@ normals...)
 
 ********************************************************************
 
-color selected surface/line/point on the fly (instead of just showing
-the entity number)
-
-********************************************************************
-
 Would be nice to have Plugin(CutBox) and Plugin(CutCylinder) (Box:
 using Xc, Yc, Zc, Xl, Yl, Zl, Xr, Yr, Zr, or 4 points. 4 points is
 more general: can be wedge. Cylinder should be able to degenerate
@@ -85,6 +75,10 @@ add a mode to pick a mesh element with the mouse (a la medit)
 
 ********************************************************************
 
+add a way to display the coordinates of a node in the mesh
+
+********************************************************************
+
 add option to cutmesh to cap the mesh instead of displaying "whole"
 elements
 
@@ -121,7 +115,9 @@ disable all replacements)
 
 ********************************************************************
 
-Add a "bitmap" object in the views, e.g. to add a logo
+Add a "bitmap" object in the views, e.g. to add a logo. Maybe would
+be good enough to add another mode in the "background gradient" stuff
+to display an image in the background
 
 ********************************************************************
 
@@ -146,11 +142,6 @@ Test and reintroduce the cylindrical surfaces (cylinder, cone, torus)
 
 ********************************************************************
 
-fix the orientation of hexas, prisms and pyramids (reorder nodes
-according to Orientation())
-
-********************************************************************
-
 add parameter to transformation operations to copy the meshes
 
 ********************************************************************
@@ -174,7 +165,7 @@ precision...). Rescale?
 ********************************************************************
 
 find a better way to display the time/timestep in the scale... (would
-be solved if we had dynamic labels).
+be solved if we had dynamic labels?)
 
 ********************************************************************
 
diff --git a/configure.in b/configure.in
index ce89980e64d15a3a1c183cbae3da3b76083e1990..b7d1c9ae3f748beec060329023548adbb7c03f0c 100644
--- a/configure.in
+++ b/configure.in
@@ -1,6 +1,6 @@
-dnl $Id: configure.in,v 1.84 2005-12-22 20:42:41 geuzaine Exp $
+dnl $Id: configure.in,v 1.85 2006-01-06 00:34:20 geuzaine Exp $
 dnl
-dnl Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+dnl Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 dnl
 dnl This program is free software; you can redistribute it and/or modify
 dnl it under the terms of the GNU General Public License as published by
diff --git a/variables.in b/variables.in
index 87ec7d53087c2b2ac6603b34b7d3b92eeb2b0f89..f8fcd1273e36e4cd7fb9f03a095237bac98500a7 100644
--- a/variables.in
+++ b/variables.in
@@ -1,6 +1,6 @@
-# $Id: variables.in,v 1.11 2005-01-01 19:35:27 geuzaine Exp $
+# $Id: variables.in,v 1.12 2006-01-06 00:34:20 geuzaine Exp $
 #
-# Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
+# Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by