diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index 77b6dd2b0eabc48dfb3ced2007d4b2e48c8e18be..39a1830d5626a4962241abc4ce04c79bdc095afe 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -2653,10 +2653,9 @@ static void message_browser_cb(Fl_Widget *w, void *data)
     g->copySelectedMessagesToClipboard();
 }
 
-// This dummy box class permits to define a box widget that will not
-// eat the FL_ENTER/FL_LEAVE events (the new Box widget in fltk > 1.1
-// does that, so that gl->handle() was not called when the mouse
-// moved)
+// This dummy box class permits to define a box widget that will not eat the
+// FL_ENTER/FL_LEAVE events (the box widget in fltk > 1.1 does that, so that
+// gl->handle() was not called when the mouse moved)
 class dummyBox : public Fl_Box {
  private:
   int handle(int){ return 0; } // always!
@@ -2664,6 +2663,27 @@ class dummyBox : public Fl_Box {
   dummyBox(int x, int y, int w, int h, const char *l=0) : Fl_Box(x, y, w, h, l) {}
 };
 
+// The main graphic window has a special resize behaviour forcing the message
+// tile to always keep its height
+class mainWindowSpecialResize : public mainWindow {
+ public:
+  mainWindowSpecialResize(int w, int h, bool nonModal, const char *l=0)
+    : mainWindow(w, h, nonModal, l) {}
+  virtual void resize(int X,int Y,int W,int H)
+  {
+    bool special = (shown() && this == FlGui::instance()->graph[0]->getWindow());
+    int old_mh = 0;
+    if(special)
+      old_mh = FlGui::instance()->graph[0]->getMessageHeight();
+    Fl_Window::resize(X, Y, W, H);
+    const int minimum_non_message_height = 100;
+    if(special && old_mh < h() - minimum_non_message_height){
+      int mh = FlGui::instance()->graph[0]->getMessageHeight();
+      FlGui::instance()->graph[0]->resizeMessages(old_mh - mh);
+    }
+  }
+};
+
 graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
   : _autoScrollMessages(true)
 {
@@ -2713,7 +2733,7 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
   // the graphic window should be a "normal" window (neither modal nor
   // non-modal)
   if(main){
-    _win = new mainWindow(width, height, false);
+    _win = new mainWindowSpecialResize(width, height, false);
     _win->callback(file_quit_cb);
   }
   else{
@@ -2820,9 +2840,9 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
     _butt[i]->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   }
 
-  x += 2;
+  x += 4;
   _label = new Fl_Progress(x, mh + glheight + mheight + 2, width - x, sht);
-  _label->box(FL_THIN_DOWN_BOX);
+  _label->box(FL_FLAT_BOX);
   _label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
   _label->color(FL_BACKGROUND_COLOR, FL_DARK2); // FL_DARK_GREEN
 
@@ -2878,7 +2898,7 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
 
   if(main){
     _browser = new Fl_Browser(twidth, mh + glheight, glwidth, mheight);
-    _browser->box(FL_THIN_DOWN_BOX);
+    _browser->box(GMSH_SIMPLE_TOP_BOX);
     _browser->textfont(FL_COURIER);
     _browser->textsize(FL_NORMAL_SIZE - 1);
     _browser->type(FL_MULTI_BROWSER);
@@ -3189,6 +3209,7 @@ int graphicWindow::getGlWidth()
 void graphicWindow::setGlWidth(int w)
 {
   _win->size(w, _win->h());
+  _win->redraw();
   // workaround resizing bug on Mac
   _win->size_range(_minWidth, _minHeight);
 }
@@ -3197,7 +3218,8 @@ void graphicWindow::setGlHeight(int h)
 {
   int hh = h + _bottom->h();
   if(_bar) hh += _bar->h();
-  _win->size(_win->w(), h);
+  _win->size(_win->w(), hh);
+  _win->redraw();
   // workaround resizing bug on Mac
   _win->size_range(_minWidth, _minHeight);
 }
@@ -3243,6 +3265,12 @@ void graphicWindow::showHideMessages()
 }
 
 int graphicWindow::getMessageHeight()
+{
+  if(!_browser) return 0;
+  return _browser->h();
+}
+
+int graphicWindow::getSavedMessageHeight()
 {
   if(!_browser) return 0;
   if(!_browser->h()) return _savedMessageHeight;
diff --git a/Fltk/graphicWindow.h b/Fltk/graphicWindow.h
index 38e7223d3dcbe957c920b57822f5910a41bfa57c..676c4445be1c6625745b88e28c00add61450d982 100644
--- a/Fltk/graphicWindow.h
+++ b/Fltk/graphicWindow.h
@@ -82,6 +82,7 @@ class graphicWindow{
   void saveMessages(const char *filename);
   void copySelectedMessagesToClipboard();
   int getMessageHeight();
+  int getSavedMessageHeight();
   void fillRecentHistoryMenu();
 };
 
diff --git a/Fltk/mainWindow.h b/Fltk/mainWindow.h
index d92dcf255609be4359970eb7d4ad4178d8f4599c..56597f6df0aeea662ed93a88346012e028459820 100644
--- a/Fltk/mainWindow.h
+++ b/Fltk/mainWindow.h
@@ -12,8 +12,13 @@
 
 // Derive the main window from Fl_Window (it shows up faster that way)
 class mainWindow : public Fl_Window {
- private:
-  int handle(int event)
+ public:
+  mainWindow(int w, int h, bool nonModal, const char *l=0)
+    : Fl_Window(w, h, l)
+  {
+    if(nonModal) set_non_modal();
+  }
+  virtual int handle(int event)
   {
     switch (event) {
     case FL_SHORTCUT:
@@ -33,13 +38,11 @@ class mainWindow : public Fl_Window {
     }
     return Fl_Window::handle(event);
   }
- public:
-  mainWindow(int w, int h, bool nonModal, const char *l=0) 
-    : Fl_Window(w, h, l) 
+  virtual void resize(int X,int Y,int W,int H)
   {
-    if(nonModal) set_non_modal();
+    Fl_Window::resize(X, Y, W, H);
   }
-  void show()
+  virtual void show()
   {
     if(non_modal() && !shown()) Fl_Window::show(); // fix ordering
     Fl_Window::show();
diff --git a/Fltk/paletteWindow.h b/Fltk/paletteWindow.h
index f09ef6ca0d1967f6ad681385d376bb887222a055..a6accad9157934aebf025805325fd54576813680 100644
--- a/Fltk/paletteWindow.h
+++ b/Fltk/paletteWindow.h
@@ -12,8 +12,13 @@
 // Derive special windows from Fl_Double_Window to correctly process
 // the OS-specific shorcuts (Esc & Cmd-w on Mac, Alt+F4 on Windows)
 class paletteWindow : public Fl_Double_Window {
- private:
-  int handle(int event)
+ public:
+  paletteWindow(int w, int h, bool nonModal, const char *l=0)
+    : Fl_Double_Window(w, h, l)
+  {
+    if(nonModal) set_non_modal();
+  }
+  virtual int handle(int event)
   {
     switch (event) {
     case FL_SHORTCUT:
@@ -32,13 +37,7 @@ class paletteWindow : public Fl_Double_Window {
     }
     return Fl_Double_Window::handle(event);
   }
- public:
-  paletteWindow(int w, int h, bool nonModal, const char *l=0)
-    : Fl_Double_Window(w, h, l) 
-  {
-    if(nonModal) set_non_modal();
-  }
-  void show()
+  virtual void show()
   {
     if(non_modal() && !shown()) Fl_Double_Window::show(); // fix ordering
     Fl_Double_Window::show();