diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index 8050d55b6f35f9d617708c881b410ef470d2f6c4..55cffc680e80799fc2b93642de63a59466708735 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -880,29 +880,12 @@ void GetOptions(int argc, char *argv[])
         CTX::instance()->batch = 1;
         i++;
         if(argv[i]) {
-          CTX::instance()->onelab.listen_port = atoi(argv[i]);
+          CTX::instance()->onelab.listen_port = atoi(argv[i++]);
         }
         else
           CTX::instance()->onelab.listen_port = 1148;
-        // TODO get port if one is provided
 #endif
       }
-      else if(!strcmp(argv[i] + 1, "server")) {
-        CTX::instance()->batch = 1;
-        i++;
-        if(argv[i]){
-          std::string hostname = std::string(argv[i]);
-          size_t colon = hostname.find(':');
-          if(colon != std::string::npos) {
-            strcpy(&CTX::instance()->onelab.server_ip[0], hostname.substr(0,colon).c_str());
-            CTX::instance()->onelab.server_port = atoi(hostname.substr(colon+1).c_str());
-          }
-          else {
-            CTX::instance()->onelab.server_ip[0] = '\0';
-            CTX::instance()->onelab.server_port = 0;
-          }
-        }
-      }
       else if(!strcmp(argv[i] + 1, "minterpreter")) {
         i++;
         if(argv[i])
diff --git a/Common/Context.h b/Common/Context.h
index a1ce981aa3c1aea3c905e9dd127b6a6b07340d3d..2612cc4a46da692fd409e2fa2679f0d314c40d59 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -256,8 +256,7 @@ class CTX {
   }solver;
   // onelab options
   struct{
-    short listen_port, server_port;
-    char server_ip[16];
+    short listen_port;
   }onelab;
   // print options
   struct{
diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 489b67f2cf7c13beab1b38ea8cec3ef7fa89a082..e5f9ded7eae1bdd510e8c000834bd79696def7d5 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -67,7 +67,7 @@ GmshClient *Msg::_client = 0;
 std::string Msg::_execName;
 #if defined(HAVE_ONELAB2)
 OnelabDatabase *OnelabDatabase::_instance = NULL;
-GmshNetworkClient *Msg::_onelabClient = 0;
+OnelabDatabase *Msg::_onelabClient = 0;
 #elif defined(HAVE_ONELAB)
 onelab::client *Msg::_onelabClient = 0;
 #endif
@@ -714,7 +714,9 @@ int Msg::GetAnswer(const char *question, int defaultval, const char *zero,
 
 bool Msg::UseOnelab()
 {
-#if defined(HAVE_ONELAB)
+#if defined(HAVE_ONELAB2)
+  return true;
+#elif defined(HAVE_ONELAB)
   return _onelabClient ? true : false;
 #else
   return false;
@@ -786,10 +788,6 @@ public:
 void Msg::InitializeOnelab(const std::string &name, const std::string &sockname)
 {
 #ifdef HAVE_ONELAB2
-  if(_onelabClient) {
-    delete _onelabClient;
-    _onelabClient = 0;
-  }
   if(sockname.empty()){
     if(name != "Gmsh"){ // load db from file:
       FILE *fp = Fopen(name.c_str(), "rb");
@@ -800,6 +798,7 @@ void Msg::InitializeOnelab(const std::string &name, const std::string &sockname)
       else
         Error("Error loading onelab database '%s'", name.c_str());
     }
+    _onelabClient = OnelabDatabase::instance();
   }
   else{
     UInt32 address = 0;
@@ -814,7 +813,7 @@ void Msg::InitializeOnelab(const std::string &name, const std::string &sockname)
       Error("Unable to connect ONELAB server (%s)", sockname.c_str());
       Exit(1);
     }
-    _onelabClient = c;
+    _onelabClient = OnelabDatabase::instance();
 
     SetOnelabNumber(name + "/UseCommandLine", 1, false);
     SetOnelabString(name + "/FileExtension", ".geo", false);
@@ -1176,8 +1175,7 @@ void Msg::FinalizeOnelab()
 {
 #ifdef HAVE_ONELAB2
   if(_onelabClient) {
-    _onelabClient->disconnect();
-    OnelabDatabase::instance()->wait();
+    _onelabClient->finalize();
     delete _onelabClient;
     _onelabClient = 0;
   }
diff --git a/Common/GmshMessage.h b/Common/GmshMessage.h
index 38ebc84d90a23fe72890dc7e501be6dda713c700..37e59c8da42de5105d569aa0c94efed95774d86d 100644
--- a/Common/GmshMessage.h
+++ b/Common/GmshMessage.h
@@ -16,7 +16,7 @@
 class GmshClient;
 namespace onelab{ class client; }
 #ifdef HAVE_ONELAB2
-class GmshNetworkClient;
+class OnelabDatabase;
 #endif
 
 // the external message handler
@@ -50,7 +50,7 @@ class Msg {
   static GmshClient *_client;
 #if defined(HAVE_ONELAB2)
   // communication with onelab server (replace _client and old _onelabClient)
-  static GmshNetworkClient *_onelabClient;
+  static OnelabDatabase *_onelabClient;
 #elif defined(HAVE_ONELAB)
   // communication with onelab server
   static onelab::client *_onelabClient;
@@ -108,7 +108,7 @@ class Msg {
   static void LoadOnelabClient(const std::string &name, const std::string &sockName);
   static GmshClient *GetGmshClient(){ return _client; }
 #if defined(HAVE_ONELAB2)
-  static GmshNetworkClient *GetOnelabClient(){ return _onelabClient; }
+  static OnelabDatabase *GetOnelabClient(){ return _onelabClient; }
 #elif defined(HAVE_ONELAB)
   static onelab::client *GetOnelabClient(){ return _onelabClient; }
 #endif
diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp
index 4642db2360bad7acd619cad49bc5a7574158a34d..e447b3893c2bd0954a06da204740e196c0537715 100644
--- a/Common/OpenFile.cpp
+++ b/Common/OpenFile.cpp
@@ -487,6 +487,9 @@ int MergeFile(const std::string &fileName, bool warnIfMissing, bool setWindowTit
 #endif
     else {
       status = GModel::readGEO(fileName);
+#ifdef HAVE_ONELAB2
+      Msg::SetOnelabString("Gmsh/1ModelName", fileName, false);
+#endif
     }
   }
 
diff --git a/Fltk/onelab2Group.cpp b/Fltk/onelab2Group.cpp
index ceb13b8e68c5e5db1e2ec0c9991b60c341a747a3..15182af70e7581b4889e235c73d4eeb1675e4a64 100644
--- a/Fltk/onelab2Group.cpp
+++ b/Fltk/onelab2Group.cpp
@@ -142,7 +142,6 @@ void solver_cb(Fl_Widget *w, void *data)
   int num = (intptr_t)data;
   if(num >= 0){
     std::string name = opt_solver_name(num, GMSH_GET, "");
-    std::cout << name << ' ';
     std::string exe = opt_solver_executable(num, GMSH_GET, "");
     std::string host = opt_solver_remote_login(num, GMSH_GET, "");
     OnelabDatabase::instance()->run("initialize", name);
@@ -409,7 +408,6 @@ static void onelab_number_input_range_cb(Fl_Widget *w, void *data)
 {
   if(!data) return;
   std::string name((char*)data);
-  std::cout << name << std::endl;
   std::vector<onelab::number> numbers;
   OnelabDatabase::instance()->get(numbers, name);
   if(numbers.size()){
diff --git a/Geo/GModel.h b/Geo/GModel.h
index ebef3c99f45f757d3c7b6ca9ee60e14f2790192e..dc4d26914e5af40e27c8c545259048143e832379 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -219,9 +219,6 @@ class GModel
   // get/set the model file name
   void setFileName(std::string fileName)
   {
-#ifdef HAVE_ONELAB2
-    Msg::SetOnelabString("Gmsh/1ModelName", fileName, false);
-#endif
     _fileName = fileName;
     _fileNames.insert(fileName);
   }
diff --git a/contrib/onelab2/OnelabDatabase.cpp b/contrib/onelab2/OnelabDatabase.cpp
index 63e54290f70ecf27977d374d41f42211a78b3807..8ff5dd031a3dc2ce9fbfd4f2b7e89b2b360d726d 100644
--- a/contrib/onelab2/OnelabDatabase.cpp
+++ b/contrib/onelab2/OnelabDatabase.cpp
@@ -93,3 +93,14 @@ DWORD WINAPI OnelabDatabase_server(LPVOID arg)
 {
   OnelabServer::instance()->Run();
 }
+
+void OnelabDatabase::finalize()
+{
+  if(_client) {
+    _client->disconnect();
+    pthread_join(_listenThread, NULL);
+  }
+  else {
+    //TODO pthread_join(_serverThread, NULL);
+  }
+}
diff --git a/contrib/onelab2/OnelabDatabase.h b/contrib/onelab2/OnelabDatabase.h
index 78f3dab21b1f752460ddfe72e57a9c71f98a2327..5e7db5312a03b6fdec8f025c8ede78a1741c1b67 100644
--- a/contrib/onelab2/OnelabDatabase.h
+++ b/contrib/onelab2/OnelabDatabase.h
@@ -110,10 +110,7 @@ public:
   bool networkClientHaveToStop() {return _haveToStop;}
   void haveToDo(const std::string action) {_action = action;}
   std::string &actionToDo() {return _action;}
-  int wait() {
-    if(_client) return pthread_join(_listenThread, NULL);
-    return pthread_join(_serverThread, NULL);
-  }
+  void finalize();
   int listen(OnelabProtocol &msg) {
     if(_client) return _client->recvfrom(msg);
     return 0;
@@ -152,6 +149,9 @@ public:
     //if(_localGUI) _localGUI->get(ps, name);
     return OnelabServer::instance()->get(ps, name, client);
   }
+  void clear(const std::string &name="", const std::string &client="") {
+     if(_client) return _client->clear(name, client);
+  }
   bool fromFile(FILE *fp, const std::string &client="")
   {
     if(_client) return _client->fromFile(fp, client);
diff --git a/contrib/onelab2/OnelabLocalClient.cpp b/contrib/onelab2/OnelabLocalClient.cpp
deleted file mode 100644
index 13be1125fb4178edb2548e690986ab8242c7d84b..0000000000000000000000000000000000000000
--- a/contrib/onelab2/OnelabLocalClient.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "OnelabLocalClient.h"
-#include "OnelabServer.h"
-
-
-template <class T> bool OnelabLocalClient::set(const T &p)
-{
-  return OnelabServer::instance->set(p, _name);
-}
-template <class T> bool OnelabLocalClient::get(std::vector<T> &ps, const std::string &name)
-{
-  return OnelabServer::instance->get(ps, name, _name);
-}
diff --git a/contrib/onelab2/OnelabNetworkClient.cpp b/contrib/onelab2/OnelabNetworkClient.cpp
index 3b32ec31abc8610a8190b9b64c3dcfb8bf3d99c6..d3d0889556ef127285c5b933043e9d40e84fe528 100644
--- a/contrib/onelab2/OnelabNetworkClient.cpp
+++ b/contrib/onelab2/OnelabNetworkClient.cpp
@@ -137,11 +137,12 @@ int OnelabNetworkClient::recvfrom()
 }
 bool OnelabNetworkClient::connect()
 {
+  if(_connected) return true;
+
   UInt16 bufflen = 1024;
   int recvlen = 0;
   UInt8 buff[1024];
   OnelabProtocol msg(OnelabProtocol::OnelabStart);
-  if(_connected) return true;
 #ifdef HAVE_UDT
   if(_fds) {
     ip4_socket_connect(_fds, _ip);
@@ -156,16 +157,17 @@ bool OnelabNetworkClient::connect()
   recvlen = msg.encodeMsg(buff, bufflen);
   sendto(buff, recvlen);
 #ifdef HAVE_UDT
-  udt_socket_timeout(_fdu, 3);
+  if(_fdu)udt_socket_timeout(_fdu, 3);
+  else
 #endif
   ip4_socket_timeout(_fds, 3);
   recvlen = recvfrom(msg);
 
 #ifdef HAVE_UDT
-  udt_socket_timeout(_fdu, -1);
+  if(_fdu)udt_socket_timeout(_fdu, -1);
+  else
 #endif
   ip4_socket_timeout(_fds, 0);
-  if(recvlen <= 0) return false;
   if(recvlen > 0 && msg.msgType() == OnelabProtocol::OnelabStart) _connected = true;
   return _connected;
 }
@@ -189,12 +191,26 @@ void OnelabNetworkClient::disconnect(bool waitForServer)
       recvlen = recvfrom(msg);
       if(msg.msgType() == OnelabProtocol::OnelabStop) {
         _connected = false;
+        closeSocket();
         break;
       }
     }
   }
-  else
+  else {
     _connected = false;
+  }
+}
+
+void OnelabNetworkClient::closeSocket()
+{
+#ifdef HAVE_UDT
+  if(_fds)
+    ip4_socket_close(_fds);
+  else
+    udt_socket_close(_fdu);
+#else
+  ip4_socket_close(_fds);
+#endif
 }
 
 void OnelabNetworkClient::request(OnelabProtocol &msg)
diff --git a/contrib/onelab2/OnelabNetworkClient.h b/contrib/onelab2/OnelabNetworkClient.h
index 08474840e49bb2db9dec20d3ad78440ece840718..5e3da23ef00bcca63836be9ae25de9d3dc82d3d7 100644
--- a/contrib/onelab2/OnelabNetworkClient.h
+++ b/contrib/onelab2/OnelabNetworkClient.h
@@ -149,6 +149,7 @@ public:
 	int recvfrom(UInt8 *buff, UInt16 maxlen);
 	void sendto(UInt8 *buff, UInt16 len);
 	void disconnect(bool waitForServer=false);
+  void closeSocket();
 	void setRemoteIP(unsigned long ip){if(!_connected) _ip.address=ip;}
 	void setRemotePort(unsigned short port){if(!_connected) _ip.port=port;}