diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 4a0787784f459b93fabed90cfdb872e679793815..5f20469aed349cd5069f19ed1e311c721d378bcf 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.131 2002-06-24 05:03:18 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.132 2002-07-03 23:54:10 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -82,6 +82,7 @@ int file_chooser(int multi, const char* message, const char* pat, int patindex){
   static char oldfilter[1024];
 
   Fl_File_Chooser::show_label = "Format:";
+  Fl_File_Chooser::all_files_label = "All files (*)";
 
   if (!fc) {
     fc = new Fl_File_Chooser(".", pat, Fl_File_Chooser::CREATE, message);
@@ -93,7 +94,7 @@ int file_chooser(int multi, const char* message, const char* pat, int patindex){
   if(strncmp(oldfilter, pat, 1024)){
     strncpy(oldfilter, pat, 1024);
     fc->filter(pat);
-    //FIXME fc->filter_value(patindex);
+    fc->filter_value(patindex);
   }
 
   if(multi)
@@ -116,7 +117,7 @@ char* file_chooser_get_name(int num){
 }
 
 int file_chooser_get_filter(){
-  return 0; //FIXME return fc->filter_value();
+  return fc->filter_value();
 }
 
 #endif
@@ -314,77 +315,72 @@ void file_merge_cb(CALLBACK_ARGS) {
     WID->set_context(menu_post, 0);
 }
 
-typedef struct{
-  char *pat;
-  void (*func)(char *name) ;
-} patXfunc;
-
 void _save_auto(char *name){
-  CreateOutputFile(name, CTX.print.format = FORMAT_AUTO); 
+  CreateOutputFile(name, FORMAT_AUTO); 
 }
 void _save_geo_options(char *name){
-  CreateOutputFile(name, CTX.print.format = FORMAT_OPT); 
+  CreateOutputFile(name, FORMAT_OPT); 
 }
 void _save_geo(char *name){
-  CreateOutputFile(name, CTX.print.format = FORMAT_GEO); 
+  CreateOutputFile(name, FORMAT_GEO); 
 }
 void _save_msh(char *name){
-  CreateOutputFile(name, CTX.print.format = CTX.mesh.format = FORMAT_MSH); 
+  CreateOutputFile(name, CTX.mesh.format = FORMAT_MSH); 
 }
 void _save_msh_all(char *name){
   int all = CTX.mesh.save_all;
   CTX.mesh.save_all = 1;
-  CreateOutputFile(name, CTX.print.format = CTX.mesh.format = FORMAT_MSH); 
+  CreateOutputFile(name, CTX.mesh.format = FORMAT_MSH); 
   CTX.mesh.save_all = all;
 }
 void _save_gref(char *name){
-  CreateOutputFile(name, CTX.print.format = CTX.mesh.format = FORMAT_GREF);  
+  CreateOutputFile(name, CTX.mesh.format = FORMAT_GREF);  
 }
 void _save_unv(char *name){ 
- CreateOutputFile(name, CTX.print.format = CTX.mesh.format = FORMAT_UNV); 
+ CreateOutputFile(name, CTX.mesh.format = FORMAT_UNV); 
 }
 void _save_vrml(char *name){ 
-  CreateOutputFile(name, CTX.print.format = CTX.mesh.format = FORMAT_VRML); 
+  CreateOutputFile(name, CTX.mesh.format = FORMAT_VRML); 
 }
 void _save_ps_simple(char *name){ 
   int old = CTX.print.eps_quality;
   CTX.print.eps_quality = 1; 
-  CreateOutputFile(name, CTX.print.format = FORMAT_PS); 
+  CreateOutputFile(name, FORMAT_PS); 
   CTX.print.eps_quality = old; 
 }
 void _save_ps_accurate(char *name){ 
   int old = CTX.print.eps_quality;
   CTX.print.eps_quality = 2; 
-  CreateOutputFile(name, CTX.print.format = FORMAT_PS); 
+  CreateOutputFile(name, FORMAT_PS); 
   CTX.print.eps_quality = old; 
 }
 void _save_pstex_simple(char *name){ 
   int old = CTX.print.eps_quality;
   CTX.print.eps_quality = 1; 
-  CreateOutputFile(name, CTX.print.format = FORMAT_PSTEX); 
+  CreateOutputFile(name, FORMAT_PSTEX); 
   CTX.print.eps_quality = old; 
 }
 void _save_pstex_accurate(char *name){     
   int old = CTX.print.eps_quality;
   CTX.print.eps_quality = 2; 
-  CreateOutputFile(name, CTX.print.format = FORMAT_PSTEX); 
+  CreateOutputFile(name, FORMAT_PSTEX); 
   CTX.print.eps_quality = old; 
 }
 void _save_jpegtex(char *name){     
-  CreateOutputFile(name, CTX.print.format = FORMAT_JPEGTEX); 
+  CreateOutputFile(name, FORMAT_JPEGTEX); 
 }
 void _save_tex(char *name){ 
-  CreateOutputFile(name, CTX.print.format = FORMAT_TEX); 
+  CreateOutputFile(name, FORMAT_TEX); 
 }
 void _save_jpeg(char *name){ 
-  CreateOutputFile(name, CTX.print.format = FORMAT_JPEG); 
+  CreateOutputFile(name, FORMAT_JPEG); 
 }
 void _save_gif(char *name){ 
   int dither = CTX.print.gif_dither;
   int transp = CTX.print.gif_transparent;
   CTX.print.gif_dither = 0;
   CTX.print.gif_transparent = 0;
-  CreateOutputFile(name, CTX.print.format = FORMAT_GIF); 
+  CreateOutputFile(name, FORMAT_GIF); 
   CTX.print.gif_dither = dither;
   CTX.print.gif_transparent = transp;
 }
@@ -393,7 +389,7 @@ void _save_gif_dithered(char *name){
   int transp = CTX.print.gif_transparent;
   CTX.print.gif_dither = 1; 
   CTX.print.gif_transparent = 0; 
-  CreateOutputFile(name, CTX.print.format = FORMAT_GIF); 
+  CreateOutputFile(name, FORMAT_GIF); 
   CTX.print.gif_dither = dither;
   CTX.print.gif_transparent = transp;
 }
@@ -402,17 +398,22 @@ void _save_gif_transparent(char *name){
   int transp = CTX.print.gif_transparent;
   CTX.print.gif_dither = 0;
   CTX.print.gif_transparent = 1; 
-  CreateOutputFile(name, CTX.print.format = FORMAT_GIF);
+  CreateOutputFile(name, FORMAT_GIF);
   CTX.print.gif_dither = dither;
   CTX.print.gif_transparent = transp;
 }
 void _save_ppm(char *name){     
- CreateOutputFile(name, CTX.print.format = FORMAT_PPM); 
+ CreateOutputFile(name, FORMAT_PPM); 
 }
 void _save_yuv(char *name){ 
-  CreateOutputFile(name, CTX.print.format = FORMAT_YUV); 
+  CreateOutputFile(name, FORMAT_YUV); 
 }
 
+typedef struct{
+  char *pat;
+  void (*func)(char *name) ;
+} patXfunc;
+
 void file_save_as_cb(CALLBACK_ARGS) {
   int i, nbformats;
   static int patindex=0;
@@ -440,8 +441,9 @@ void file_save_as_cb(CALLBACK_ARGS) {
     { "UCB YUV (*.yuv)", _save_yuv }
   };
 
+  nbformats = sizeof(formats)/sizeof(formats[0]);
+
   if(!pat){
-    nbformats = sizeof(formats)/sizeof(formats[0]);
     pat = (char*)Malloc(nbformats*256*sizeof(char));
     strcpy(pat, formats[0].pat);
     for(i=1; i<nbformats; i++){
@@ -451,7 +453,11 @@ void file_save_as_cb(CALLBACK_ARGS) {
   }
 
   if(file_chooser(0,"Save file as", pat, patindex)){
-    formats[file_chooser_get_filter()].func(file_chooser_get_name(1));
+    i = file_chooser_get_filter();
+    if(i>=0 && i<nbformats)
+      formats[i].func(file_chooser_get_name(1));
+    else // handle any additional automatic fltk filter
+      _save_auto(file_chooser_get_name(1));
   }
   patindex = file_chooser_get_filter();
 }
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 6ded7003cb94b1fd4ee2fe8c430eebe304d0e482..9a844d88458538a30dbd235f9005cf2e1d7e88ba 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.183 2002-06-24 05:03:18 geuzaine Exp $
+// $Id: GUI.cpp,v 1.184 2002-07-03 23:54:10 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -72,8 +72,8 @@ Fl_Menu_Item m_menubar_table[] = {
   {"File", 0, 0, 0, FL_SUBMENU},
     {"Open...",          FL_CTRL+'o', (Fl_Callback *)file_open_cb, 0},
     {"Merge...",         FL_CTRL+'m', (Fl_Callback *)file_merge_cb, 0},
-    {"Save",             FL_CTRL+'s', (Fl_Callback *)mesh_save_cb, 0},
-  //FIXME: {"Save as...",       FL_CTRL+'a', (Fl_Callback *)file_save_as_cb, 0},
+    {"Save mesh",        FL_CTRL+'s', (Fl_Callback *)mesh_save_cb, 0},
+#if (FL_MAJOR_VERSION == 1) && (FL_MINOR_VERSION == 0)
     {"Save as",          0, 0, 0, FL_MENU_DIVIDER|FL_SUBMENU},
       {"By extension...",  FL_CTRL+'e', (Fl_Callback *)file_save_as_auto_cb, 0, FL_MENU_DIVIDER},
       {"Geometry",  0, 0, 0, FL_SUBMENU},
@@ -102,6 +102,9 @@ Fl_Menu_Item m_menubar_table[] = {
          {"UCB YUV (*.yuv)...",           0, (Fl_Callback *)file_save_as_yuv_cb, 0},
          {0},
       {0},
+#else
+    {"Save as...",       FL_CTRL+'a', (Fl_Callback *)file_save_as_cb, 0, FL_MENU_DIVIDER},
+#endif
     {"Visibility...",    FL_SHIFT+'v', (Fl_Callback *)opt_visibility_cb, 0},
     {"Messages...",      FL_SHIFT+'l', (Fl_Callback *)opt_message_cb, 0},
     {"Statistics...",    FL_SHIFT+'i', (Fl_Callback *)opt_statistics_cb, 0, FL_MENU_DIVIDER},
diff --git a/Graphics/CreateFile.cpp b/Graphics/CreateFile.cpp
index 3ae635c559d0d6074c09537439757cabe4b03c87..5cbf8d011f707b6f18f1a5f2f25474f84c583063 100644
--- a/Graphics/CreateFile.cpp
+++ b/Graphics/CreateFile.cpp
@@ -1,4 +1,4 @@
-// $Id: CreateFile.cpp,v 1.31 2002-06-10 16:42:20 geuzaine Exp $
+// $Id: CreateFile.cpp,v 1.32 2002-07-03 23:54:10 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -51,6 +51,8 @@ void CreateOutputFile (char *name, int format) {
 
   if(!name || !strlen(name)) return;
 
+  CTX.print.format = format;
+
   switch(format){
 
   case FORMAT_AUTO :