diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 1ba0aa8b7e72411f37de380e186e6a01c60032bb..89477690d7b759a38174d6f394fd2b13f170f1fd 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.405 2006-01-28 07:07:11 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.406 2006-02-04 03:43:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -2850,15 +2850,19 @@ void geometry_physical_add_volume_cb(CALLBACK_ARGS)
 
 void mesh_save_cb(CALLBACK_ARGS)
 {
-  Print_Mesh(THEM, CTX.output_filename, CTX.mesh.format);
-}
-
-void mesh_save_all_cb(CALLBACK_ARGS)
-{
-  int all = CTX.mesh.save_all;
-  CTX.mesh.save_all = 1;
-  Print_Mesh(THEM, CTX.output_filename, CTX.mesh.format);
-  CTX.mesh.save_all = all;
+  char name[256];
+  if(CTX.output_filename)
+    strcpy(name, CTX.output_filename);
+  else
+    GetDefaultMeshFileName(THEM, CTX.mesh.format, name);
+  if(CTX.confirm_overwrite) {
+    struct stat buf;
+    if(!stat(name, &buf))
+      if(!fl_choice("File '%s' already exists.\n\nDo you want to replace it?",
+		    "Cancel", "Replace", NULL, name))
+	return;
+  }
+  Print_Mesh(THEM, name, CTX.mesh.format);
 }
 
 void mesh_define_cb(CALLBACK_ARGS)
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index d0a1092ae8a578c6e4f93fe74f478a15aaf248dc..2862b4f2a7d71cfb30e4f0c8a3f90cefb6b11c05 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -268,7 +268,6 @@ void con_geometry_snap_cb(CALLBACK_ARGS);
 // Dynamic Mesh Menus
 
 void mesh_save_cb(CALLBACK_ARGS);
-void mesh_save_all_cb(CALLBACK_ARGS);
 void mesh_define_cb(CALLBACK_ARGS);
 void mesh_1d_cb(CALLBACK_ARGS);
 void mesh_2d_cb(CALLBACK_ARGS); 
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 183fff3ecf9d52c7037cc1c499830c8d4190bfda..5b8a07c6476c21df42d31b59d9f628a517f58039 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -420,6 +420,7 @@ void Print_Geo(Mesh *M, char *c);
 void Print_Mesh(Mesh *M, char *c, int Type);
 void Read_Mesh(Mesh *M, FILE *fp, char *filename, int Type);
 void GetStatistics(double s[50]);
+void GetDefaultMeshFileName(Mesh *M, int Type, char *name);
 
 void Maillage_Dimension_1(Mesh *M);
 void Maillage_Dimension_2(Mesh *M);
diff --git a/Mesh/Print_Mesh.cpp b/Mesh/Print_Mesh.cpp
index 72ed29a3f295c71c5f1f5e7c005a02ce8d81e9b8..8e53f7952ee9e98819f1c96bd1fa2c91868c4e06 100644
--- a/Mesh/Print_Mesh.cpp
+++ b/Mesh/Print_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Print_Mesh.cpp,v 1.69 2006-01-29 21:53:31 geuzaine Exp $
+// $Id: Print_Mesh.cpp,v 1.70 2006-02-04 03:43:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -1843,19 +1843,10 @@ void Print_Mesh_P3D(Mesh *M, FILE *fp)
 
 // Public Print_Mesh routine
 
-void Print_Mesh(Mesh *M, char *c, int Type)
+void GetDefaultMeshFileName(Mesh *M, int Type, char *name)
 {
-  char name[256], ext[10]="";
-
-  if(CTX.threads_lock) {
-    Msg(INFO, "I'm busy! Ask me that later...");
-    return;
-  }
-
-  CTX.threads_lock = 1;
-
+  char ext[10] = "";
   strcpy(name, M->name);
-
   switch(Type){
   case FORMAT_MSH:  strcpy(ext, ".msh"); break;
   case FORMAT_VRML: strcpy(ext, ".wrl"); break;
@@ -1864,12 +1855,26 @@ void Print_Mesh(Mesh *M, char *c, int Type)
   case FORMAT_DMG:  strcpy(ext, ".dmg"); break;
   case FORMAT_STL:  strcpy(ext, ".stl"); break;
   case FORMAT_P3D:  strcpy(ext, ".p3d"); break;
-  default:
-    Msg(GERROR, "Unknown mesh file format %d", Type);
+  default: Msg(GERROR, "Unknown mesh file format %d", Type); break;
+  }
+  strcat(name, ext);
+}
+
+void Print_Mesh(Mesh *M, char *filename, int Type)
+{
+  char name[256];
+
+  if(CTX.threads_lock) {
+    Msg(INFO, "I'm busy! Ask me that later...");
     return;
   }
-  
-  c ? strcpy(name, c) : strcat(name, ext);
+
+  CTX.threads_lock = 1;
+
+  if(!filename)
+    GetDefaultMeshFileName(M, Type, name);
+  else
+    strcpy(name, filename);
 
   Msg(INFO, "Writing mesh file '%s'", name);