diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 8d21799c9869505360f80ab80a32451c5367dd79..1e56f3503a7ac2aa82e00544556555beeb98324c 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.319 2004-06-30 07:51:07 geuzaine Exp $
+// $Id: GUI.cpp,v 1.320 2004-06-30 16:38:58 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -285,11 +285,11 @@ Context_Item menu_mesh[] = {
   { "1D",     (Fl_Callback *)mesh_1d_cb } ,
   { "2D",     (Fl_Callback *)mesh_2d_cb } , 
   { "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
+  { "First order",  (Fl_Callback *)mesh_degree_cb, (void*)1 } , 
+  { "Second order", (Fl_Callback *)mesh_degree_cb, (void*)2 } , 
   { "Save",   (Fl_Callback *)mesh_save_cb } ,
   { NULL } 
 };  
diff --git a/Mesh/3D_Mesh_Netgen.cpp b/Mesh/3D_Mesh_Netgen.cpp
index b56929e6462f6b1a5bc48b63f5521d8e038e3baa..149e121d4c289bb7088832d43f6887e0cb79b524 100644
--- a/Mesh/3D_Mesh_Netgen.cpp
+++ b/Mesh/3D_Mesh_Netgen.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Mesh_Netgen.cpp,v 1.7 2004-06-30 07:27:19 geuzaine Exp $
+// $Id: 3D_Mesh_Netgen.cpp,v 1.8 2004-06-30 16:38:58 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -69,7 +69,8 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh)
   : _volverts(0), _vol(vol)
 {
   // creates Netgen mesh structure
-  Ng_Init();
+  //Ng_Init();
+  NgAddOn_Init();
   _ngmesh = Ng_NewMesh();
   
   // Get all surface vertices (the same vertex can belong to several
@@ -194,6 +195,9 @@ void Netgen::TransferVolumeMesh()
 {
   // Gets total number of vertices of Netgen's mesh
   int nbv = Ng_GetNP(_ngmesh);
+  
+  if(!nbv) return;
+
   Vertex **vtable = (Vertex **)Malloc(nbv * sizeof(Vertex*));
   
   // Get existing unmodified surface vertices
@@ -276,6 +280,12 @@ int Mesh_Netgen(Volume * v)
 
 void Optimize_Netgen(Volume * v)
 {
+  // abort of we don't have real volumes (volume is "dirty", or has no
+  // surface loop w/ oriented surfaces) or if there are no simplices
+  // to optimize
+  if(v->Dirty || Extrude_Mesh(v) || !Tree_Nbr(v->Simplexes))
+    return;
+
   Msg(STATUS3, "Optimizing volume %d", v->Num);
   Netgen ng(v, 1);
   ng.OptimizeVolume();
diff --git a/Netgen/Makefile b/Netgen/Makefile
index 29e0c73238cf3840b675e219c0deaf295373cfda..6865e6275beee4321983d765185a1a28c7d60c31 100644
--- a/Netgen/Makefile
+++ b/Netgen/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.2 2004-06-28 19:00:22 geuzaine Exp $
+# $Id: Makefile,v 1.3 2004-06-30 16:38:58 geuzaine Exp $
 #
 # Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 #
@@ -22,7 +22,7 @@
 include ../variables
 
 LIB     = ../lib/libGmshNetgen.a
-INCLUDE = -Ilibsrc/include 
+INCLUDE = -I../Common -Ilibsrc/include -Ilibsrc/interface
 CFLAGS  = ${OPTIM} ${INCLUDE} -DNO_PARALLEL_THREADS
 
 SRC = libsrc/opti/linopt.cpp \
diff --git a/Netgen/nglib_addon.cpp b/Netgen/nglib_addon.cpp
index 51d379a965d8a599cdac3625a593d0c3a4408d42..f6107330479e412bb0a9365ec78232217105a3a2 100644
--- a/Netgen/nglib_addon.cpp
+++ b/Netgen/nglib_addon.cpp
@@ -1,10 +1,63 @@
 // small addition(s) to the netgen interface library
 
-#include <meshing.hpp>
-#include "libsrc/interface/nglib.h"
+#include "meshing.hpp"
+#include "mystdlib.h"
+#include "nglib.h"
 
 using namespace netgen;
 
+#include <iostream.h>
+#include "Message.h"
+
+class mystreambuf: public streambuf
+{
+  int index;
+  char txt[1024];
+ public:
+  mystreambuf() { 
+    index = 0; 
+  }
+  int sync(){ 
+    txt[index] = '\0';
+    if(!index || 
+       (index == 1 && (txt[0] == '.' || txt[0] == '+' || txt[0] == ' '))){
+      // ignore these messages
+    }
+    else{
+      Msg(INFO, txt);
+    }
+    index = 0; 
+    return 0; 
+  }
+  int overflow(int ch){ 
+    if(index < 1023){
+      txt[index] = ch;
+      if(txt[index] == '\n') txt[index] = ' ';
+      if(!index && txt[0] == ' '){
+	// skip initial spaces
+      }
+      else{
+	index++;
+      }
+    }
+    return 0; 
+  }
+};
+
+// replaces the standard Ng_Init
+void NgAddOn_Init ()
+{
+  //mycout = &cout;
+  //myerr = &cerr;
+  //testout = new ofstream ("test.out");
+
+  mycout = new ostream(new mystreambuf());
+  myerr = new ostream(new mystreambuf());
+  testout = new ofstream ("/dev/null");
+}
+
+// optimizes an existing 3D mesh
+
 Ng_Result NgAddOn_OptimizeVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp)
 {
   Mesh * m = (Mesh*)mesh;
diff --git a/Netgen/nglib_addon.h b/Netgen/nglib_addon.h
index 9f1f84f51baef8697b14dd28b9c654415061783d..b8e56d32ef3b3ad8cfa32ba98ff55f7eae06343f 100644
--- a/Netgen/nglib_addon.h
+++ b/Netgen/nglib_addon.h
@@ -1,6 +1,7 @@
 #ifndef _NGLIB_ADDON_H_
 #define _NGLIB_ADDON_H_
 
-Ng_Result NgAddOn_OptimizeVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp);
+void NgAddOn_Init();
+Ng_Result NgAddOn_OptimizeVolumeMesh(Ng_Mesh * mesh, Ng_Meshing_Parameters * mp);
 
 #endif