diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 3d825064544f1a2d1366982b57d44666400010f3..863d1b59486f69eb156bcea22d8e251c6cbacd5b 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -264,7 +264,7 @@ void Msg::Fatal(const char *fmt, ...)
 
 #if defined(HAVE_FLTK)
   if(FlGui::available()){
-    FlGui::instance()->check();
+    if(FlGui::instance()->in_main_thread()) FlGui::instance()->check();
     std::string tmp = std::string("@C1@.") + "Fatal   : " + str;
     FlGui::instance()->addMessage(tmp.c_str());
     if(_firstError.empty()) _firstError = str;
@@ -310,9 +310,7 @@ void Msg::Error(const char *fmt, ...)
 
 #if defined(HAVE_FLTK)
   if(FlGui::available()){
-#ifndef HAVE_ONELAB2
-    FlGui::instance()->check();
-#endif
+    if(FlGui::instance()->in_main_thread()) FlGui::instance()->check();
     std::string tmp = std::string("@C1@.") + "Error   : " + str;
     FlGui::instance()->addMessage(tmp.c_str());
     if(_firstError.empty()) _firstError = str;
@@ -350,7 +348,7 @@ void Msg::Warning(const char *fmt, ...)
 
 #if defined(HAVE_FLTK)
   if(FlGui::available()){
-    FlGui::instance()->check();
+    if(FlGui::instance()->in_main_thread()) FlGui::instance()->check();
     std::string tmp = std::string("@C5@.") + "Warning : " + str;
     FlGui::instance()->addMessage(tmp.c_str());
     if(_firstWarning.empty()) _firstWarning = str;
@@ -390,7 +388,7 @@ void Msg::Info(const char *fmt, ...)
 #endif
   {
     if(FlGui::available()){
-      FlGui::instance()->check();
+      if(FlGui::instance()->in_main_thread()) FlGui::instance()->check();
       std::string tmp = std::string("Info    : ") + str;
       FlGui::instance()->addMessage(tmp.c_str());
     }
@@ -429,9 +427,7 @@ void Msg::Direct(const char *fmt, ...)
 #endif
   {
     if(FlGui::available()){
-#ifndef HAVE_ONELAB2
-      FlGui::instance()->check();
-#endif
+      if(FlGui::instance()->in_main_thread()) FlGui::instance()->check();
       std::string tmp = std::string("@C4@.") + str;
       FlGui::instance()->addMessage(tmp.c_str());
     }
@@ -470,9 +466,7 @@ void Msg::StatusBar(bool log, const char *fmt, ...)
 #endif
   {
     if(FlGui::available()){
-#ifndef HAVE_ONELAB2
-      if(log) FlGui::instance()->check();
-#endif
+      if(log && FlGui::instance()->in_main_thread()) FlGui::instance()->check();
       if(!log || _verbosity > 4)
 	FlGui::instance()->setStatus(str);
       if(log){
@@ -554,7 +548,7 @@ void Msg::ProgressMeter(int n, int N, bool log, const char *fmt, ...)
 
 #if defined(HAVE_FLTK)
     if(FlGui::available() && _verbosity > 4){
-      FlGui::instance()->check();
+      if(FlGui::instance()->in_main_thread()) FlGui::instance()->check();
       FlGui::instance()->setProgress(str, (n > N - 1) ? 0 : n, 0, N);
     }
 #endif
diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp
index 8b8172faeb8ec4dbfb291bb5a7d16b4983657107..70272aa6ad88a300c9029159e94c4b5e86d8a92e 100644
--- a/Fltk/FlGui.cpp
+++ b/Fltk/FlGui.cpp
@@ -74,6 +74,9 @@ static int globalShortcut(int event)
   return FlGui::instance()->testGlobalShortcuts(event);
 }
 
+int FlGui::lock(){_in_main_thread++; Fl::lock();}
+void FlGui::unlock(){Fl::unlock(); _in_main_thread--;}
+
 static void simple_right_box_draw(int x, int y, int w, int h, Fl_Color c)
 {
   fl_color(c); fl_rectf(x, y, w, h);
@@ -384,6 +387,8 @@ FlGui::FlGui(int argc, char **argv)
   // init solver plugin stuff
   callForSolverPlugin(-1);
 
+  _in_main_thread = 0;
+
   // draw
   for(unsigned int i = 0; i < graph.size(); i++)
     for(unsigned int j = 0; j < graph[i]->gl.size(); j++)
diff --git a/Fltk/FlGui.h b/Fltk/FlGui.h
index 71a14ad480d03750792174a634f185a5be6b2b2d..467e8e306a00417ff6062cdcce2fb5dc8e56b264 100644
--- a/Fltk/FlGui.h
+++ b/Fltk/FlGui.h
@@ -45,6 +45,7 @@ class FlGui{
  private:
   static FlGui *_instance;
   static std::string _openedThroughMacFinder;
+  int _in_main_thread;
   std::string _lastStatus;
  public:
   std::vector<GVertex*> selectedVertices;
@@ -83,6 +84,9 @@ class FlGui{
   static void wait();
   // wait (at most time seconds) for any events, then process them
   static void wait(double time);
+  int lock();
+  void unlock();
+  bool in_main_thread() {return _in_main_thread==0;}
   // is a file opened through the Mac Finder?
   static void setOpenedThroughMacFinder(const std::string &name)
   {
diff --git a/contrib/onelab2/GmshLocalClient.cpp b/contrib/onelab2/GmshLocalClient.cpp
index 6ff67095c4ec02a41d9cfede28675ea721c69ba6..e3e7c96af50f000c3f85469f5a8af8d9f78fce8a 100644
--- a/contrib/onelab2/GmshLocalClient.cpp
+++ b/contrib/onelab2/GmshLocalClient.cpp
@@ -1,6 +1,7 @@
 #include "GmshLocalClient.h"
 #include "onelabUtils.h"
 #ifdef HAVE_FLTK
+#include "FlGui.h"
 #include "GmshMessage.h"
 #include "onelab2Group.h"
 #include "OpenFile.h"
@@ -10,33 +11,33 @@ void GmshLocalClient::setCallback(onelabGroup *cb) {_cb_obj = cb;}
 void GmshLocalClient::onNewParameter(onelab::parameter *p)
 {
   if(_cb_obj) {
-    Fl::lock();
+    FlGui::instance()->lock();
     _cb_obj->addParameter(*p);
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
 void GmshLocalClient::onUpdateParameter(onelab::parameter *p)
 {
   if(_cb_obj) {
-    Fl::lock();
+    FlGui::instance()->lock();
     _cb_obj->updateParameter(*p);
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
 void GmshLocalClient::onRemoveParameter(onelab::parameter *p)
 {
   if(_cb_obj) {
-    Fl::lock();
+    FlGui::instance()->lock();
     _cb_obj->removeParameter(*p);
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
 void GmshLocalClient::onMessage(const std::string & name, const std::string &message, int level)
 {
-  Fl::lock();
+  FlGui::instance()->lock();
   switch(level) {
     case OnelabAttrMessage::Info:
       Msg::Direct("Info    : %s - %s", name.c_str(), message.c_str());
@@ -48,7 +49,7 @@ void GmshLocalClient::onMessage(const std::string & name, const std::string &mes
       Msg::Error("%s - %s", name.c_str(), message.c_str());
       break;
   }
-  Fl::unlock();
+  FlGui::instance()->unlock();
   Fl::awake((void *)NULL);
 }
 void GmshLocalClient::refresh()
@@ -57,18 +58,18 @@ void GmshLocalClient::refresh()
 }
 void GmshLocalClient::mergeFile(const std::string &filename)
 {
-  Fl::lock();
+  FlGui::instance()->lock();
   MergePostProcessingFile(filename, CTX::instance()->solver.autoShowViews, CTX::instance()->solver.autoShowLastStep, true);
-  Fl::unlock();
+  FlGui::instance()->unlock();
   Fl::awake((void *)NULL);
 }
 #endif
 
 void GmshLocalClient::run(std::string action) {
   if(getName() == "Gmsh") {
-    Fl::lock();
+    FlGui::instance()->lock();
     onelabUtils::runGmshClient(action, 2); 
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
diff --git a/contrib/onelab2/GmshNetworkClient.cpp b/contrib/onelab2/GmshNetworkClient.cpp
index 2c368be8e7aa41d2d3cafbeb041249b6fbac3132..f0c2be12849f07a9a74e626cbcf029b286305ee2 100644
--- a/contrib/onelab2/GmshNetworkClient.cpp
+++ b/contrib/onelab2/GmshNetworkClient.cpp
@@ -2,6 +2,7 @@
 
 #include "GmshNetworkClient.h"
 #ifdef HAVE_FLTK
+#include "FlGui.h"
 #include "onelab2Group.h"
 #include "GmshMessage.h"
 
@@ -9,33 +10,33 @@ void GmshNetworkClient::setCallback(onelabGroup *cb) {_cb_obj = cb;}
 void GmshNetworkClient::onNewParameter(onelab::parameter *p)
 {
   if(_cb_obj) {
-    Fl::lock();
+    FlGui::instance()->lock();
     _cb_obj->addParameter(*p);
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
 void GmshNetworkClient::onUpdateParameter(onelab::parameter *p)
 {
   if(_cb_obj) {
-    Fl::lock();
+    FlGui::instance()->lock();
     _cb_obj->updateParameter(*p);
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
 void GmshNetworkClient::onRemoveParameter(onelab::parameter *p)
 {
   if(_cb_obj) {
-    Fl::lock();
+    FlGui::instance()->lock();
     _cb_obj->removeParameter(*p);
-    Fl::unlock();
+    FlGui::instance()->unlock();
     Fl::awake((void *)NULL);
   }
 }
 void GmshNetworkClient::onMessage(const std::string & name, const std::string &message, int level)
 {
-  Fl::lock();
+  FlGui::instance()->lock();
   switch(level) {
     case OnelabAttrMessage::Info:
       Msg::Direct("Info    : %s - %s", name.c_str(), message.c_str());
@@ -47,7 +48,7 @@ void GmshNetworkClient::onMessage(const std::string & name, const std::string &m
       Msg::Error("%s - %s", name.c_str(), message.c_str());
       break;
   }
-  Fl::unlock();
+  FlGui::instance()->unlock();
   Fl::awake((void *)NULL);
 }
 #endif