diff --git a/Common/onelab.h b/Common/onelab.h
index dc56f025cc9750e18f1fd2722e0411b97598c354..bd85fb1e12cb091c3a817c786465db83ada3e071 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -21,6 +21,8 @@
 // WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 // ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 // OF THIS SOFTWARE.
+// 
+// Please report all bugs and problems to <gmsh@geuz.org>.
 
 #ifndef _ONELAB_H_
 #define _ONELAB_H_
diff --git a/Fltk/inputRange.h b/Fltk/inputRange.h
index 3296b3ccd912e47227515f60a04fd22aa8179a00..383686ee8176a3d5373a3651ef75b47006dc84a3 100644
--- a/Fltk/inputRange.h
+++ b/Fltk/inputRange.h
@@ -121,6 +121,29 @@ class inputRange : public Fl_Group {
       _range->hide();
     }
   }
+  void _set_loop_value(const std::string &val)
+  {
+    if(val == "1"){
+      _loop_butt->label("1");
+      _loop_butt->selection_color(FL_GREEN);
+      _loop_butt->value(1);
+    }
+    else if(val == "2"){
+      _loop_butt->label("2");
+      _loop_butt->selection_color(FL_BLUE);
+      _loop_butt->value(1);
+    }
+    else if(val == "3"){
+      _loop_butt->label("3");
+      _loop_butt->selection_color(FL_RED);
+      _loop_butt->value(1);
+    }
+    else{
+      _loop_butt->label("@-1gmsh_rotate");
+      _loop_butt->selection_color(_loop_butt->color());
+      _loop_butt->value(0);
+    }
+  }
   static void _input_cb(Fl_Widget *w, void *data)
   {
     ((inputRange*)data)->do_callback();
@@ -136,6 +159,15 @@ class inputRange : public Fl_Group {
   }
   static void _loop_butt_cb(Fl_Widget *w, void *data)
   {
+    Fl_Toggle_Button *b = (Fl_Toggle_Button*)w;
+    if(std::string(b->label()) == "1")
+      ((inputRange*)data)->_set_loop_value("2");
+    else if(std::string(b->label()) == "2")
+      ((inputRange*)data)->_set_loop_value("3");
+    else if(std::string(b->label()) == "3")
+      ((inputRange*)data)->_set_loop_value("0");
+    else
+      ((inputRange*)data)->_set_loop_value("1");
     ((inputRange*)data)->do_callback(); 
   }
  public:
@@ -162,7 +194,6 @@ class inputRange : public Fl_Group {
 
     _loop_butt = new Fl_Toggle_Button(x + input_w + dot_w, y, loop_w, h);
     _loop_butt->label("@-1gmsh_rotate");
-    _loop_butt->selection_color(FL_GREEN);
     _loop_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
     _loop_butt->callback(_loop_butt_cb, this);
     _loop_butt->tooltip("Loop over range when computing");
@@ -180,6 +211,13 @@ class inputRange : public Fl_Group {
   double maximum() { return _max; }
   void step(double val) { _step = val; _values2string(); }
   double step() { return _step; }
-  void loop(int val) { _loop_butt->value(val); }
-  int loop() { return _loop_butt->value(); }
+  void loop(const std::string &val) 
+  {
+    _set_loop_value(val);
+  }
+  std::string loop()
+  { 
+    if(!_loop_butt->value()) return "0";
+    else return _loop_butt->label();
+  }
 };
diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp
index d5d49ac1028ce1028165e9133eb9a0a16144e6d6..0a55449fe16cb773ef7f0f0b127552c2f354650b 100644
--- a/Fltk/onelabWindow.cpp
+++ b/Fltk/onelabWindow.cpp
@@ -320,13 +320,13 @@ static std::string getModelName(onelab::client *c)
   }
 }
 
-static void initCompute()
+static void initializeLoop(std::string level)
 {
   bool changed = false;
   std::vector<onelab::number> numbers;
   onelab::server::instance()->get(numbers);
   for(unsigned int i = 0; i < numbers.size(); i++){
-    if(numbers[i].getAttribute("loop") == "true"){
+    if(numbers[i].getAttribute("loop") == level){
       if(numbers[i].getChoices().size() > 1){
         numbers[i].setValue(numbers[i].getChoices()[0]);
         onelab::server::instance()->set(numbers[i]);
@@ -344,13 +344,14 @@ static void initCompute()
     FlGui::instance()->onelab->rebuildTree();
 }
 
-static bool shouldRecompute()
+static bool incrementLoop(std::string level)
 {
-  bool recompute = false;
+  bool recompute = false, loop = false;
   std::vector<onelab::number> numbers;
   onelab::server::instance()->get(numbers);
   for(unsigned int i = 0; i < numbers.size(); i++){
-    if(numbers[i].getAttribute("loop") == "true"){
+    if(numbers[i].getAttribute("loop") == level){
+      loop = true;
       if(numbers[i].getChoices().size() > 1){
         std::vector<double> choices(numbers[i].getChoices());
         for(unsigned int j = 0; j < choices.size() - 1; j++){
@@ -376,12 +377,30 @@ static bool shouldRecompute()
     }
   }
 
-  if(recompute)
+  if(loop && !recompute) // end of this loop level
+    initializeLoop(level);
+
+  if(loop)
     FlGui::instance()->onelab->rebuildTree();
   
   return recompute;
 }
 
+static void initializeLoop()
+{
+  initializeLoop("1");
+  initializeLoop("2");
+  initializeLoop("3");
+}
+
+static bool incrementLoop()
+{
+  if(incrementLoop("3"))      return true;
+  else if(incrementLoop("2")) return true;
+  else if(incrementLoop("1")) return true;
+  return false;
+}
+
 void onelab_cb(Fl_Widget *w, void *data)
 {
   if(!data) return;
@@ -408,7 +427,7 @@ void onelab_cb(Fl_Widget *w, void *data)
 
   FlGui::instance()->onelab->deactivate();
 
-  if(action == "compute") initCompute();
+  if(action == "compute") initializeLoop();
 
   do{ // enter computation loop
 
@@ -479,7 +498,7 @@ void onelab_cb(Fl_Widget *w, void *data)
 
     printf("Gmsh ONELAB db:\n%s\n", onelab::server::instance()->toChar().c_str());
 
-  } while(action == "compute" && shouldRecompute());
+  } while(action == "compute" && incrementLoop());
 
   FlGui::instance()->onelab->activate();
   FlGui::instance()->onelab->rebuildTree();
@@ -512,7 +531,7 @@ static void onelab_input_range_cb(Fl_Widget *w, void *data)
     numbers[0].setMax(o->maximum());
     numbers[0].setStep(o->step());
     numbers[0].setChoices(o->choices());
-    numbers[0].setAttribute("loop", o->loop() ? "true" : "false");
+    numbers[0].setAttribute("loop", o->loop());
     onelab::server::instance()->set(numbers[0]);
   }
 }
@@ -655,7 +674,7 @@ void onelabWindow::rebuildTree()
       but->maximum(numbers[i].getMax());
       but->step(numbers[i].getStep());
       but->choices(numbers[i].getChoices());
-      but->loop(numbers[i].getAttribute("loop") == "true");
+      but->loop(numbers[i].getAttribute("loop"));
       but->align(FL_ALIGN_RIGHT);
       but->callback(onelab_input_range_cb, (void*)n);
       but->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);