diff --git a/Fltk/extraDialogs.cpp b/Fltk/extraDialogs.cpp
index fba6c27584b56d2c1877b7e0c711ec830709f96b..ce076746eae4912d97766fe3a00cd8a931078d67 100644
--- a/Fltk/extraDialogs.cpp
+++ b/Fltk/extraDialogs.cpp
@@ -201,9 +201,9 @@ int modelChooser()
   return 0;
 }
 
-// Connection chooser
+// Connection and pattern choosers
 
-class ConnectionBrowser : public Fl_Hold_Browser {
+class historyBrowser : public Fl_Hold_Browser {
   int handle(int event)
   { 
     switch (event) {
@@ -223,122 +223,151 @@ class ConnectionBrowser : public Fl_Hold_Browser {
     return Fl_Hold_Browser::handle(event);
   };
  public:
-  ConnectionBrowser(int x, int y, int w, int h, const char *l=0)
+  historyBrowser(int x, int y, int w, int h, const char *l=0)
     : Fl_Hold_Browser(x, y, w, h, l) {}
 };
 
-struct _connectionChooser{
+class historyChooser{
+ private:
+  std::string _prefix, _label, _commandLabel, _defaultCommand, _okLabel;
+ public:
   Fl_Double_Window *window;
   Fl_Input *input;
-  ConnectionBrowser *browser;
+  historyBrowser *browser;
   Fl_Return_Button *ok;
   Fl_Button *cancel;
+ public:
+  historyChooser(const std::string &prefix, const std::string &label,
+                 const std::string &commandLabel, const std::string &defaultCommand,
+                 const std::string &okLabel)
+    : _prefix(prefix), _label(label), _commandLabel(commandLabel), 
+      _defaultCommand(defaultCommand), _okLabel(okLabel)
+  {
+    int x = 100, y = 100, h = 4 * WB + 10 * BH, w = 3 * BB + 2 * WB;
+    window = new Fl_Double_Window(w, h);
+    window->set_modal();
+    window->label(_label.c_str());
+    Fl_Box *b1 = new Fl_Box(WB, WB, w, BH, _commandLabel.c_str());
+    b1->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
+    input = new Fl_Input(WB, WB + BH, w - 2 * WB, BH);
+    Fl_Box *b2 = new Fl_Box(WB, 2 * WB + 2 * BH, w, BH, "History:");
+    b2->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
+    browser = new historyBrowser
+      (WB, 2 * WB + 3 * BH, w - 2 * WB, h - 4 * BH - 4 * WB);
+    cancel = new Fl_Button
+      (w - 2 * WB - 2 * BB, h - WB - BH, BB, BH, "Cancel");
+    ok = new Fl_Return_Button
+      (w - WB - BB, h - WB - BH, BB, BH, _okLabel.c_str());
+    Fl_Box *b3 = new Fl_Box(WB, h - WB - BB, WB, WB);
+    b3->hide();
+    window->resizable(b3);
+  }
   void save(Fl_Preferences &prefs)
   {
     for(int i = 0; i < 100; i++){
       char name[256];
-      sprintf(name, "connection%02d", i);
+      sprintf(name, "%s%02d", _prefix.c_str(), i);
       if(i < browser->size())
         prefs.set(name, browser->text(i + 1));
       else if(prefs.entryExists(name)) 
         prefs.deleteEntry(name);
     }
-    prefs.set("connectionPositionX", window->x());
-    prefs.set("connectionPositionY", window->y());
-    prefs.set("connectionWidth", window->w());
-    prefs.set("connectionHeight", window->h());
+    prefs.set((_prefix + "PositionX").c_str(), window->x());
+    prefs.set((_prefix + "PositionY").c_str(), window->y());
+    prefs.set((_prefix + "Width").c_str(), window->w());
+    prefs.set((_prefix + "Height").c_str(), window->h());
+  }
+  std::string run()
+  {
+    Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "gmsh");
+    int x = 100, y = 100, h = 4 * WB + 10 * BH, w = 3 * BB + 2 * WB;
+    prefs.get((_prefix + "PositionX").c_str(), x, x);
+    prefs.get((_prefix + "PositionY").c_str(), y, y);
+    prefs.get((_prefix + "Width").c_str(), w, w);
+    prefs.get((_prefix + "Height").c_str(), h, h);
+    window->resize(x, y, w, h);
+    int old = browser->value();
+    browser->clear();
+    for (int i = 0; i < 100; i++) {
+      char name[256], value[1024];
+      sprintf(name, "%s%02d", _prefix.c_str(), i);
+      if(prefs.entryExists(name)){
+        prefs.get(name, value, "", sizeof(value));
+        browser->add(value);
+      }
+    }
+    int n = browser->size();
+    if(n){
+      if(old > 0 && old <= n)
+        input->value(browser->text(old));
+      else
+        input->value(browser->text(1));
+    }
+    else
+      input->value(_defaultCommand.c_str());
+    window->show();
+    while(window->shown()){
+      Fl::wait();
+      for (;;) {
+        Fl_Widget* o = Fl::readqueue();
+        if (!o) break;
+        if (o == ok) {
+          if(strlen(input->value())){
+            // insert choosen value at the top of the history
+            for(int i = 0; i < browser->size(); i++){
+              if(!strcmp(input->value(), browser->text(i + 1))){
+                browser->remove(i + 1);
+                break;
+              }
+            }
+            browser->insert(1, input->value());
+          }
+          save(prefs);
+          window->hide();
+          return input->value();
+        }
+        if (o == window || o == cancel){
+          save(prefs);
+          window->hide();
+          return "";
+        }
+      }
+    }
+    return "";
   }
 };
 
-static _connectionChooser *chooser = 0;
-
-static void select_cb(Fl_Widget* w, void *data)
+static historyChooser *_connectionChooser = 0;
+static void connection_select_cb(Fl_Widget* w, void *data)
 {
-  int i = chooser->browser->value();
-  if(i) chooser->input->value(chooser->browser->text(i));
+  int i = _connectionChooser->browser->value();
+  if(i) _connectionChooser->input->value(_connectionChooser->browser->text(i));
 }
 
 std::string connectionChooser()
 {
-  int x = 100, y = 100, h = 4 * WB + 10 * BH, w = 3 * BB + 2 * WB;
-
-  if(!chooser){
-    chooser = new _connectionChooser;
-    chooser->window = new Fl_Double_Window(w, h);
-    chooser->window->set_modal();
-    chooser->window->label("Remote Start");
-    Fl_Box *b1 = new Fl_Box(WB, WB, w, BH, "Command:");
-    b1->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
-    chooser->input = new Fl_Input(WB, WB + BH, w - 2 * WB, BH);
-    Fl_Box *b2 = new Fl_Box(WB, 2 * WB + 2 * BH, w, BH, "History:");
-    b2->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
-    chooser->browser = new ConnectionBrowser
-      (WB, 2 * WB + 3 * BH, w - 2 * WB, h - 4 * BH - 4 * WB);
-    chooser->browser->callback(select_cb);
-    chooser->cancel = new Fl_Button
-      (w - 2 * WB - 2 * BB, h - WB - BH, BB, BH, "Cancel");
-    chooser->ok = new Fl_Return_Button
-      (w - WB - BB, h - WB - BH, BB, BH, "Run");
-    Fl_Box *b3 = new Fl_Box(WB, h - WB - BB, WB, WB);
-    b3->hide();
-    chooser->window->resizable(b3);
+  if(!_connectionChooser){
+    _connectionChooser = new historyChooser
+      ("connection", "Remote Start", "Command:", "./gmsh ../tutorial/view3.pos",
+       "Run");
+    _connectionChooser->browser->callback(connection_select_cb);
   }
+  return _connectionChooser->run();
+}
 
-  Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "gmsh");
-  prefs.get("connectionPositionX", x, x);
-  prefs.get("connectionPositionY", y, y);
-  prefs.get("connectionWidth", w, w);
-  prefs.get("connectionHeight", h, h);
-  chooser->window->resize(x, y, w, h);
-
-  int old = chooser->browser->value();
-  chooser->browser->clear();
-  for (int i = 0; i < 100; i++) {
-    char name[256], value[1024];
-    sprintf(name, "connection%02d", i);
-    if(prefs.entryExists(name)){
-      prefs.get(name, value, "", sizeof(value));
-      chooser->browser->add(value);
-    }
-  }
-  int n = chooser->browser->size();
-  if(n){
-    if(old > 0 && old <= n)
-      chooser->input->value(chooser->browser->text(old));
-    else
-      chooser->input->value(chooser->browser->text(1));
-  }
-  else
-    chooser->input->value("./gmsh ../tutorial/view3.pos");
-  
-  chooser->window->show();
+static historyChooser *_patternChooser = 0;
+static void pattern_select_cb(Fl_Widget* w, void *data)
+{
+  int i = _patternChooser->browser->value();
+  if(i) _patternChooser->input->value(_patternChooser->browser->text(i));
+}
 
-  while(chooser->window->shown()){
-    Fl::wait();
-    for (;;) {
-      Fl_Widget* o = Fl::readqueue();
-      if (!o) break;
-      if (o == chooser->ok) {
-        if(strlen(chooser->input->value())){
-          // insert choosen value at the top of the history
-          for(int i = 0; i < chooser->browser->size(); i++){
-            if(!strcmp(chooser->input->value(), chooser->browser->text(i + 1))){
-              chooser->browser->remove(i + 1);
-              break;
-            }
-          }
-          chooser->browser->insert(1, chooser->input->value());
-        }
-        chooser->save(prefs);
-        chooser->window->hide();
-        return chooser->input->value();
-      }
-      if (o == chooser->window || o == chooser->cancel){
-        chooser->save(prefs);
-        chooser->window->hide();
-        return "";
-      }
-    }
+std::string patternChooser()
+{
+  if(!_patternChooser){
+    _patternChooser = new historyChooser
+      ("pattern", "Watch Patern", "Pattern:", "output/*.msh", "Watch");
+    _patternChooser->browser->callback(pattern_select_cb);
   }
-  return "";
+  return _patternChooser->run();
 }
diff --git a/Fltk/extraDialogs.h b/Fltk/extraDialogs.h
index eb862c16116c0d549aee5fd8b2a1738fc846b187..5f36976a6759983b8468a5c2a6ae06b99dc3308e 100644
--- a/Fltk/extraDialogs.h
+++ b/Fltk/extraDialogs.h
@@ -12,5 +12,6 @@ int arrowEditor(const char *title, double &a, double &b, double &c);
 int perspectiveEditor();
 int modelChooser();
 std::string connectionChooser();
+std::string patternChooser();
 
 #endif
diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp
index cdb68cc71a5201d712a2f5eb05d4d7dff542ff5f..35437540ff330b5e486afaba156edee75b91b5c9 100644
--- a/Fltk/menuWindow.cpp
+++ b/Fltk/menuWindow.cpp
@@ -418,11 +418,7 @@ void file_quit_cb(Fl_Widget *w, void *data)
 
 void file_watch_cb(Fl_Widget *w, void *data)
 {
-  if(w){
-    if(fileChooser(FILE_CHOOSER_CREATE, "Watch Pattern", "*")) {
-      CTX::instance()->watchFilePattern = fileChooserGetName(1);
-    }
-  }
+  if(w) CTX::instance()->watchFilePattern = patternChooser();
 
   if(CTX::instance()->watchFilePattern.empty()) return;