diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 532f894c9973030544660c85b12d8bfca2e11c89..df0f552502b085efb5b9f9076bea1a0103ec57da 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -610,26 +610,26 @@ void Msg::ExchangeOnelabParameter(const std::string &key,
   if(ps.size()){ // use value from server
     val[0] = ps[0].getValue();
   }
-  else{ // send value to server
-    onelab::number o(name, val[0]);
-    if(fopt.count("Range") && fopt["Range"].size() == 2){
-      o.setMin(fopt["Range"][0]); o.setMax(fopt["Range"][1]);
-    }
-    else if(fopt.count("Min") && fopt.count("Max")){
-      o.setMin(fopt["Min"][0]); o.setMax(fopt["Max"][0]);
-    }
-    else if(fopt.count("Min")){
-      o.setMin(fopt["Min"][0]); o.setMax(1.e200);
-    }
-    else if(fopt.count("Max")){
-      o.setMax(fopt["Max"][0]); o.setMin(-1.e200);
-    }
-    if(fopt.count("Step")) o.setStep(fopt["Step"][0]);
-    if(fopt.count("Choices")) o.setChoices(fopt["Choices"]);
-    if(copt.count("Help")) o.setHelp(copt["Help"][0]);
-    if(copt.count("ShortHelp")) o.setShortHelp(copt["ShortHelp"][0]);
-    _onelabClient->set(o);
+
+  onelab::number o(name);
+  o.setDefaultValue(val[0]);
+  if(fopt.count("Range") && fopt["Range"].size() == 2){
+    o.setMin(fopt["Range"][0]); o.setMax(fopt["Range"][1]);
+  }
+  else if(fopt.count("Min") && fopt.count("Max")){
+    o.setMin(fopt["Min"][0]); o.setMax(fopt["Max"][0]);
+  }
+  else if(fopt.count("Min")){
+    o.setMin(fopt["Min"][0]); o.setMax(1.e200);
+  }
+  else if(fopt.count("Max")){
+    o.setMax(fopt["Max"][0]); o.setMin(-1.e200);
   }
+  if(fopt.count("Step")) o.setStep(fopt["Step"][0]);
+  if(fopt.count("Choices")) o.setChoices(fopt["Choices"]);
+  if(copt.count("Help")) o.setHelp(copt["Help"][0]);
+  if(copt.count("ShortHelp")) o.setShortHelp(copt["ShortHelp"][0]);
+  _onelabClient->set(o);
 }
 
 void Msg::FinalizeOnelab()
diff --git a/Common/onelab.h b/Common/onelab.h
index 4befed87e09e02009d2d4388e14a48718c03996a..24884415f8dd73517c0653efc9d6353f2a7f0774 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -132,19 +132,28 @@ namespace onelab{
     double _value, _defaultValue, _min, _max, _step;
     std::vector<double> _choices;
   public:
-    number(const std::string &name="", double defaultValue=0.,
+    number(const std::string &name="", double defaultValue=maxNumber(),
            const std::string &shortHelp="", const std::string &help="") 
       : parameter(name, shortHelp, help), _value(defaultValue), 
         _defaultValue(defaultValue), _min(-maxNumber()), _max(maxNumber()), 
         _step(0.) {}
     void setValue(double value){ _value = value; }
-    void setDefaultValue(double value){ _defaultValue = value; }
+    void setDefaultValue(double value) { _defaultValue = value; }
     void setMin(double min){ _min = min; }
     void setMax(double max){ _max = max; }
     void setStep(double step){ _step = step; }
     void setChoices(std::vector<double> &choices){ _choices = choices; }
     std::string getType() const { return "number"; }
-    double getValue() const { return _value; }
+    double getValue() const { // never returns an unset value
+      if( _value != maxNumber())
+	return _value; 
+      else if( _defaultValue != maxNumber())
+	return _defaultValue; 
+      else {
+	std::cerr << "The number " << getName() << " is not set" << std::endl;
+	exit(1);
+      }
+    }
     double getDefaultValue() const { return _defaultValue; }
     double getMin() const { return _min; }
     double getMax() const { return _max; }
@@ -152,11 +161,11 @@ namespace onelab{
     const std::vector<double> &getChoices(){ return _choices; }
     void update(const number &p)
     {
-      if(p.getValue() != getValue()){
-        setValue(p.getValue());
+      if( (p._value != maxNumber()/*=is set*/) && (p._value != _value)){
+        setValue(p._value);
         setChanged(true);
       }
-      if(p.getDefaultValue() && p.getDefaultValue() != getDefaultValue())
+      if((p.getDefaultValue() != maxNumber()/*=is set*/) && (p.getDefaultValue() != getDefaultValue()))
         setDefaultValue(p.getDefaultValue());
       if(p.getMin() != -maxNumber())
         setMin(p.getMin());
@@ -164,6 +173,10 @@ namespace onelab{
         setMax(p.getMax());
       if(p.getStep() != getStep())
         setStep(p.getStep());
+      if(p.getHelp().size() && p.getHelp() != getHelp())
+	setHelp(p.getHelp());
+      if(p.getShortHelp().size() && p.getShortHelp() != getShortHelp())
+	setHelp(p.getShortHelp());
     }
     std::string toChar()
     {