diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py
index 23ff61fa6b1c579e5e3e204abbeffde36155982c..61de45fd85df64cf589bc876f543e021875ffe42 100755
--- a/contrib/onelab/python/onelab.py
+++ b/contrib/onelab/python/onelab.py
@@ -36,7 +36,12 @@ def file_exist(filename):
       return True
   except IOError:
     return False
-    
+
+def path(ref,inp):
+  if inp[0] == '/' or inp[0] == '\\' or (len(inp) > 2 and inp[1] == '\:'):
+     return inp # do nothing, inp is an absolute path
+  else: # append inp to the path of the reference file
+     return os.path.dirname(ref) + os.sep + inp
 
 class _parameter() :
   _membersbase = [
@@ -145,17 +150,15 @@ class client :
 
   def _define_parameter(self, param) :
     if not self.socket :
-      return
+      return param.value
     self._send(self._GMSH_PARAMETER_QUERY, param.tochar())
     (t, msg) = self._receive() 
     if t == self._GMSH_PARAMETER :
       self._send(self._GMSH_PARAMETER_UPDATE, param.tochar()) #enrich a previous decl.
-      value = param.fromchar(msg).value # use value from server
+      return param.fromchar(msg).value # use value from server
     elif t == self._GMSH_PARAMETER_NOT_FOUND :
       self._send(self._GMSH_PARAMETER, param.tochar()) #declaration
-      value = param.value
-    return value
-    #print param.tochar()
+      return param.value
     
   def defineNumber(self, name, **param):
     if 'labels' in param :
@@ -185,10 +188,7 @@ class client :
       p.fromchar(msg).modify(**param)
     elif t == self._GMSH_PARAMETER_NOT_FOUND :
       p.modify(**param)
-    p.readOnly = 1
-    p.attributes={'Highlight':'AliceBlue'}   
     self._send(self._GMSH_PARAMETER, p.tochar())
-    #return p.value What for?
 
   def setString(self, name, **param):
     if not self.socket :
@@ -203,7 +203,19 @@ class client :
     p.readOnly = 1
     p.attributes={'Highlight':'AliceBlue'}   
     self._send(self._GMSH_PARAMETER, p.tochar())
-  
+
+  def addNumberChoice(self, name, value):
+    if not self.socket :
+      return
+    p = _parameter('number', name=name)
+    self._send(self._GMSH_PARAMETER_QUERY, p.tochar())
+    (t, msg) = self._receive() 
+    if t == self._GMSH_PARAMETER :
+      p.fromchar(msg).choices.append(value)
+    elif t == self._GMSH_PARAMETER_NOT_FOUND :
+      print 'Unknown parameter %s' %(param.name)
+    self._send(self._GMSH_PARAMETER, p.tochar())
+
   def _get_parameter(self, param, warn_if_not_found=True) :
     if not self.socket :
       return
@@ -224,6 +236,17 @@ class client :
     self._get_parameter(param, warn_if_not_found)
     return param.value
 
+  def show(self, name) :
+    if not self.socket :
+      return
+    param = _parameter('number', name=name)
+    self._send(self._GMSH_PARAMETER_QUERY, param.tochar())
+    (t, msg) = self._receive() 
+    if t == self._GMSH_PARAMETER :
+      print msg
+    elif t == self._GMSH_PARAMETER_NOT_FOUND :
+      print 'Unknown parameter %s' %(name)
+
   def openGeometry(self, filename) :
     if not self.socket or not filename :
       return
@@ -232,8 +255,8 @@ class client :
       return
     else :
       self.setString('Gmsh/MergedGeo', value=filename)
-    if filename[0] != '/' :
-      filename = os.getcwd() + "/" + filename
+#    if filename[0] != '/' :
+#      filename = os.getcwd() + "/" + filename
     self._send(self._GMSH_MERGE_FILE, filename)
 
   def mesh(self, filename) :
@@ -251,17 +274,17 @@ class client :
   def mergeFile(self, filename) :
     if not self.socket :
       return
-    if filename and filename[0] != '/' :
-      filename = os.getcwd() + "/" + filename;
-    self._send(self._GMSH_PARSE_STRING, 'Merge "' + filename + '";')
+    #self._send(self._GMSH_PARSE_STRING, 'Merge "' + filename + '";')
+    self._send(self._GMSH_MERGE_FILE,filename)
 
   def preProcess(self, filename) :
     if not self.socket :
       return
-    if filename and filename[0] != '/' :
-      filename = os.getcwd() + "/" + filename;
     self._send(self._GMSH_OLPARSE, filename)
-
+    (t, msg) = self._receive() 
+    if t == self._GMSH_OLPARSE :
+      print msg
+        
   def _createSocket(self) :
     addr = self.addr
     if '/' in addr or '\\' in addr or ':' not in addr :
@@ -271,8 +294,6 @@ class client :
       self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       s = addr.split(':')
       self.socket.connect((s[0], int(s[1])))
-    #self.socket.setblocking(1)
-    #self.socket.settimeout(5.0)
 
   def _wait_on_subclients(self):
     if not self.socket :
@@ -310,7 +331,6 @@ class client :
   
   def __del__(self) :
     self._wait_on_subclients()
-    #print "Calling destructor of %s with %d subclients" %(self.name, self.NumSubClients)
     if self.socket :
       self._send(self._GMSH_STOP, 'Goodbye!')
       self.socket.close()
diff --git a/contrib/onelab/python/sub.py b/contrib/onelab/python/sub.py
index f6f450e86ddf71d93663c01b1a0a33606c658607..e4c6cdc3f0d5334a49120051d3171ede84519f77 100755
--- a/contrib/onelab/python/sub.py
+++ b/contrib/onelab/python/sub.py
@@ -6,6 +6,7 @@ import onelab
 OL = onelab.client()
 
 A = OL.getNumber('A')
-B = OL.setNumber('Group/B', 20)
+print 'A= %f' %(A)
+OL.setNumber('Group/B', value=20)
+
 
-print 'A= %f B = %f' %(A, B)
diff --git a/contrib/onelab/python/test.py b/contrib/onelab/python/test.py
index 67853dab908d938788076883ede790ff7622ee1b..e551aceae0339ee37ef59ec39f27d00969333be5 100755
--- a/contrib/onelab/python/test.py
+++ b/contrib/onelab/python/test.py
@@ -7,8 +7,10 @@ modelName = 'coin'
 OL = onelab.client()
 print('\nStarting METAMODEL - Action = %s' %(OL.getString('python/Action')))
 
-A = OL.defineNumber('A', value=10)
+print __file__
 
+A = OL.defineNumber('A', value=10)
+B = OL.defineNumber('Group/B', value=0, min = -10, max = 10, step = 1)
 C = OL.defineNumber('Group/C', value=2, choices = [0, 1, 2, 3], attributes={'Highlight':'Pink'})
 D = OL.defineNumber('Group/D', value=3, labels = {0:'zero', 1:'un', 2:'deux', 3:'trois'}, attributes={'Highlight':'Blue'})
 
@@ -23,8 +25,14 @@ if OL.action == 'compute' :
 
 OL.run('subclient', './sub.py','')
 
+OL.show('A')
+OL.addNumberChoice('A',1.234)
+OL.addNumberChoice('A',2.345)
+OL.addNumberChoice('A',3.456)
+OL.show('A')
+OL.setNumber('A', choices=[])
+OL.show('A')
 
-#B = oc.defineNumber('Group/B', 0, min = -10, max = 10, step = 1)
 #utf-8 are allowed everywhere
 #(should be prefixed by 'u' in python 2, not required in python 3)
 #Omega = OL.getString(u'Ω', u'∫(∂φ/∂α)³dx', help=u'ask someone@universe.org',