diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index c3beb1e52b68e1687a3603c21121a38010eec9e7..8234e8d320e6961d1814367408bd46fd0962aecc 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -908,12 +908,18 @@ void GetOptions(int argc, char *argv[])
 #if !defined(HAVE_ONELAB2)
         CTX::instance()->solver.listen = 1;
 #else
-        CTX::instance()->batch = 1;
         if(argv[i]) {
-          CTX::instance()->onelab.listen_port = atoi(argv[i++]);
+          if(strstr(argv[i], "/") || strstr(argv[i], "\\") || !strstr(argv[i], ":")) // UNIX
+            CTX::instance()->onelab.unixSock = std::string(argv[i]);
+          else if(argv[i][0] == 'u') // UDT
+            CTX::instance()->onelab.udtSock = std::string(argv[i++]);
+          else if(argv[i][0] == 't') // TCP
+            CTX::instance()->onelab.tcpSock = std::string(argv[i++]);
+          else // TCP
+            CTX::instance()->onelab.tcpSock = std::string(argv[i]);
         }
-        else
-          CTX::instance()->onelab.listen_port = 1148;
+        else // TCP
+          CTX::instance()->onelab.tcpSock = "127.0.0.1:1148";
 #endif
       }
       else if(!strcmp(argv[i] + 1, "minterpreter")) {
diff --git a/Common/Context.h b/Common/Context.h
index 7d7378a8276baeefc4d7ecd39acc58925c80d11f..0913deddcc1c0c5cd7624ae3fc4fc12e38c6a362 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -264,7 +264,8 @@ class CTX {
   }solver;
   // onelab options
   struct{
-    short listen_port;
+    std::string unixSock, tcpSock, udtSock;
+    bool unixConnected, tcpConnected, udtConnected;
   }onelab;
   // print options
   struct{
diff --git a/Common/Gmsh.cpp b/Common/Gmsh.cpp
index 926ead8bb1650239c0459fc26e808b9f217c0f21..3a8c67f2896c1fb7670c26cfb468f0612610859e 100644
--- a/Common/Gmsh.cpp
+++ b/Common/Gmsh.cpp
@@ -52,6 +52,8 @@
 
 #if defined(HAVE_ONELAB2)
 #include "OnelabServer.h"
+#include "OnelabDatabase.h"
+#include "OnelabException.h"
 #endif
 
 int GmshInitialize(int argc, char **argv)
@@ -238,9 +240,35 @@ int GmshBatch()
             Msg::GetMaxThreads(), Msg::GetMaxThreads() > 1 ? "s" : "");
   Msg::Info("Started on %s", Msg::GetLaunchDate().c_str());
 #if defined(HAVE_ONELAB2)
-  if(CTX::instance()->onelab.listen_port > 0) {
-    OnelabServer::instance(0, CTX::instance()->onelab.listen_port);
-    OnelabServer::instance()->Run();
+  try {
+    if(CTX::instance()->onelab.unixSock.size() > 0) { // UNIX
+      std::ostringstream tmp;
+      tmp << CTX::instance()->homeDir << CTX::instance()->onelab.unixSock;
+      OnelabServer::instance()->listenOnUnix(tmp.str().c_str());
+    }
+    if(CTX::instance()->onelab.tcpSock.size() > 0) {
+      std::size_t colon = CTX::instance()->onelab.tcpSock.find(":");
+      OnelabServer::instance()->listenOnTcp(
+        ip4_inet_pton(CTX::instance()->onelab.tcpSock.substr(0, colon).c_str()),
+        atoi(CTX::instance()->onelab.tcpSock.substr(colon+1, CTX::instance()->onelab.tcpSock.size()-colon-1).c_str()));
+    }
+#if defined(HAVE_UDT)
+    if(CTX::instance()->onelab.udtSock.size() > 0) {
+      std::size_t colon = CTX::instance()->onelab.tcpSock.find(":");
+      OnelabServer::instance()->listenOnUdt(
+        ip4_inet_pton(CTX::instance()->onelab.tcpSock.substr(0, colon).c_str()),
+        atoi(CTX::instance()->onelab.tcpSock.substr(colon+1, CTX::instance()->onelab.tcpSock.size()-colon-1).c_str()));
+    }
+#endif
+  } catch(NetworkException e) {
+    std::cout << e.what() << std::endl;
+    Msg::Exit(1);
+  }
+  if(CTX::instance()->onelab.unixSock.size() > 0
+    || CTX::instance()->onelab.tcpSock.size() > 0
+    || CTX::instance()->onelab.udtSock.size() > 0) {
+    std::cout << "Press any key to stop the server." << std::endl;
+    std::cin.get();
     Msg::Exit(0);
   }
 #endif
diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 79d4ece02da64efc8a56e5d926a20d505770a5b3..6e198e1f87bfc7d8a0c424aae0995f94566a174b 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -906,6 +906,12 @@ void Msg::InitializeOnelab(const std::string &name, const std::string &sockname)
       Error("Unable to connect ONELAB server (%s)", sockname.c_str());
       Exit(1);
     }
+#if defined(HAVE_FLTK)
+    else if(FlGui::available()) // FIXME
+      c->setCallback(FlGui::instance()->onelab);
+    else
+      Warning("FlGUI not available");
+#endif
     _onelabClient = OnelabDatabase::instance();
 
     SetOnelabNumber(name + "/UseCommandLine", 1, false);
@@ -946,7 +952,7 @@ void Msg::InitializeOnelab(const std::string &name, const std::string &sockname)
     std::vector<onelab::string> ps;
     _onelabClient->get(ps, name + "/Action");
     if(ps.size()){
-      //Info("Performing ONELAB '%s'", ps[0].getValue().c_str());
+      Info("Performing ONELAB '%s'", ps[0].getValue().c_str());
       if(ps[0].getValue() == "initialize") Exit(0);
     }
   }
diff --git a/Common/OS.cpp b/Common/OS.cpp
index 8bba8ce5796f55a152cdff75e9ce064e13492667..666101d70cbac867616bf0e5dc8b1e17d222bf17 100644
--- a/Common/OS.cpp
+++ b/Common/OS.cpp
@@ -14,6 +14,7 @@
 #include <signal.h>
 #include <time.h>
 #include <math.h>
+#include "FlGui.h"
 #include "GmshConfig.h"
 #include "StringUtils.h"
 #include "Context.h"
@@ -575,7 +576,13 @@ int SystemCallExe(const std::string &exe, const std::string &argsOrCommand,
     return 1;
   }
   if(!blocking) cmd += " &";
+#if defined(HAVE_FLTK)
+  FlGui::instance()->lock();
+#endif
   Msg::Info("Calling '%s'", cmd.c_str());
+#if defined(HAVE_FLTK)
+  FlGui::instance()->unlock();
+#endif
   if(!system(cmd.c_str())) return 1;
 #endif
   return 0;