diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 774209bfcd3b3ce506b8cd5e6566498f3d22d808..7a5b730168f33875c87095e9366f53c7bcf4cbde 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -581,3 +581,18 @@ int Msg::GetThreadNum(){ return 0; }
 
 #endif
 
+#include "Bindings.h"
+void Msg::registerBindings (binding *b) {
+  classBinding *cb = b->addClass<Msg>("Msg");
+  cb->setDescription("a class to manage messages, intialisations of libraries (like MPI) and mpi rank and size.");
+  methodBinding *mb;
+  mb = cb->setConstructor<Msg>();
+  mb->setDescription("Msg is full static class, instances do not contain anything but they are needed to call the static functions from lua");
+  mb = cb->addMethod("getCommRank", &Msg::GetCommRank);
+  mb->setDescription("return the id of this mpi process");
+  mb = cb->addMethod("getCommSize", &Msg::GetCommSize);
+  mb->setDescription("return the number of mpi processes");
+  mb = cb->addMethod("barrier", &Msg::Barrier);
+  mb->setDescription("an MPI barrier : all processes wait untill they all reach this points");
+};
+
diff --git a/Common/GmshMessage.h b/Common/GmshMessage.h
index f92f91ee7b5ab32453ebeccab7019c94ccb9306a..e1a95138163240c6a5b6adfe86eddeff5dd7b676 100644
--- a/Common/GmshMessage.h
+++ b/Common/GmshMessage.h
@@ -19,6 +19,7 @@ class GmshMessage{
   virtual ~GmshMessage(){}
   virtual void operator()(std::string level, std::string message){}
 };
+class binding;
 
 // a class to manage messages
 class Msg {
@@ -79,6 +80,7 @@ class Msg {
   static void InitClient(std::string sockname);
   static GmshClient *GetClient(){ return _client; }
   static void FinalizeClient();
+  static void registerBindings (binding *b);
 };
 
 #endif
diff --git a/Common/LuaBindings.cpp b/Common/LuaBindings.cpp
index 748497814a00fef6980a5a7f7421c68937b5c5b0..c2db76fa759e4024f3f65cf22d314406fe0fe221 100644
--- a/Common/LuaBindings.cpp
+++ b/Common/LuaBindings.cpp
@@ -29,6 +29,7 @@
 #include "Bindings.h"
 #include "dgResidual.h"
 #include "drawContext.h"
+#include "GmshMessage.h"
 
 extern "C" {
   #include "lua.h"
@@ -366,6 +367,7 @@ binding::binding(){
   function::registerDefaultFunctions();
   functionLua::registerBindings(this);
   gmshOptions::registerBindings(this);
+  Msg::registerBindings(this);
 }
 binding *binding::_instance=NULL;
 #endif
diff --git a/Common/LuaBindings.h b/Common/LuaBindings.h
index 65d5ca74c1424a6551e099f15dc672fc5f372c7e..fca8ec1f5de55aa58aa021e20e1cdd1db6f8f4a3 100644
--- a/Common/LuaBindings.h
+++ b/Common/LuaBindings.h
@@ -256,10 +256,11 @@ class luaStack<const type &>{
   }
 };
 
+//static
 template <typename cb>
 class argTypeNames;
-template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4, typename t5>
-class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4,t5)>{
+template <typename tr, typename t0, typename t1, typename t2, typename t3, typename t4, typename t5>
+class argTypeNames<tr (*)(t0,t1,t2,t3,t4,t5)>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
@@ -272,8 +273,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4,t5)>{
     names.push_back(luaStack<t5>::getName());
   }
 };
-template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4>
-class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4)>{
+template <typename tr, typename t0, typename t1, typename t2, typename t3, typename t4>
+class argTypeNames<tr (*)(t0,t1,t2,t3,t4)>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
@@ -285,8 +286,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4)>{
     names.push_back(luaStack<t4>::getName());
   }
 };
-template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3>
-class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>{
+template <typename tr, typename t0, typename t1, typename t2, typename t3>
+class argTypeNames<tr (*)(t0,t1,t2,t3)>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
@@ -297,8 +298,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>{
     names.push_back(luaStack<t3>::getName());
   }
 };
-template <typename tr, typename tObj, typename t0, typename t1, typename t2>
-class argTypeNames<tr (tObj::*)(t0,t1,t2)>{
+template <typename tr, typename t0, typename t1, typename t2>
+class argTypeNames<tr (*)(t0,t1,t2)>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
@@ -308,8 +309,8 @@ class argTypeNames<tr (tObj::*)(t0,t1,t2)>{
     names.push_back(luaStack<t2>::getName());
   }
 };
-template <typename tr, typename tObj, typename t0, typename t1>
-class argTypeNames<tr (tObj::*)(t0,t1)>{
+template <typename tr, typename t0, typename t1>
+class argTypeNames<tr (*)(t0,t1)>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
@@ -318,8 +319,8 @@ class argTypeNames<tr (tObj::*)(t0,t1)>{
     names.push_back(luaStack<t1>::getName());
   }
 };
-template <typename tr, typename tObj, typename t0>
-class argTypeNames<tr (tObj::*)(t0)>{
+template <typename tr, typename t0>
+class argTypeNames<tr (*)(t0)>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
@@ -327,49 +328,104 @@ class argTypeNames<tr (tObj::*)(t0)>{
     names.push_back(luaStack<t0>::getName());
   }
 };
-template <typename tr, typename tObj>
-class argTypeNames<tr (tObj::*)()>{
+template <typename tr>
+class argTypeNames<tr (*)()>{
   public:
   static void get(std::vector<std::string> &names){
     names.clear();
     names.push_back(luaStack<tr>::getName());
   }
 };
+
+template <typename cb>
+class argTypeNames;
+template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4, typename t5>
+class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4,t5)>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)(t0,t1,t2,t3,t4,t5)>::get(names);
+  }
+};
+template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3, typename t4>
+class argTypeNames<tr (tObj::*)(t0,t1,t2,t3,t4)>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)(t0,t1,t2,t3,t4)>::get(names);
+  }
+};
+template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3>
+class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)(t0,t1,t2,t3)>::get(names);
+  }
+};
+template <typename tr, typename tObj, typename t0, typename t1, typename t2>
+class argTypeNames<tr (tObj::*)(t0,t1,t2)>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)(t0,t1,t2)>::get(names);
+  }
+};
+template <typename tr, typename tObj, typename t0, typename t1>
+class argTypeNames<tr (tObj::*)(t0,t1)>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)(t0,t1)>::get(names);
+  }
+};
+template <typename tr, typename tObj, typename t0>
+class argTypeNames<tr (tObj::*)(t0)>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)(t0)>::get(names);
+  }
+};
+template <typename tr, typename tObj>
+class argTypeNames<tr (tObj::*)()>{
+  public:
+  static void get(std::vector<std::string> &names){
+    argTypeNames<tr(*)()>::get(names);
+  }
+};
+
+
+// const 
 template <typename cb>
 class argTypeNames;
 template <typename tr, typename tObj, typename t0, typename t1, typename t2, typename t3>
 class argTypeNames<tr (tObj::*)(t0,t1,t2,t3)const>{
   public:
   static void get(std::vector<std::string> &names){
-    argTypeNames<tr (tObj::*)(t0,t1,t2,t3)>::get(names);
+    argTypeNames<tr (*)(t0,t1,t2,t3)>::get(names);
   }
 };
 template <typename tr, typename tObj, typename t0, typename t1, typename t2>
 class argTypeNames<tr (tObj::*)(t0,t1,t2)const>{
   public:
   static void get(std::vector<std::string> &names){
-    argTypeNames<tr (tObj::*)(t0,t1,t2)>::get(names);
+    argTypeNames<tr (*)(t0,t1,t2)>::get(names);
   }
 };
 template <typename tr, typename tObj, typename t0, typename t1>
 class argTypeNames<tr (tObj::*)(t0,t1)const>{
   public:
   static void get(std::vector<std::string> &names){
-    argTypeNames<tr (tObj::*)(t0,t1)>::get(names);
+    argTypeNames<tr (*)(t0,t1)>::get(names);
   }
 };
 template <typename tr, typename tObj, typename t0>
 class argTypeNames<tr (tObj::*)(t0)const>{
   public:
   static void get(std::vector<std::string> &names){
-    argTypeNames<tr (tObj::*)(t0)>::get(names);
+    argTypeNames<tr (*)(t0)>::get(names);
   }
 };
 template <typename tr, typename tObj>
 class argTypeNames<tr (tObj::*)()const>{
   public:
   static void get(std::vector<std::string> &names){
-    argTypeNames<tr (tObj::*)()>::get(names);
+    argTypeNames<tr (*)()>::get(names);
   }
 };
 
@@ -377,35 +433,78 @@ class argTypeNames<tr (tObj::*)()const>{
 //static, return 
 template < typename tRet, typename t0, typename t1, typename t2, typename t3>
 static int luaCall(lua_State *L,tRet (*_f)(t0,t1,t2,t3)) {
-  lua_remove(L,1);
+  if (lua_gettop(L)==5)
+    lua_remove(L,1);
   luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3),luaStack<t3>::get(L,4)));
   return 1;
 };
 template < typename tRet, typename t0, typename t1, typename t2>
 static int luaCall(lua_State *L,tRet (*_f)(t0,t1,t2)) {
-  lua_remove(L,1);
+  if (lua_gettop(L)==4)
+    lua_remove(L,1);
   luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3)));
   return 1;
 };
 template < typename tRet, typename t0, typename t1>
 static int luaCall(lua_State *L,tRet (*_f)(t0,t1)) {
-  lua_remove(L,1);
+  if (lua_gettop(L)==3)
+    lua_remove(L,1);
   luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2)));
   return 1;
 };
 template < typename tRet, typename t0>
 static int luaCall(lua_State *L,tRet (*_f)(t0)) {
-  lua_remove(L,1);
+  if (lua_gettop(L)==2)
+    lua_remove(L,1);
   luaStack<tRet>::push(L,(*(_f))(luaStack<t0>::get(L,1)));
   return 1;
 };
 template < typename tRet>
 static int luaCall(lua_State *L,tRet (*_f)()) {
-  lua_remove(L,1);
+  printf("top=%i\n",lua_gettop(L));
+  if (lua_gettop(L)==1)
+    lua_remove(L,1);
   luaStack<tRet>::push(L,(*(_f))());
   return 1;
 };
 
+//static, no return 
+template < typename t0, typename t1, typename t2, typename t3>
+static int luaCall(lua_State *L, void (*_f)(t0,t1,t2,t3)) {
+  if (lua_gettop(L)==5)
+    lua_remove(L,1);
+  (*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3),luaStack<t3>::get(L,4));
+  return 1;
+};
+template <typename t0, typename t1, typename t2>
+static int luaCall(lua_State *L, void (*_f)(t0,t1,t2)) {
+  if (lua_gettop(L)==4)
+    lua_remove(L,1);
+ (*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2),luaStack<t2>::get(L,3));
+  return 1;
+};
+template <typename t0, typename t1>
+static int luaCall(lua_State *L,void (*_f)(t0,t1)) {
+  if (lua_gettop(L)==3)
+    lua_remove(L,1);
+  (*(_f))(luaStack<t0>::get(L,1),luaStack<t1>::get(L,2));
+  return 1;
+};
+template <typename t0>
+static int luaCall(lua_State *L, void (*_f)(t0)) {
+  if (lua_gettop(L)==2)
+    lua_remove(L,1);
+  (*(_f))(luaStack<t0>::get(L,1));
+  return 1;
+};
+template < >
+static int luaCall(lua_State *L,void (*_f)()) {
+  if (lua_gettop(L)==1)
+    lua_remove(L,1);
+  (*(_f))();
+  return 1;
+};
+
 //const, return
 template <typename tObj, typename tRet, typename t0, typename t1, typename t2, typename t3>
 static int luaCall(lua_State *L,tRet (tObj::*_f)(t0,t1,t2,t3) const) {
diff --git a/Solver/TESTCASES/Stommel.lua b/Solver/TESTCASES/Stommel.lua
index 2d6a259b6002398b8ffad20f93d6fab96a53c817..e9537dd96803b987da67605521431aa35a2213e9 100644
--- a/Solver/TESTCASES/Stommel.lua
+++ b/Solver/TESTCASES/Stommel.lua
@@ -17,12 +17,15 @@ void coriolis (fullMatrix<double> &sol, fullMatrix<double> &xyz) {
 }
 ]]
 
-cfile = io.popen("g++ -O3 -pipe -m32 -shared -o tmp.dylib -I ../../Numeric -I../../Common -I../../build/Common -x c++ - ","w");
-cfile:write("#include\"fullMatrix.h\"\nextern \"C\" {")
-cfile:write(CFunctions)
-cfile:write("}")
-cfile:close()
+if (Msg.getCommRank() == 0 ) then
+  cfile = io.popen("g++ -O3 -pipe -m32 -shared -o tmp.dylib -I ../../Numeric -I../../Common -I../../build/Common -x c++ - ","w");
+  cfile:write("#include\"fullMatrix.h\"\nextern \"C\" {")
+  cfile:write(CFunctions)
+  cfile:write("}")
+  cfile:close()
+end
 
+Msg.barrier()
 
 claw = dgConservationLawShallowWater2d()
 claw:addBoundaryCondition('Wall',claw:newBoundaryWall())
@@ -38,7 +41,7 @@ solution = dgDofContainer(groups, claw:getNbFields())
 solution:exportMsh('output/init')
 rk=dgRungeKutta()
 
-for i=1,600 do
+for i=1,60000 do
   norm = rk:iterate33(claw,150*(3/(2.*order+1)/2),solution)
   if ( i%100 ==0 ) then
     print ('iter ', i, norm)