diff --git a/contrib/onelab/Makefile b/contrib/onelab/Makefile
index 8d780dae8efb1c79b996e34695ad6fa6b1a1ab41..0079571bdf8eb1cde9c133ad69b233974f69d879 100644
--- a/contrib/onelab/Makefile
+++ b/contrib/onelab/Makefile
@@ -4,6 +4,7 @@ SOURCES=myOS StringUtils mathex OnelabClients OnelabMessage OnelabParser metamod
 COMMON_DIR=$(GMSH_DIR)/Common
 ONELAB_DIR=$(GMSH_DIR)/contrib/onelab
 MATHEX_DIR=$(GMSH_DIR)/contrib/MathEx
+CPPFLAGS+= $(shell python-config --includes) -fPIC
 
 OBJDIR=objects
 
@@ -52,4 +53,9 @@ $(OBJDIR)/%.o : %.cpp $(ONELAB_DIR)/*.h
 clean :
 	$(RM) $(TARGETS) $(OBJDIR)/*.o
 
+onelab_wrap.cpp : onelab.i
+	swig -python -c++ -o $@ $<
+
+_onelab.so : $(OBJECTS) $(OBJDIR)/onelab_wrap.o
+	$(CXX) -bundle -flat_namespace -undefined suppress $(OBJECTS) $(OBJDIR)/onelab_wrap.o -o _onelab.so
 .PRECIOUS: $(OBJDIR)/%.o
diff --git a/contrib/onelab/OnelabClients.cpp b/contrib/onelab/OnelabClients.cpp
index 8284666cf6bd0dd7d357c5d2538b53d35bd37788..9255ddb3aebe00ef80d6aec8ad34081a1e567734 100644
--- a/contrib/onelab/OnelabClients.cpp
+++ b/contrib/onelab/OnelabClients.cpp
@@ -468,7 +468,7 @@ bool localSolverClient::buildRmCommand(std::string &cmd){
       split = SplitOLFileName(choices[i]);
       cmd.append(split[1] + " ");
     }
-    return true;
+    if(choices.size()) return true;
   }
   return false;
 }
@@ -1206,7 +1206,8 @@ std::string ftoa(const double x){
 int mySystem(std::string commandLine){
   //Don't use OLMsg::Info here otherwise the message appears twice
   //in the Gmsh message window.
-  std::cout << "Onelab: Calling <" << commandLine << ">" << std::endl;
+  if(OLMsg::GetVerbosity())
+    std::cout << "Onelab: Calling <" << commandLine << ">" << std::endl;
   return SystemCall(commandLine.c_str(), true);
 }
 
@@ -1269,6 +1270,7 @@ std::string quote(const std::string &in){
 }
 std::string unquote(const std::string &in)
 {
+  if(in.empty()) return "";
   size_t pos0=in.find_first_not_of(" ");
   size_t pos=in.find_last_not_of(" ");
   if( (pos0 != std::string::npos) && (!in.compare(pos0,1,"\"")))
diff --git a/contrib/onelab/OnelabParser.cpp b/contrib/onelab/OnelabParser.cpp
index ffe4291c0f83875f29d58a3ee0749b5fa96a8ed8..d7fd7ff5af2356d69fe4cf0a002e08607948730b 100644
--- a/contrib/onelab/OnelabParser.cpp
+++ b/contrib/onelab/OnelabParser.cpp
@@ -107,7 +107,7 @@ void MetaModel::saveCommandLines(){
     }
   }
   else
-    OLMsg::Error("The file <%s> cannot be opened",fileName.c_str());
+    OLMsg::Warning("The file <%s> cannot be opened",fileName.c_str());
   infile.close();
 
   //save client command lines
@@ -623,8 +623,10 @@ void localSolverClient::parse_sentence(std::string line) {
 	  else
 	    OLMsg::Error("Wrong number of arguments for range <%s>",
 			 name.c_str());
+	  set(numbers[0]);
 	}
-	set(numbers[0]);
+	else
+	  OLMsg::Error("The parameter <%s> does not exist",name.c_str());
       }
     }
     else if(!action.compare("withinRange")){ 
@@ -640,6 +642,8 @@ void localSolverClient::parse_sentence(std::string line) {
 	  numbers[0].setValue(numbers[0].getMax());
 	set(numbers[0]);
       }
+      else
+	OLMsg::Error("The parameter <%s> does not exist",name.c_str());
     }
     else if(!action.compare("setValue")){ 
       // a set request together with a setReadOnly(1) forces 
@@ -662,9 +666,8 @@ void localSolverClient::parse_sentence(std::string line) {
 	  strings[0].setReadOnly(1);
 	  set(strings[0]);
 	}
-	else{
+	else
 	  OLMsg::Error("The parameter <%s> does not exist",name.c_str());
-	}
       }
     }
     else if(!action.compare("resetChoices")){
@@ -1586,7 +1589,8 @@ void MetaModel::client_sentence(const std::string &name,
 	  bool changed = onelab::server::instance()->getChanged(c->getName());
 	  bool started = isStarted(changed);
 
-	  std::cout << c->getName() << " active=" << c->getActive() << " changed=" << changed << " started=" << started << " errors=" << OLMsg::GetErrorCount() << std::endl;
+	  if(OLMsg::GetVerbosity())
+	    std::cout << c->getName() << " active=" << c->getActive() << " changed=" << changed << " started=" << started << " errors=" << OLMsg::GetErrorCount() << std::endl;
 	  if(started) c->compute();
 	}
       }
@@ -1638,7 +1642,7 @@ void MetaModel::client_sentence(const std::string &name,
     }
   }
   else if(!action.compare("merge")){
-    if(isTodo(COMPUTE)  && !OLMsg::GetErrorCount()){
+    if(isTodo(COMPUTE)  && !OLMsg::GetErrorCount() && (OLMsg::hasGmsh)){
       std::vector<std::string> choices;
       for(unsigned int i = 0; i < arguments.size(); i++){
 	choices.push_back(resolveGetVal(arguments[i]));
diff --git a/contrib/onelab/loader.cpp b/contrib/onelab/loader.cpp
index c8cfacc16b0de6696c0d2446fc70e55466d62167..9ac1123599bdcdd86c51965514e75020606cd616 100644
--- a/contrib/onelab/loader.cpp
+++ b/contrib/onelab/loader.cpp
@@ -1,5 +1,4 @@
 #include "StringUtils.h"
-//#include "onelabUtils.h"
 #include "OnelabClients.h"
 #include "metamodel.h"
 #include <algorithm>
@@ -141,24 +140,6 @@ std::string showClientStatus(){
   return sstream.str();
 }
 
-bool setParameter(const std::string &name, const std::string &value){
-  std::vector<onelab::number> numbers;
-  std::vector<onelab::string> strings;
-  onelab::server::instance()->get(numbers,name);
-  if (numbers.size()) {
-    numbers[0].setValue(atof(value.c_str()));
-    return onelab::server::instance()->set(numbers[0]);
-  }
-  else{
-    onelab::server::instance()->get(strings,name);
-    if (strings.size()) {
-      strings[0].setValue(value);
-      return onelab::server::instance()->set(strings[0]);
-    }
-    else
-      OLMsg::Error("The parameter <%s> does not exist", name.c_str());
-  }
-}
 
 bool menu() {
   int choice, counter1=0, counter2=0;
diff --git a/contrib/onelab/metamodel.cpp b/contrib/onelab/metamodel.cpp
index 7869dc7569cbab433b84a1252c585edb37486e1c..71fb77e8f395e2a1aeee03cb04d1ca9a3a6422f9 100644
--- a/contrib/onelab/metamodel.cpp
+++ b/contrib/onelab/metamodel.cpp
@@ -1,6 +1,30 @@
 #include "OnelabClients.h"
 #include "metamodel.h"
 
+/* PYTHON functions */
+
+void modelName(const std::string &name, const std::string &wdir=""){
+  OLMsg::InitializeOnelab("onelab");
+  OLMsg::SetOnelabString("Arguments/FileName",name);
+  OLMsg::SetOnelabString("Arguments/WorkingDir",wdir);
+  OLMsg::SetVerbosity(0);
+}
+
+void setNumber(const std::string &name, const double value){
+  OLMsg::SetOnelabNumber(name, value);
+}
+void setString(const std::string &name, const std::string &value){
+  OLMsg::SetOnelabString(name, value);
+}
+double getNumber(const std::string &name){
+  return OLMsg::GetOnelabNumber(name);
+}
+std::string getString(const std::string &name){
+  return OLMsg::GetOnelabString(name);
+}
+
+
+/* Interface Gmsh - Metamodels */
 
 void initializeMetamodel(const std::string &loaderName, onelab::client *olclient, void (*gui_wait_fct)(double time))
 {
diff --git a/contrib/onelab/metamodel.h b/contrib/onelab/metamodel.h
index b98354e5f14258093021d289f70ef24caaa97bd4..701f3368f0f98427d590dc8ca14f2b8b92f2d9a2 100644
--- a/contrib/onelab/metamodel.h
+++ b/contrib/onelab/metamodel.h
@@ -9,3 +9,11 @@ namespace onelab{ class client; }
 
 int metamodel(const std::string &todo);
 void initializeMetamodel(const std::string &, onelab::client *,  void (*wait)(double time));
+
+/* PYTHON functions */
+
+void modelName(const std::string &name, const std::string &wdir);
+void setNumber(const std::string &name, const double value);
+void setString(const std::string &name, const std::string &value);
+double getNumber(const std::string &name);
+std::string getString(const std::string &name);