diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 67acefa990fb11acada88e47a085d5c81a0036af..1cd05cd267a748f92da0190151549de6261b4330 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.250 2004-06-22 17:39:11 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.251 2004-06-30 07:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -2488,6 +2488,20 @@ void mesh_degree_cb(CALLBACK_ARGS)
   Msg(STATUS3N, "Ready");
 }
 
+void mesh_optimize_cb(CALLBACK_ARGS)
+{
+  List_T *list = Tree2List(THEM->Volumes);
+  for(int i = 0; i < List_Nbr(list); i++){
+    Volume *v;
+    List_Read(list, i, &v);
+    Optimize_Netgen(v);
+  }
+  List_Delete(list);
+  CTX.mesh.changed = 1;
+  Draw();
+  Msg(STATUS3N, "Ready");
+}
+
 void mesh_define_length_cb(CALLBACK_ARGS)
 {
   Vertex *v;
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index a635d0eecd364840d279a78bbfe4dd461e1c2782..aeb2891a51175ef95ab8c1e58c9825a1d678240a 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -250,6 +250,7 @@ void mesh_1d_cb(CALLBACK_ARGS) ;
 void mesh_2d_cb(CALLBACK_ARGS) ; 
 void mesh_3d_cb(CALLBACK_ARGS) ; 
 void mesh_degree_cb(CALLBACK_ARGS) ; 
+void mesh_optimize_cb(CALLBACK_ARGS) ; 
 void mesh_define_length_cb (CALLBACK_ARGS) ;
 void mesh_define_recombine_cb (CALLBACK_ARGS) ;
 void mesh_define_transfinite_cb (CALLBACK_ARGS) ; 
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index ba444ae58a88c219afb7942a19d371da5a29d60a..8d21799c9869505360f80ab80a32451c5367dd79 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.318 2004-06-22 17:39:11 geuzaine Exp $
+// $Id: GUI.cpp,v 1.319 2004-06-30 07:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -287,6 +287,9 @@ Context_Item menu_mesh[] = {
   { "3D",     (Fl_Callback *)mesh_3d_cb } , 
   { "First order",  (Fl_Callback *)mesh_degree_cb, (void*)1 } , 
   { "Second order", (Fl_Callback *)mesh_degree_cb, (void*)2 } , 
+#if defined(HAVE_NETGEN)
+  { "Optimize 3D", (Fl_Callback *)mesh_optimize_cb } , 
+#endif
   { "Save",   (Fl_Callback *)mesh_save_cb } ,
   { NULL } 
 };