diff --git a/Common/Context.h b/Common/Context.h
index 22722eeb6a446dc23283806d67c6f98b388f4c6d..893b691596c6d6c20f5b3be4bab13d77cf2ab190 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -123,8 +123,8 @@ public :
   int viewport[4];            // current viewport 
   double vxmin, vxmax, vymin, vymax; // current viewport in real coordinates 
   int light[6];               // status of light 
-  float light_position[6][4]; // light sources positions 
-  float shine;                // specular value 
+  double light_position[6][4]; // light sources positions 
+  double shine;                // specular value 
   int render_mode;            // GMSH_RENDER, GMSH_SELECT, GMSH_FEEDBACK 
   int clip[6];                // status of clip planes 
   double clip_plane[6][4];    // clip planes 
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 53e0d0ffa312403ca7a46347fc20b5f26ba92708..b0fd7bd8b8e2e97e783117bc332d54b22694f33f 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -644,7 +644,7 @@ StringXNumber GeometryOptions_Number[] = {
   { F|O, "ExtrudeSplinePoints" , opt_geometry_extrude_spline_points, 5. ,
     "Number of control points for splines created during extrusion" },
 
-  { F|O, "Highlight" , opt_geometry_highlight , 1. , 
+  { F|O, "Highlight" , opt_geometry_highlight , 0. , 
     "Not used" },
 
   { F|O, "Light" , opt_geometry_light , 1. , 
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 230ce4d18e139f64e2f0d49b26feeaad2666657e..0c5aa551694792f5f01cc9f272a204e98e4b0912 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.149 2004-04-24 06:13:45 geuzaine Exp $
+// $Id: Options.cpp,v 1.150 2004-05-12 03:22:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -170,7 +170,7 @@ void Init_Options_GUI(int num)
 
 void Print_OptionCategory(int level, char *cat, FILE * file)
 {
-  if(level & GMSH_SESSIONRC)
+  if(!(level & GMSH_FULLRC))
     return;
   if(file) {
     fprintf(file, "//\n");
@@ -184,7 +184,7 @@ void Print_OptionCategory(int level, char *cat, FILE * file)
   }
 }
 
-void Print_Options(int num, int level, char *filename)
+void Print_Options(int num, int level, int diff, char *filename)
 {
   FILE *file;
   char tmp[256];
@@ -204,10 +204,10 @@ void Print_Options(int num, int level, char *filename)
   if((level & GMSH_SESSIONRC) && file) {
     fprintf(file, "// Gmsh Session File\n");
     fprintf(file, "//\n");
-    fprintf(file, "// This file takes session specific info (that is info\n");
+    fprintf(file, "// This file contains session specific info (that is info\n");
     fprintf(file, "// you want to keep between two Gmsh sessions). You are\n");
     fprintf(file, "// not supposed to edit it manually, but of course you\n");
-    fprintf(file, "// can do. This file will be entirely rewritten every time\n");
+    fprintf(file, "// can. This file will be entirely rewritten every time\n");
     fprintf(file, "// you quit Gmsh if the option 'General.SaveSession' is\n");
     fprintf(file, "// set. If this file isn't found, defaults are used.\n");
     fprintf(file, "//\n");
@@ -216,83 +216,81 @@ void Print_Options(int num, int level, char *filename)
   if((level & GMSH_OPTIONSRC) && file) {
     fprintf(file, "// Gmsh Option File\n");
     fprintf(file, "//\n");
-    fprintf(file, "// This file takes configuration options (preferences) that\n");
+    fprintf(file, "// This file contains configuration options (preferences) that\n");
     fprintf(file, "// should be loaded each time Gmsh is launched. You can create\n");
     fprintf(file, "// this file by hand, or let Gmsh generate it for you (with\n");
     fprintf(file, "// 'Tools->Options->Save'). This file can also be automatically\n");
-    fprintf(file, "// regenerated every time you quit Gmsh if the option\n");
-    fprintf(file, "// 'General.SaveOptions' is set. If this file isn't found,\n");
-    fprintf(file, "// defaults are used.\n");
+    fprintf(file, "// saved every time you quit Gmsh if the option 'General.SaveOptions'\n");
+    fprintf(file, "// is set. If this file isn't found, defaults are used.\n");
     fprintf(file, "//\n");
   }
 
   Print_OptionCategory(level, "General options (strings)", file);
-  Print_StringOptions(num, level, GeneralOptions_String, "General.", file);
+  Print_StringOptions(num, level, diff, GeneralOptions_String, "General.", file);
   Print_OptionCategory(level, "General options (numbers)", file);
-  Print_NumberOptions(num, level, GeneralOptions_Number, "General.", file);
+  Print_NumberOptions(num, level, diff, GeneralOptions_Number, "General.", file);
   Print_OptionCategory(level, "General options (colors)", file);
-  Print_ColorOptions(num, level, GeneralOptions_Color, "General.", file);
+  Print_ColorOptions(num, level, diff, GeneralOptions_Color, "General.", file);
 
   Print_OptionCategory(level, "Geometry options (strings)", file);
-  Print_StringOptions(num, level, GeometryOptions_String, "Geometry.", file);
+  Print_StringOptions(num, level, diff, GeometryOptions_String, "Geometry.", file);
   Print_OptionCategory(level, "Geometry options (numbers)", file);
-  Print_NumberOptions(num, level, GeometryOptions_Number, "Geometry.", file);
+  Print_NumberOptions(num, level, diff, GeometryOptions_Number, "Geometry.", file);
   Print_OptionCategory(level, "Geometry options (colors)", file);
-  Print_ColorOptions(num, level, GeometryOptions_Color, "Geometry.", file);
+  Print_ColorOptions(num, level, diff, GeometryOptions_Color, "Geometry.", file);
 
   Print_OptionCategory(level, "Mesh options (strings)", file);
-  Print_StringOptions(num, level, MeshOptions_String, "Mesh.", file);
+  Print_StringOptions(num, level, diff, MeshOptions_String, "Mesh.", file);
   Print_OptionCategory(level, "Mesh options (numbers)", file);
-  Print_NumberOptions(num, level, MeshOptions_Number, "Mesh.", file);
+  Print_NumberOptions(num, level, diff, MeshOptions_Number, "Mesh.", file);
   Print_OptionCategory(level, "Mesh options (colors)", file);
-  Print_ColorOptions(num, level, MeshOptions_Color, "Mesh.", file);
+  Print_ColorOptions(num, level, diff, MeshOptions_Color, "Mesh.", file);
 
   Print_OptionCategory(level, "Solver options (strings)", file);
-  Print_StringOptions(num, level, SolverOptions_String, "Solver.", file);
+  Print_StringOptions(num, level, diff, SolverOptions_String, "Solver.", file);
   Print_OptionCategory(level, "Solver options (numbers)", file);
-  Print_NumberOptions(num, level, SolverOptions_Number, "Solver.", file);
+  Print_NumberOptions(num, level, diff, SolverOptions_Number, "Solver.", file);
   Print_OptionCategory(level, "Solver options (colors)", file);
-  Print_ColorOptions(num, level, SolverOptions_Color, "Solver.", file);
+  Print_ColorOptions(num, level, diff, SolverOptions_Color, "Solver.", file);
 
   Print_OptionCategory(level, "Post-processing options (strings)", file);
-  Print_StringOptions(num, level, PostProcessingOptions_String,
+  Print_StringOptions(num, level, diff, PostProcessingOptions_String,
                       "PostProcessing.", file);
   Print_OptionCategory(level, "Post-processing options (numbers)", file);
-  Print_NumberOptions(num, level, PostProcessingOptions_Number,
+  Print_NumberOptions(num, level, diff, PostProcessingOptions_Number,
                       "PostProcessing.", file);
   Print_OptionCategory(level, "Post-processing options (colors)", file);
-  Print_ColorOptions(num, level, PostProcessingOptions_Color,
+  Print_ColorOptions(num, level, diff, 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, "View options (strings)", file);
-      Print_StringOptions(i, level, ViewOptions_String, tmp, file);
+      Print_StringOptions(i, level, diff, ViewOptions_String, tmp, file);
       Print_OptionCategory(level, "View options (numbers)", file);
-      Print_NumberOptions(i, level, ViewOptions_Number, tmp, file);
+      Print_NumberOptions(i, level, diff, ViewOptions_Number, tmp, file);
       Print_OptionCategory(level, "View options (colors)", file);
-      Print_ColorOptions(i, level, ViewOptions_Color, tmp, file);
+      Print_ColorOptions(i, level, diff, ViewOptions_Color, tmp, file);
       strcat(tmp, "ColorTable");
       Print_ColorTable(i, tmp, file);
     }
   }
   else if(level & GMSH_OPTIONSRC) {
     Print_OptionCategory(level, "View options (strings)", file);
-    Print_StringOptions(num, level, ViewOptions_String, "View.", file);
+    Print_StringOptions(num, level, diff, ViewOptions_String, "View.", file);
     Print_OptionCategory(level, "View options (numbers)", file);
-    Print_NumberOptions(num, level, ViewOptions_Number, "View.", file);
+    Print_NumberOptions(num, level, diff, ViewOptions_Number, "View.", file);
     Print_OptionCategory(level, "View options (colors)", file);
-    Print_ColorOptions(num, level, ViewOptions_Color, "View.", file);
-    Print_ColorTable(num, "View.ColorTable", file);
+    Print_ColorOptions(num, level, diff, ViewOptions_Color, "View.", file);
   }
 
   Print_OptionCategory(level, "Print options (strings)", file);
-  Print_StringOptions(num, level, PrintOptions_String, "Print.", file);
+  Print_StringOptions(num, level, diff, PrintOptions_String, "Print.", file);
   Print_OptionCategory(level, "Print options (numbers)", file);
-  Print_NumberOptions(num, level, PrintOptions_Number, "Print.", file);
+  Print_NumberOptions(num, level, diff, PrintOptions_Number, "Print.", file);
   Print_OptionCategory(level, "Print options (colors)", file);
-  Print_ColorOptions(num, level, PrintOptions_Color, "Print.", file);
+  Print_ColorOptions(num, level, diff, PrintOptions_Color, "Print.", file);
 
   if(filename) {
     Msg(INFO, "Wrote option file '%s'", filename);
@@ -420,16 +418,31 @@ void Print_OptionsDoc()
       p->getInfos(author, copyright, help);
       fprintf(file, "@item Plugin(%s)\n", (*it).first);
       fprintf(file, "%s\n", help);
-      fprintf(file, "Numeric options:\n");
-      fprintf(file, "@table @code\n");
+
+      int m = p->getNbOptionsStr();
+      if(m){
+	fprintf(file, "String options:\n");
+	fprintf(file, "@table @code\n");
+	for(int i = 0; i < m; i++) {
+	  StringXString *sxs = p->getOptionStr(i);
+	  fprintf(file, "@item %s\n", sxs->str);
+	  fprintf(file, "Default value: @code{\"%s\"}\n", sxs->def);
+	}
+	fprintf(file, "@end table\n");
+      }
+
       int n = p->getNbOptions();
-      for(int i = 0; i < n; i++) {
-        StringXNumber *sxn;
-        sxn = p->getOption(i);
-        fprintf(file, "@item %s\n", sxn->str);
-	fprintf(file, "Default value: %g\n", sxn->def);
+      if(n){
+	fprintf(file, "Numeric options:\n");
+	fprintf(file, "@table @code\n");
+	for(int i = 0; i < n; i++) {
+	  StringXNumber *sxn = p->getOption(i);
+	  fprintf(file, "@item %s\n", sxn->str);
+	  fprintf(file, "Default value: @code{%g}\n", sxn->def);
+	}
+	fprintf(file, "@end table\n");
       }
-      fprintf(file, "@end table\n");
+
     }
     fprintf(file, "\n");
   }
@@ -488,19 +501,21 @@ void *Get_StringOption(char *str, StringXString s[])
     return (void *)s[i].function;
 }
 
-void Print_StringOptions(int num, int level, StringXString s[], char *prefix,
-                         FILE * file)
+void Print_StringOptions(int num, int level, int diff, StringXString s[], 
+			 char *prefix, FILE * file)
 {
   int i = 0;
   char tmp[1024];
   while(s[i].str) {
     if(s[i].level & level) {
-      sprintf(tmp, "%s%s = \"%s\"; // %s", prefix,
-              s[i].str, s[i].function(num, GMSH_GET, NULL), s[i].help);
-      if(file)
-        fprintf(file, "%s\n", tmp);
-      else
-        Msg(DIRECT, "%s", tmp);
+      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);
+	if(file)
+	  fprintf(file, "%s\n", tmp);
+	else
+	  Msg(DIRECT, "%s", tmp);
+      }
     }
     i++;
   }
@@ -508,11 +523,27 @@ void Print_StringOptions(int num, int level, StringXString s[], char *prefix,
 
 void Print_StringOptionsDoc(StringXString s[], char *prefix, FILE * file)
 {
-  int i = 0;
+  int i = 0, j;
+  char tmp[1024];
+
   while(s[i].str) {
     fprintf(file, "@item %s%s\n", prefix, s[i].str);
     fprintf(file, "%s@*\n", s[i].help);
-    fprintf(file, "Default value: @code{\"%s\"}@*\n", s[i].function(0, GMSH_GET, NULL));
+
+    // sanitize the string for texinfo
+    char *ptr = s[i].function(0, GMSH_GET, NULL);
+    int len = strlen(ptr);
+    j = 0;
+    while(j < len){
+      tmp[j] = *(ptr++);
+      if(j && tmp[j] == '\n' && tmp[j-1] == '\n')
+	tmp[j-1] = '.';
+      j++;
+      if(j == 1023) break;
+    }
+    tmp[j] = '\0';
+
+    fprintf(file, "Default value: @code{\"%s\"}@*\n", tmp);
     fprintf(file, "Saved in: @code{%s}\n\n", Get_OptionSaveLevel(s[i].level));
     i++;
   }
@@ -571,19 +602,21 @@ void *Get_NumberOption(char *str, StringXNumber s[])
   }
 }
 
-void Print_NumberOptions(int num, int level, StringXNumber s[], char *prefix,
-                         FILE * file)
+void Print_NumberOptions(int num, int level, int diff, StringXNumber s[], 
+			 char *prefix, FILE * file)
 {
   int i = 0;
   char tmp[1024];
   while(s[i].str) {
     if(s[i].level & level) {
-      sprintf(tmp, "%s%s = %.16g; // %s", prefix,
-              s[i].str, s[i].function(num, GMSH_GET, 0), s[i].help);
-      if(file)
-        fprintf(file, "%s\n", tmp);
-      else
-        Msg(DIRECT, tmp);
+      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);
+	if(file)
+	  fprintf(file, "%s\n", tmp);
+	else
+	  Msg(DIRECT, tmp);
+      }
     }
     i++;
   }
@@ -668,22 +701,24 @@ void *Get_ColorOption(char *str, StringXColor s[])
     return (void *)s[i].function;
 }
 
-void Print_ColorOptions(int num, int level, StringXColor s[], char *prefix,
-                        FILE * file)
+void Print_ColorOptions(int num, int level, int diff, StringXColor s[], 
+			char *prefix, FILE * file)
 {
   int i = 0;
   char tmp[1024];
   while(s[i].str) {
     if(s[i].level & level) {
-      sprintf(tmp, "%sColor.%s = {%d,%d,%d}; // %s",
-              prefix, s[i].str,
-              UNPACK_RED(s[i].function(num, GMSH_GET, 0)),
-              UNPACK_GREEN(s[i].function(num, GMSH_GET, 0)),
-              UNPACK_BLUE(s[i].function(num, GMSH_GET, 0)), s[i].help);
-      if(file)
-        fprintf(file, "%s\n", tmp);
-      else
-        Msg(DIRECT, tmp);
+      if(!diff || (s[i].function(num, GMSH_GET, 0) != s[i].def1)){
+	sprintf(tmp, "%sColor.%s = {%d,%d,%d}; // %s",
+		prefix, s[i].str,
+		UNPACK_RED(s[i].function(num, GMSH_GET, 0)),
+		UNPACK_GREEN(s[i].function(num, GMSH_GET, 0)),
+		UNPACK_BLUE(s[i].function(num, GMSH_GET, 0)), s[i].help);
+	if(file)
+	  fprintf(file, "%s\n", tmp);
+	else
+	  Msg(DIRECT, tmp);
+      }
     }
     i++;
   }
diff --git a/Common/Options.h b/Common/Options.h
index 8567e84dc4e7eae46f2d2ba2beeba9628d1c733f..d457bc73be5e6ee321d853674a7ab4c920720042 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -572,7 +572,7 @@ typedef struct {
 void Init_Options (int num);
 void Init_Options_GUI (int num);
 void ReInit_Options (int num);
-void Print_Options(int num, int level, char *filename);
+void Print_Options(int num, int level, int diff, char *filename);
 void Print_OptionsDoc();
 
 StringXString * Get_StringOptionCategory(char * cat);
@@ -591,9 +591,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, StringXString s[], char *prefix, FILE *file);
-void Print_NumberOptions(int num, int level, StringXNumber s[], char *prefix, FILE *file);
-void Print_ColorOptions(int num, int level, StringXColor s[], char *prefix, FILE *file);
+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_StringOptionsDoc(StringXString s[], char *prefix, FILE * file);
 void Print_NumberOptionsDoc(StringXNumber s[], char *prefix, FILE * file);
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index fa31d38167368faf43ce7a5326a91052a52cea10..64d09df550ecfd98a9a93674ae826bf21ef25c50 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.225 2004-05-12 02:02:20 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.226 2004-05-12 03:22:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -340,7 +340,7 @@ void status_xyz1p_cb(CALLBACK_ARGS)
     Draw();
     break;
   case 4:
-    Print_Options(0, GMSH_FULLRC, NULL);
+    Print_Options(0, GMSH_FULLRC, false, NULL);
     WID->create_message_window();
     break;
   }
@@ -477,6 +477,10 @@ void _save_geo_options(char *name)
 {
   CreateOutputFile(name, FORMAT_OPT);
 }
+void _save_geo_options_diff(char *name)
+{
+  Print_Options(0, GMSH_FULLRC, true, name);
+}
 void _save_geo(char *name)
 {
   CreateOutputFile(name, FORMAT_GEO);
@@ -697,6 +701,7 @@ void file_save_as_cb(CALLBACK_ARGS)
   static patXfunc formats[] = {
     {"By extension (*)", _save_auto},
     {"Gmsh options (*.opt)", _save_geo_options},
+    {"Gmsh modified options (*.opt)", _save_geo_options_diff},
     {"Gmsh unrolled geometry (*.geo)", _save_geo},
     {"Gmsh mesh v1.0 (*.msh)", _save_msh},
     {"Gmsh mesh v1.0 without physicals (*.msh)", _save_msh_all},
@@ -953,7 +958,7 @@ void options_browser_cb(CALLBACK_ARGS)
 
 void options_save_cb(CALLBACK_ARGS)
 {
-  Print_Options(0, GMSH_OPTIONSRC, CTX.optionsrc_filename);
+  Print_Options(0, GMSH_OPTIONSRC, true, CTX.optionsrc_filename);
 }
 
 void options_restore_defaults_cb(CALLBACK_ARGS)
@@ -1042,7 +1047,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, CTX.sessionrc_filename);
+    Print_Options(0, GMSH_SESSIONRC, true, CTX.sessionrc_filename);
   opt_general_options_save(0, GMSH_SET, WID->gen_butt[9]->value());
   opt_general_orthographic(0, GMSH_SET, WID->gen_butt[10]->value());
   opt_general_tooltips(0, GMSH_SET, WID->gen_butt[13]->value());
@@ -3165,7 +3170,7 @@ void view_plugin_cb(CALLBACK_ARGS)
     if(n > NB_BUTT_MAX) n = NB_BUTT_MAX;
     for(int i = 0; i < m; i++) {
       StringXString *sxs = p->getOptionStr(i);
-      sxs->def = p->dialogBox->input[i]->value();
+      sxs->def = (char*)p->dialogBox->input[i]->value();
     }
     for(int i = 0; i < n; i++) {
       StringXNumber *sxn = p->getOption(i);
diff --git a/Fltk/Message.cpp b/Fltk/Message.cpp
index 841b3262afdd19c098e748587c7b2f65f586485e..78809ed37edeb9e26f5e82fc78284910a7eb1724 100644
--- a/Fltk/Message.cpp
+++ b/Fltk/Message.cpp
@@ -1,4 +1,4 @@
-// $Id: Message.cpp,v 1.47 2004-05-09 18:59:37 geuzaine Exp $
+// $Id: Message.cpp,v 1.48 2004-05-12 03:22:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -236,10 +236,10 @@ void Exit(int level)
       CTX.ctx_position[1] = WID->context_geometry_window->y();
       CTX.solver_position[0] = WID->solver[0].window->x();
       CTX.solver_position[1] = WID->solver[0].window->y();
-      Print_Options(0, GMSH_SESSIONRC, CTX.sessionrc_filename);
+      Print_Options(0, GMSH_SESSIONRC, false, CTX.sessionrc_filename);
     }
     if(CTX.options_save)
-      Print_Options(0, GMSH_OPTIONSRC, CTX.optionsrc_filename);
+      Print_Options(0, GMSH_OPTIONSRC, true, CTX.optionsrc_filename);
   }
 
   exit(0);
diff --git a/Graphics/CreateFile.cpp b/Graphics/CreateFile.cpp
index 7e4e5915fdefb4edb3c2e6fbbace106ab12f7e79..b7c2b34fc70653b6d48041b29c5bb438e87e8fe1 100644
--- a/Graphics/CreateFile.cpp
+++ b/Graphics/CreateFile.cpp
@@ -1,4 +1,4 @@
-// $Id: CreateFile.cpp,v 1.59 2004-05-09 19:00:11 geuzaine Exp $
+// $Id: CreateFile.cpp,v 1.60 2004-05-12 03:22:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -126,7 +126,7 @@ void CreateOutputFile(char *name, int format)
     break;
 
   case FORMAT_OPT:
-    Print_Options(0, GMSH_FULLRC, name);
+    Print_Options(0, GMSH_FULLRC, false, name);
     break;
 
   case FORMAT_MSH:
diff --git a/Graphics/Draw.cpp b/Graphics/Draw.cpp
index 0a0d15c42abca59d842a87aad1948edbfcae2868..3ae91dd5546994ab58a7d476927d67cdf3aa06db 100644
--- a/Graphics/Draw.cpp
+++ b/Graphics/Draw.cpp
@@ -1,4 +1,4 @@
-// $Id: Draw.cpp,v 1.49 2004-04-27 00:11:55 geuzaine Exp $
+// $Id: Draw.cpp,v 1.50 2004-05-12 03:22:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -162,7 +162,10 @@ void InitRenderModel(void)
 
   for(i = 0; i < 6; i++) {
     if(CTX.light[i]) {
-      glLightfv((GLenum) (GL_LIGHT0 + i), GL_POSITION, CTX.light_position[i]);
+      GLfloat tmp[4];
+      for(int j = 0; j < 4; j++) 
+	tmp[j] = (GLfloat)CTX.light_position[i][j];
+      glLightfv((GLenum) (GL_LIGHT0 + i), GL_POSITION, tmp);
       glEnable((GLenum) (GL_LIGHT0 + i));
     }
   }
diff --git a/TODO b/TODO
index c90f4e17ecd5d9c6e9bc844c8375756e1d092891..ab09ea29f42b8592ca7e5cc4e5552eb3de23ece3 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-$Id: TODO,v 1.43 2004-05-01 06:45:10 geuzaine Exp $
+$Id: TODO,v 1.44 2004-05-12 03:22:13 geuzaine Exp $
 
 generalize Plugin(Triangulate) to vector and tensor points
 
@@ -21,11 +21,6 @@ labels (scales)
 
 ********************************************************************
 
-should save only those options that differ from the default values (or
-at least make this behaviour optional)
-
-********************************************************************
-
 find a better way to display the time/timestep in the scale...
 
 ********************************************************************
diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi
index 2641f80dffcaaeb92822df3541e622ca76356545..daa712fcf0bcd2f2eb391fe0a7eb8b2b827526c1 100644
--- a/doc/texinfo/opt_general.texi
+++ b/doc/texinfo/opt_general.texi
@@ -30,7 +30,7 @@ Default value: @code{".gmshrc"}@*
 Saved in: @code{-}
 
 @item General.Scheme
-FLTK graphical user interface scheme (try e.g. plastic)@*
+FLTK user interface scheme (try e.g. plastic)@*
 Default value: @code{""}@*
 Saved in: @code{General.SessionFileName}
 
@@ -260,7 +260,7 @@ Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
 @item General.FontSize
-Size of the font in the graphical user interface@*
+Size of the font in the user interface@*
 Default value: @code{12}@*
 Saved in: @code{General.SessionFileName}
 
@@ -301,12 +301,12 @@ Saved in: @code{General.OptionsFileName}
 
 @item General.Light0X
 X position of light source 0@*
-Default value: @code{0.5}@*
+Default value: @code{0.65}@*
 Saved in: @code{General.OptionsFileName}
 
 @item General.Light0Y
 Y position of light source 0@*
-Default value: @code{0.3}@*
+Default value: @code{0.65}@*
 Saved in: @code{General.OptionsFileName}
 
 @item General.Light0Z
@@ -449,11 +449,6 @@ Width (in pixels) of the message window@*
 Default value: @code{450}@*
 Saved in: @code{General.SessionFileName}
 
-@item General.MovingLight
-Use a moving (i.e. which follows the model) light source@*
-Default value: @code{0}@*
-Saved in: @code{General.OptionsFileName}
-
 @item General.OptionsPositionX
 Horizontal position (in pixels) of the upper left corner of the option window@*
 Default value: @code{650}@*
@@ -590,7 +585,7 @@ Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
 @item General.Tooltips
-Show tooltips in the graphical user interface@*
+Show tooltips in the user interface@*
 Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
diff --git a/doc/texinfo/opt_geometry.texi b/doc/texinfo/opt_geometry.texi
index 0d3d580ae77d605facb1b59f177f8e066811ebec..d11968ce42aa86e8783c22665ad01eb06632c66d 100644
--- a/doc/texinfo/opt_geometry.texi
+++ b/doc/texinfo/opt_geometry.texi
@@ -26,12 +26,12 @@ Saved in: @code{General.OptionsFileName}
 
 @item Geometry.Highlight
 Not used@*
-Default value: @code{1}@*
+Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Geometry.Light
 Enable lighting for the geometry@*
-Default value: @code{0}@*
+Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Geometry.Lines
diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi
index 1b19c0a7de121830fb6c12707693368d0f84dcd2..2b0dfa6dbfc8a01d9408a877961fecee9f400d64 100644
--- a/doc/texinfo/opt_mesh.texi
+++ b/doc/texinfo/opt_mesh.texi
@@ -201,7 +201,7 @@ Saved in: @code{General.OptionsFileName}
 
 @item Mesh.PointSize
 Display size of mesh vertices (in pixels)@*
-Default value: @code{3}@*
+Default value: @code{4}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Mesh.PointType
diff --git a/doc/texinfo/opt_plugin.texi b/doc/texinfo/opt_plugin.texi
index 6b27d5d38e7fe7e05c101cab386beebdf1c8c989..1c55f73ba17ebffe90db8bbf11790e65f6b86d47 100644
--- a/doc/texinfo/opt_plugin.texi
+++ b/doc/texinfo/opt_plugin.texi
@@ -12,29 +12,29 @@ Plugin(CutGrid) creates one new view.
 Numeric options:
 @table @code
 @item X0
-Default value: -1
+Default value: @code{-1}
 @item Y0
-Default value: -1
+Default value: @code{-1}
 @item Z0
-Default value: 0
+Default value: @code{0}
 @item X1
-Default value: -1
+Default value: @code{-1}
 @item Y1
-Default value: 0
+Default value: @code{0}
 @item Z1
-Default value: 0
+Default value: @code{0}
 @item X2
-Default value: 0
+Default value: @code{0}
 @item Y2
-Default value: -1
+Default value: @code{-1}
 @item Z2
-Default value: 0
+Default value: @code{0}
 @item nPointsU
-Default value: 20
+Default value: @code{20}
 @item nPointsV
-Default value: 20
+Default value: @code{20}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(CutMap)
@@ -53,13 +53,13 @@ as there are time steps in `iView'.
 Numeric options:
 @table @code
 @item A
-Default value: 1
+Default value: @code{1}
 @item dTimeStep
-Default value: -1
+Default value: @code{-1}
 @item dView
-Default value: -1
+Default value: @code{-1}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(CutPlane)
@@ -73,15 +73,15 @@ Plugin(CutPlane) creates one new view.
 Numeric options:
 @table @code
 @item A
-Default value: 1
+Default value: @code{1}
 @item B
-Default value: 0
+Default value: @code{0}
 @item C
-Default value: 0
+Default value: @code{0}
 @item D
-Default value: -0.01
+Default value: @code{-0.01}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(CutSphere)
@@ -95,15 +95,15 @@ Plugin(CutSphere) creates one new view.
 Numeric options:
 @table @code
 @item Xc
-Default value: 0
+Default value: @code{0}
 @item Yc
-Default value: 0
+Default value: @code{0}
 @item Zc
-Default value: 0
+Default value: @code{0}
 @item R
-Default value: 0.25
+Default value: @code{0.25}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(DecomposeInSimplex)
@@ -119,7 +119,7 @@ in-place.
 Numeric options:
 @table @code
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(DisplacementRaise)
@@ -138,13 +138,37 @@ Plugin(DisplacementRaise) is executed in-place.
 Numeric options:
 @table @code
 @item Factor
-Default value: 1
+Default value: @code{1}
 @item dTimeStep
-Default value: 0
+Default value: @code{0}
 @item dView
-Default value: -1
+Default value: @code{-1}
 @item iView
-Default value: -1
+Default value: @code{-1}
+@end table
+
+@item Plugin(Evaluate)
+Plugin(Evaluate) sets the values associated with
+the `TimeStep'-th time step in the view `iView'
+to the expression `Expression'. In addition to
+the usual mathematical functions, `Expression' can
+contain the symbols x, y, z and v, which represent
+the three spatial coordinates and the value of the
+field, respectively.
+
+Plugin(Evaluate) is executed in-place.
+
+String options:
+@table @code
+@item Expression
+Default value: @code{"v * (x+y+z)"}
+@end table
+Numeric options:
+@table @code
+@item TimeStep
+Default value: @code{0}
+@item iView
+Default value: @code{-1}
 @end table
 
 @item Plugin(Extract)
@@ -157,9 +181,9 @@ Plugin(Extract) creates one new view.
 Numeric options:
 @table @code
 @item iView
-Default value: -1
+Default value: @code{-1}
 @item iComponent
-Default value: 0
+Default value: @code{0}
 @end table
 
 @item Plugin(Skin)
@@ -172,7 +196,7 @@ Plugin(Skin) creates one new view.
 Numeric options:
 @table @code
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(Smooth)
@@ -185,7 +209,7 @@ Plugin(Smooth) is executed in-place.
 Numeric options:
 @table @code
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(SphericalRaise)
@@ -205,17 +229,17 @@ Plugin(SphericalRaise) is executed in-place.
 Numeric options:
 @table @code
 @item Xc
-Default value: 0
+Default value: @code{0}
 @item Yc
-Default value: 0
+Default value: @code{0}
 @item Zc
-Default value: 0
+Default value: @code{0}
 @item Raise
-Default value: 1
+Default value: @code{1}
 @item TimeStep
-Default value: 0
+Default value: @code{0}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(StreamLines)
@@ -241,33 +265,33 @@ vectors and to animate the view ;-)
 Numeric options:
 @table @code
 @item X0
-Default value: 2.39
+Default value: @code{2.39}
 @item Y0
-Default value: 0.445
+Default value: @code{0.445}
 @item Z0
-Default value: 0
+Default value: @code{0}
 @item X1
-Default value: 2.39
+Default value: @code{2.39}
 @item Y1
-Default value: 0.94
+Default value: @code{0.94}
 @item Z1
-Default value: 0
+Default value: @code{0}
 @item X2
-Default value: 2.39
+Default value: @code{2.39}
 @item Y2
-Default value: 0.445
+Default value: @code{0.445}
 @item Z2
-Default value: 1
+Default value: @code{1}
 @item nPointsU
-Default value: 20
+Default value: @code{20}
 @item nPointsV
-Default value: 1
+Default value: @code{1}
 @item MaxIter
-Default value: 100
+Default value: @code{100}
 @item DT
-Default value: 0.1
+Default value: @code{0.1}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(Transform)
@@ -284,25 +308,25 @@ Plugin(Transform) is executed in-place.
 Numeric options:
 @table @code
 @item A11
-Default value: 1
+Default value: @code{1}
 @item A12
-Default value: 0
+Default value: @code{0}
 @item A13
-Default value: 0
+Default value: @code{0}
 @item A21
-Default value: 0
+Default value: @code{0}
 @item A22
-Default value: 1
+Default value: @code{1}
 @item A23
-Default value: 0
+Default value: @code{0}
 @item A31
-Default value: 0
+Default value: @code{0}
 @item A32
-Default value: 0
+Default value: @code{0}
 @item A33
-Default value: 1
+Default value: @code{1}
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @item Plugin(Triangulate)
@@ -317,7 +341,7 @@ Plugin(Triangulate) creates one new view.
 Numeric options:
 @table @code
 @item iView
-Default value: -1
+Default value: @code{-1}
 @end table
 
 @end ftable
diff --git a/doc/texinfo/opt_view.texi b/doc/texinfo/opt_view.texi
index fb6ed03c13be8a9b08ebdba444f26a7b53f33af2..3bc5a4df589ecc565723ed84e4fee827c2582c37 100644
--- a/doc/texinfo/opt_view.texi
+++ b/doc/texinfo/opt_view.texi
@@ -31,7 +31,7 @@ Saved in: @code{General.OptionsFileName}
 
 @item View.AngleSmoothNormals
 Threshold angle below which normals are not smoothed@*
-Default value: @code{15}@*
+Default value: @code{180}@*
 Saved in: @code{General.OptionsFileName}
 
 @item View.ArrowHeadRadius
@@ -166,7 +166,7 @@ Saved in: @code{General.OptionsFileName}
 
 @item View.Light
 Enable lighting for the view@*
-Default value: @code{0}@*
+Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
 @item View.LineType
@@ -231,7 +231,7 @@ Saved in: @code{General.OptionsFileName}
 
 @item View.PositionX
 Horizontal position (in pixels) of the upper left corner of the scale or 2D graph@*
-Default value: @code{80}@*
+Default value: @code{100}@*
 Saved in: @code{General.OptionsFileName}
 
 @item View.PositionY