diff --git a/contrib/onelab2/python/onelab2.py b/contrib/onelab2/python/onelab2.py
index 0ea417212ef4ea8f9d994b8832a4e9e7f5f539cb..de33fc26d40924663457cbc32520122c6193bcb8 100755
--- a/contrib/onelab2/python/onelab2.py
+++ b/contrib/onelab2/python/onelab2.py
@@ -58,7 +58,7 @@ def path(dirname, inp):
 class _parameter() :
   _membersbase = [
     ('name', 'string'), ('label', 'string', ''), ('help', 'string', ''),
-    ('neverChanged', 'bool', 0), ('visible', 'bool', 1), ('readOnly', 'bool', 0), 
+    ('readOnly', 'bool', 0), ('neverChanged', 'bool', 0), ('visible', 'bool', 1), 
     ('attributes', ('dict', 'string', 'string'), {}),
     ('clients', ('dict', 'string', 'bool'), {})
   ]
@@ -250,7 +250,12 @@ class client :
         return param
       else:
         return None
-    
+
+  def _defineParameter(self, p) :
+    if not self.socket :
+      return p.value
+    self._send(self._ONELAB_UPDATE, p.tobytes())
+    return p.value
 
   def _getParameter(self, param, warn_if_not_found=True) :
     def extract_attr(b):
@@ -270,6 +275,18 @@ class client :
       elif ptype == 0x0A and warn_if_not_found:
         print('Unknown parameter %s' %(param.name))
 
+  def defineNumber(self, name, **param):
+    if 'labels' in param :
+      param["choices"] = param["labels"].keys()
+    p = _parameter('number', name=name, **param)
+    value = self._defineParameter(p)
+    return value
+
+  def defineString(self, name, **param):
+    p = _parameter('string', name=name, **param)
+    value = self._defineParameter(p)
+    return value
+
   def getString(self, name, warn_if_not_found=True):
     param = _parameter('string', name=name)
     self._getParameter(param, warn_if_not_found)
@@ -313,6 +330,11 @@ class client :
   def sendDebug(self, msg) :
     self._sendMessage(msg+'\0', 99)
 
+  def mergeFile(self, filename) :
+    if not self.socket or not filename :
+      return
+    self._send(self._ONELAB_UPDATE, struct.pack("!HH", 0x0D, len(filename))+filename)
+
   def waitOnSubClient(self, name):
     if not self.socket :
       return
@@ -362,7 +384,10 @@ class client :
         self.addr = sys.argv[i + 2]
         self._createSocket()
         self._send(self._ONELAB_START, struct.pack('!HH', 0x04, len(self.name))+self.name)
-        self._receive() # wait for the server to reply
+        (t, msg) = self._receive() # wait for the server to reply
+        if t != self._ONELAB_START:
+          print("unable to connect the server")
+          exit(1)
         self._clearbuffer()
     self.action = "compute" # default (subclients have no client.Action defined)
     self.action = self.getString(self.name + '/Action', False)
@@ -383,6 +408,23 @@ class client :
       self._receive()
       self.socket.close()
       self.socket = None
+
+  def getPath(self, inp='') :
+    return path(self.wdir,inp)
+
+  def fileExists(self, p) :
+    return os.path.exists(p)
+
+  def checkFile(self, p) :
+    if not self.fileExists(p):
+      self.sendError('path error: %s' %(p))
+      exit(0) 
+    return True
+
+  def checkPath(self, inp='') :
+    p = path(self.wdir,inp)
+    self.checkFile(p)
+    return p
     
   def __del__(self):
     self.finalize()