diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index c25ebcd5df75ade54f2f453d548b109386b6d3ab..0da979c5a6c851f07b2c1672d3119eb66586640d 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -125,116 +125,109 @@ std::vector<std::string> GetUsage(const std::string &name)
   return s;
 }
 
-std::vector<std::string> GetShortcutsUsage()
+std::vector<std::pair<std::string, std::string> > GetShortcutsUsage(const std::string &ctrl)
 {
-  // If you make changes in this routine, please also change the texinfo
-  // documentation (doc/texinfo/gmsh.texi)
+  std::string cc = ctrl;
 #if defined(__APPLE__)
-#  define CC(str) "Cmd+" str " "
+  if(cc.empty()) cc = "Cmd+";
 #else
-#  define CC(str) "Ctrl+" str
+  if(cc.empty()) cc = "Ctrl+";
 #endif
-  std::vector<std::string> s;
-  s.push_back("  Left arrow    Go to previous time step");
-  s.push_back("  Right arrow   Go to next time step");
-  s.push_back("  Up arrow      Make previous view visible");
-  s.push_back("  Down arrow    Make next view visible");
-  s.push_back("  0             Reload project file");
-  s.push_back("  1 or F1       Mesh lines");
-  s.push_back("  2 or F2       Mesh surfaces");
-  s.push_back("  3 or F3       Mesh volumes");
-  s.push_back("  Escape        Cancel lasso zoom/selection, toggle mouse selection ON/OFF");
-  s.push_back("  g             Go to geometry module");
-  s.push_back("  m             Go to mesh module");
-  s.push_back("  p             Go to post-processing module");
-  s.push_back("  s             Go to solver module");
-  s.push_back("  Shift+a       Bring all windows to front");
-  s.push_back("  Shift+g       Show geometry options");
-  s.push_back("  Shift+m       Show mesh options");
-  s.push_back("  Shift+o       Show general options");
-  s.push_back("  Shift+p       Show post-processing options");
-  s.push_back("  Shift+s       Show solver options");
-  s.push_back("  Shift+u       Show post-processing view plugins");
-  s.push_back("  Shift+w       Show post-processing view options");
-  s.push_back("  Shift+Escape  Enable full mouse selection");
-  s.push_back("  " CC("i") "        Show statistics window");
-  s.push_back("  " CC("d") "        Attach/detach menu");
-  s.push_back("  " CC("l") "        Show message console");
+  typedef std::pair<std::string, std::string> mp;
+  std::vector<mp> s;
+  s.push_back(mp("Left arrow",     "Go to previous time step"));
+  s.push_back(mp("Right arrow",    "Go to next time step"));
+  s.push_back(mp("Up arrow",       "Make previous view visible"));
+  s.push_back(mp("Down arrow",     "Make next view visible"));
+  s.push_back(mp("0",              "Reload project file"));
+  s.push_back(mp("1 or F1",        "Mesh lines"));
+  s.push_back(mp("2 or F2",        "Mesh surfaces"));
+  s.push_back(mp("3 or F3",        "Mesh volumes"));
+  s.push_back(mp("Escape",         "Cancel lasso zoom/selection, toggle mouse selection ON/OFF"));
+  s.push_back(mp("g",              "Go to geometry module"));
+  s.push_back(mp("m",              "Go to mesh module"));
+  s.push_back(mp("p",              "Go to post-processing module"));
+  s.push_back(mp("s",              "Go to solver module"));
+  s.push_back(mp("Shift+a",        "Bring all windows to front"));
+  s.push_back(mp("Shift+g",        "Show geometry options"));
+  s.push_back(mp("Shift+m",        "Show mesh options"));
+  s.push_back(mp("Shift+o",        "Show general options"));
+  s.push_back(mp("Shift+p",        "Show post-processing options"));
+  s.push_back(mp("Shift+s",        "Show solver options"));
+  s.push_back(mp("Shift+u",        "Show post-processing view plugins"));
+  s.push_back(mp("Shift+w",        "Show post-processing view options"));
+  s.push_back(mp("Shift+Escape",   "Enable full mouse selection"));
+  s.push_back(mp(cc + "i",         "Show statistics window"));
+  s.push_back(mp(cc + "d",         "Attach/detach menu"));
+  s.push_back(mp(cc + "l",         "Show message console"));
 #if defined(__APPLE__)
-  s.push_back("  " CC("m") "        Minimize window");
+  s.push_back(mp(cc + "m",         "Minimize window"));
 #endif
-  s.push_back("  " CC("n") "        Create new project file");
-  s.push_back("  " CC("o") "        Open project file");
-  s.push_back("  " CC("q") "        Quit");
-  s.push_back("  " CC("r") "        Rename project file");
-  s.push_back("  " CC("s") "        Save file as");
-  s.push_back("  Shift+" CC("c") "  Show clipping plane window");
-  s.push_back("  Shift+" CC("m") "  Show manipulator window");
-  s.push_back("  Shift+" CC("n") "  Show option window");
-  s.push_back("  Shift+" CC("o") "  Merge file(s)");
-  s.push_back("  Shift+" CC("s") "  Save mesh in default format");
-  s.push_back("  Shift+" CC("u") "  Show plugin window");
-  s.push_back("  Shift+" CC("v") "  Show visibility window");
-  s.push_back("  Alt+a         Loop through axes modes");
-  s.push_back("  Alt+b         Hide/show bounding boxes");
-  s.push_back("  Alt+c         Loop through predefined color schemes");
-  s.push_back("  Alt+e         Hide/Show element outlines for visible post-pro views");
-  s.push_back("  Alt+f         Change redraw mode (fast/full)");
-  s.push_back("  Alt+h         Hide/show all post-processing views");
-  s.push_back("  Alt+i         Hide/show all post-processing view scales");
-  s.push_back("  Alt+l         Hide/show geometry lines");
-  s.push_back("  Alt+m         Toggle visibility of all mesh entities");
-  s.push_back("  Alt+n         Hide/show all post-processing view annotations");
-  s.push_back("  Alt+o         Change projection mode (orthographic/perspective)");
-  s.push_back("  Alt+p         Hide/show geometry points");
-  s.push_back("  Alt+r         Loop through range modes for visible post-pro views");
-  s.push_back("  Alt+s         Hide/show geometry surfaces");
-  s.push_back("  Alt+t         Loop through interval modes for visible post-pro views");
-  s.push_back("  Alt+v         Hide/show geometry volumes");
-  s.push_back("  Alt+w         Enable/disable all lighting");
-  s.push_back("  Alt+x         Set X view");
-  s.push_back("  Alt+y         Set Y view");
-  s.push_back("  Alt+z         Set Z view");
-  s.push_back("  Alt+Shift+a   Hide/show small axes");
-  s.push_back("  Alt+Shift+b   Hide/show mesh volume faces");
-  s.push_back("  Alt+Shift+d   Hide/show mesh surface faces");
-  s.push_back("  Alt+Shift+l   Hide/show mesh lines");
-  s.push_back("  Alt+Shift+o   Adjust projection parameters");
-  s.push_back("  Alt+Shift+p   Hide/show mesh points");
-  s.push_back("  Alt+Shift+s   Hide/show mesh surface edges");
-  s.push_back("  Alt+Shift+v   Hide/show mesh volume edges");
-  s.push_back("  Alt+Shift+w   Reverse all mesh normals");
-  s.push_back("  Alt+Shift+x   Set -X view");
-  s.push_back("  Alt+Shift+y   Set -Y view");
-  s.push_back("  Alt+Shift+z   Set -Z view");
+  s.push_back(mp(cc + "n",         "Create new project file"));
+  s.push_back(mp(cc + "o",         "Open project file"));
+  s.push_back(mp(cc + "q",         "Quit"));
+  s.push_back(mp(cc + "r",         "Rename project file"));
+  s.push_back(mp(cc + "s",         "Save file as"));
+  s.push_back(mp("Shift+" + cc + "c", "Show clipping plane window"));
+  s.push_back(mp("Shift+" + cc + "m", "Show manipulator window"));
+  s.push_back(mp("Shift+" + cc + "n", "Show option window"));
+  s.push_back(mp("Shift+" + cc + "o", "Merge file(s)"));
+  s.push_back(mp("Shift+" + cc + "s", "Save mesh in default format"));
+  s.push_back(mp("Shift+" + cc + "u", "Show plugin window"));
+  s.push_back(mp("Shift+" + cc + "v", "Show visibility window"));
+  s.push_back(mp("Alt+a",          "Loop through axes modes"));
+  s.push_back(mp("Alt+b",          "Hide/show bounding boxes"));
+  s.push_back(mp("Alt+c",          "Loop through predefined color schemes"));
+  s.push_back(mp("Alt+e",          "Hide/Show element outlines for visible post-pro views"));
+  s.push_back(mp("Alt+f",          "Change redraw mode (fast/full)"));
+  s.push_back(mp("Alt+h",          "Hide/show all post-processing views"));
+  s.push_back(mp("Alt+i",          "Hide/show all post-processing view scales"));
+  s.push_back(mp("Alt+l",          "Hide/show geometry lines"));
+  s.push_back(mp("Alt+m",          "Toggle visibility of all mesh entities"));
+  s.push_back(mp("Alt+n",          "Hide/show all post-processing view annotations"));
+  s.push_back(mp("Alt+o",          "Change projection mode (orthographic/perspective)"));
+  s.push_back(mp("Alt+p",          "Hide/show geometry points"));
+  s.push_back(mp("Alt+r",          "Loop through range modes for visible post-pro views"));
+  s.push_back(mp("Alt+s",          "Hide/show geometry surfaces"));
+  s.push_back(mp("Alt+t",          "Loop through interval modes for visible post-pro views"));
+  s.push_back(mp("Alt+v",          "Hide/show geometry volumes"));
+  s.push_back(mp("Alt+w",          "Enable/disable all lighting"));
+  s.push_back(mp("Alt+x",          "Set X view"));
+  s.push_back(mp("Alt+y",          "Set Y view"));
+  s.push_back(mp("Alt+z",          "Set Z view"));
+  s.push_back(mp("Alt+Shift+a",    "Hide/show small axes"));
+  s.push_back(mp("Alt+Shift+b",    "Hide/show mesh volume faces"));
+  s.push_back(mp("Alt+Shift+d",    "Hide/show mesh surface faces"));
+  s.push_back(mp("Alt+Shift+l",    "Hide/show mesh lines"));
+  s.push_back(mp("Alt+Shift+o",    "Adjust projection parameters"));
+  s.push_back(mp("Alt+Shift+p",    "Hide/show mesh points"));
+  s.push_back(mp("Alt+Shift+s",    "Hide/show mesh surface edges"));
+  s.push_back(mp("Alt+Shift+v",    "Hide/show mesh volume edges"));
+  s.push_back(mp("Alt+Shift+w",    "Reverse all mesh normals"));
+  s.push_back(mp("Alt+Shift+x",    "Set -X view"));
+  s.push_back(mp("Alt+Shift+y",    "Set -Y view"));
+  s.push_back(mp("Alt+Shift+z",    "Set -Z view"));
   return s;
-#undef CC
 }
 
-std::vector<std::string> GetMouseUsage()
+std::vector<std::pair<std::string, std::string> > GetMouseUsage()
 {
-  // If you make changes in this routine, please also change the texinfo
-  // documentation (doc/texinfo/gmsh.texi)
-  std::vector<std::string> s;
-  s.push_back("  Move                - Highlight the entity under the mouse pointer");
-  s.push_back("                        and display its properties");
-  s.push_back("                      - Resize a lasso zoom or a lasso (un)selection");
-  s.push_back("  Left button         - Rotate");
-  s.push_back("                      - Select an entity");
-  s.push_back("                      - Accept a lasso zoom or a lasso selection");
-  s.push_back("  Ctrl+Left button    Start a lasso zoom or a lasso (un)selection");
-  s.push_back("  Middle button       - Zoom");
-  s.push_back("                      - Unselect an entity");
-  s.push_back("                      - Accept a lasso zoom or a lasso unselection");
-  s.push_back("  Ctrl+Middle button  Orthogonalize display");
-  s.push_back("  Right button        - Pan");
-  s.push_back("                      - Cancel a lasso zoom or a lasso (un)selection");
-  s.push_back("                      - Pop-up menu on post-processing view button");
-  s.push_back("  Ctrl+Right button   Reset to default viewpoint");
-  s.push_back(" ");
-  s.push_back("  For a 2 button mouse, Middle button = Shift+Left button");
-  s.push_back("  For a 1 button mouse, Middle button = Shift+Left button, "
-              "Right button = Alt+Left button");
+  typedef std::pair<std::string, std::string> mp;
+  std::vector<mp> s;
+  s.push_back(mp("Move", "- Highlight the entity under the mouse pointer and display its properties"));
+  s.push_back(mp("",     "- Resize a lasso zoom or a lasso (un)selection"));
+  s.push_back(mp("Left button", "- Rotate"));
+  s.push_back(mp("",            "- Select an entity"));
+  s.push_back(mp("",            "- Accept a lasso zoom or a lasso selection"));
+  s.push_back(mp("Ctrl+Left button", "Start a lasso zoom or a lasso (un)selection"));
+  s.push_back(mp("Middle button", "- Zoom"));
+  s.push_back(mp("",              "- Unselect an entity"));
+  s.push_back(mp("",              "- Accept a lasso zoom or a lasso unselection"));
+  s.push_back(mp("Ctrl+Middle button", "Orthogonalize display"));
+  s.push_back(mp("Right button", "- Pan"));
+  s.push_back(mp("",             "- Cancel a lasso zoom or a lasso (un)selection"));
+  s.push_back(mp("",             "- Pop-up menu on post-processing view button"));
+  s.push_back(mp("Ctrl+Right button", "Reset to default viewpoint"));
   return s;
 }
 
diff --git a/Common/CommandLine.h b/Common/CommandLine.h
index 89fcf3f22ee4c2ae8c38fafa0b62228a8a8feb84..d739e2a92b4299df2dd2bfc9edcb00a2772a57c4 100644
--- a/Common/CommandLine.h
+++ b/Common/CommandLine.h
@@ -21,8 +21,8 @@ const char *GetGmshShortLicense();
 const char *GetGmshBuildOptions();
 
 std::vector<std::string> GetUsage(const std::string &name);
-std::vector<std::string> GetShortcutsUsage();
-std::vector<std::string> GetMouseUsage();
+std::vector<std::pair<std::string, std::string> > GetShortcutsUsage(const std::string &ctrl="");
+std::vector<std::pair<std::string, std::string> > GetMouseUsage();
 void PrintUsage(const std::string &name);
 void GetOptions(int argc, char *argv[]);
 
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 8b597cb5654c66893b331c1aae83373c5e67f77f..7d1ef4159118f9f74a019db313079a074f33037b 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -14,6 +14,7 @@
 #include "Context.h"
 #include "Options.h"
 #include "Colors.h"
+#include "CommandLine.h"
 #include "DefaultOptions.h"
 
 #if defined(HAVE_MESH)
@@ -688,185 +689,219 @@ void PrintOptionsDoc()
     "@c Do not edit by hand!\n"
     "@c\n\n";
 
-  FILE *file = fopen("opt_general.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_general.texi'");
-    return;
-  }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(GeneralOptions_String, "General.", file);
-  PrintNumberOptionsDoc(GeneralOptions_Number, "General.", file);
-  PrintColorOptionsDoc(GeneralOptions_Color, "General.", file);
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-
-  file = fopen("opt_print.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_print.texi'");
-    return;
-  }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(PrintOptions_String, "Print.", file);
-  PrintNumberOptionsDoc(PrintOptions_Number, "Print.", file);
-  PrintColorOptionsDoc(PrintOptions_Color, "Print.", file);
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-
-  file = fopen("opt_geometry.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_geometry.texi'");
-    return;
-  }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(GeometryOptions_String, "Geometry.", file);
-  PrintNumberOptionsDoc(GeometryOptions_Number, "Geometry.", file);
-  PrintColorOptionsDoc(GeometryOptions_Color, "Geometry.", file);
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-
-  file = fopen("opt_mesh.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_mesh.texi'");
-    return;
-  }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(MeshOptions_String, "Mesh.", file);
-  PrintNumberOptionsDoc(MeshOptions_Number, "Mesh.", file);
-  PrintColorOptionsDoc(MeshOptions_Color, "Mesh.", file);
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-
-  file = fopen("opt_solver.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_solver.texi'");
-    return;
-  }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(SolverOptions_String, "Solver.", file);
-  PrintNumberOptionsDoc(SolverOptions_Number, "Solver.", file);
-  PrintColorOptionsDoc(SolverOptions_Color, "Solver.", file);
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-
-  file = fopen("opt_post.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_post.texi'");
-    return;
+  {
+    FILE *file = fopen("opt_general.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_general.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(GeneralOptions_String, "General.", file);
+    PrintNumberOptionsDoc(GeneralOptions_Number, "General.", file);
+    PrintColorOptionsDoc(GeneralOptions_Color, "General.", file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+  }
+  {
+    FILE *file = fopen("opt_print.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_print.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(PrintOptions_String, "Print.", file);
+    PrintNumberOptionsDoc(PrintOptions_Number, "Print.", file);
+    PrintColorOptionsDoc(PrintOptions_Color, "Print.", file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+  }
+  {
+    FILE *file = fopen("opt_geometry.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_geometry.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(GeometryOptions_String, "Geometry.", file);
+    PrintNumberOptionsDoc(GeometryOptions_Number, "Geometry.", file);
+    PrintColorOptionsDoc(GeometryOptions_Color, "Geometry.", file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+  }
+  {
+    FILE *file = fopen("opt_mesh.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_mesh.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(MeshOptions_String, "Mesh.", file);
+    PrintNumberOptionsDoc(MeshOptions_Number, "Mesh.", file);
+    PrintColorOptionsDoc(MeshOptions_Color, "Mesh.", file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+  }
+  {
+    FILE *file = fopen("opt_solver.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_solver.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(SolverOptions_String, "Solver.", file);
+    PrintNumberOptionsDoc(SolverOptions_Number, "Solver.", file);
+    PrintColorOptionsDoc(SolverOptions_Color, "Solver.", file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+  }
+  {
+    FILE *file = fopen("opt_post.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_post.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(PostProcessingOptions_String, "PostProcessing.", file);
+    PrintNumberOptionsDoc(PostProcessingOptions_Number, "PostProcessing.", file);
+    PrintColorOptionsDoc(PostProcessingOptions_Color, "PostProcessing.", file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
   }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(PostProcessingOptions_String, "PostProcessing.", file);
-  PrintNumberOptionsDoc(PostProcessingOptions_Number, "PostProcessing.", file);
-  PrintColorOptionsDoc(PostProcessingOptions_Color, "PostProcessing.", file);
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-
+  {
 #if defined(HAVE_POST)
-  file = fopen("opt_view.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_view.texi'");
-    return;
-  }
-  fprintf(file, "%s@ftable @code\n", warn);
-  PrintStringOptionsDoc(ViewOptions_String, "View.", file);
-  PrintNumberOptionsDoc(ViewOptions_Number, "View.", file);
-  PrintColorOptionsDoc(ViewOptions_Color, "View.", file);
-  fprintf(file, "@item View.ColorTable\n");
-  fprintf(file, "Color table used to draw the view@*\n");
-  fprintf(file, "Saved in: @code{%s}\n\n",
-          GetOptionSaveLevel(GMSH_FULLRC|GMSH_OPTIONSRC));
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-#endif
-
+    FILE *file = fopen("opt_view.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_view.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    PrintStringOptionsDoc(ViewOptions_String, "View.", file);
+    PrintNumberOptionsDoc(ViewOptions_Number, "View.", file);
+    PrintColorOptionsDoc(ViewOptions_Color, "View.", file);
+    fprintf(file, "@item View.ColorTable\n");
+    fprintf(file, "Color table used to draw the view@*\n");
+    fprintf(file, "Saved in: @code{%s}\n\n",
+            GetOptionSaveLevel(GMSH_FULLRC|GMSH_OPTIONSRC));
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+#endif
+  }
+  {
 #if defined(HAVE_PLUGINS)
-  file = fopen("opt_plugin.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_plugin.texi'");
-    return;
+    FILE *file = fopen("opt_plugin.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_plugin.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    for(std::map<std::string, GMSH_Plugin*>::iterator it = PluginManager::
+          instance()->begin(); it != PluginManager::instance()->end(); ++it) {
+      GMSH_Plugin *p = it->second;
+      if(p->getType() == GMSH_Plugin::GMSH_POST_PLUGIN) {
+        fprintf(file, "@item Plugin(%s)\n", p->getName().c_str());
+        fprintf(file, "%s\n", p->getHelp().c_str());
+        int m = p->getNbOptionsStr();
+        if(m){
+          fprintf(file, "String options:\n");
+          fprintf(file, "@table @code\n");
+          for(int i = 0; i < m; i++) {
+            StringXString *sxs = p->getOptionStr(i);
+            fprintf(file, "@item %s\n", sxs->str);
+            fprintf(file, "Default value: @code{\"%s\"}\n", sxs->def.c_str());
+          }
+          fprintf(file, "@end table\n");
+        }
+        int n = p->getNbOptions();
+        if(n){
+          fprintf(file, "Numeric options:\n");
+          fprintf(file, "@table @code\n");
+          for(int i = 0; i < n; i++) {
+            StringXNumber *sxn = p->getOption(i);
+            fprintf(file, "@item %s\n", sxn->str);
+            fprintf(file, "Default value: @code{%g}\n", sxn->def);
+          }
+          fprintf(file, "@end table\n");
+        }
+      }
+      fprintf(file, "\n");
+    }
+    fprintf(file, "@end ftable\n");
+    fclose(file);
+#endif
   }
-  fprintf(file, "%s@ftable @code\n", warn);
-  for(std::map<std::string, GMSH_Plugin*>::iterator it = PluginManager::
-        instance()->begin(); it != PluginManager::instance()->end(); ++it) {
-    GMSH_Plugin *p = it->second;
-    if(p->getType() == GMSH_Plugin::GMSH_POST_PLUGIN) {
-      fprintf(file, "@item Plugin(%s)\n", p->getName().c_str());
-      fprintf(file, "%s\n", p->getHelp().c_str());
-
-      int m = p->getNbOptionsStr();
-      if(m){
-        fprintf(file, "String options:\n");
+
+#if defined(HAVE_MESH)
+  {
+    FILE *file = fopen("opt_fields.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'opt_fields.texi'");
+      return;
+    }
+    fprintf(file, "%s@ftable @code\n", warn);
+    FieldManager &fields = *GModel::current()->getFields();
+    for(std::map<std::string, FieldFactory*>::iterator it = fields.map_type_name.begin();
+        it != fields.map_type_name.end(); it++){
+      fprintf(file, "@item %s\n", it->first.c_str());
+      Field *f = (*it->second)();
+      std::string field_description = f->getDescription();
+      Sanitize_String_Texi(field_description);
+      fprintf(file,"%s@*\n", field_description.c_str());
+      if (!f->options.empty()) {
+        fprintf(file, "Options:@*\n");
         fprintf(file, "@table @code\n");
-        for(int i = 0; i < m; i++) {
-          StringXString *sxs = p->getOptionStr(i);
-          fprintf(file, "@item %s\n", sxs->str);
-          fprintf(file, "Default value: @code{\"%s\"}\n", sxs->def.c_str());
+        for(std::map<std::string, FieldOption*>::iterator it2 = f->options.begin();
+            it2 != f->options.end(); it2++){
+          fprintf(file, "@item %s\n", it2->first.c_str());
+          std::string val;
+          it2->second->getTextRepresentation(val);
+          Sanitize_String_Texi(val);
+          fprintf(file, "%s@*\ntype: %s@*\ndefault value: @code{%s}\n",
+                  it2->second->getDescription().c_str(),
+                  it2->second->getTypeName().c_str(), val.c_str());
         }
-        fprintf(file, "@end table\n");
+        fprintf(file, "@end table\n\n");
       }
-
-      int n = p->getNbOptions();
-      if(n){
-        fprintf(file, "Numeric options:\n");
+      if (!f->callbacks.empty()) {
+        fprintf(file, "Actions:@*\n");
         fprintf(file, "@table @code\n");
-        for(int i = 0; i < n; i++) {
-          StringXNumber *sxn = p->getOption(i);
-          fprintf(file, "@item %s\n", sxn->str);
-          fprintf(file, "Default value: @code{%g}\n", sxn->def);
+        for(std::map<std::string, FieldCallback*>::iterator it2 = f->callbacks.begin();
+            it2 != f->callbacks.end(); it2++){
+          fprintf(file, "@item %s\n", it2->first.c_str());
+          fprintf(file, "%s@*\n", it2->second->getDescription().c_str());
         }
-        fprintf(file, "@end table\n");
+        fprintf(file, "@end table\n\n");
       }
-
     }
-    fprintf(file, "\n");
-  }
-  fprintf(file, "@end ftable\n");
-  fclose(file);
+    fprintf(file, "@end ftable\n");
+    fclose(file);
 #endif
-
-#if defined(HAVE_MESH)
-  file = fopen("opt_fields.texi", "w");
-  if(!file) {
-    Msg::Error("Unable to open file 'opt_fields.texi'");
-    return;
   }
-  fprintf(file, "%s@ftable @code\n", warn);
-  FieldManager &fields = *GModel::current()->getFields();
-  for(std::map<std::string, FieldFactory*>::iterator it = fields.map_type_name.begin();
-      it != fields.map_type_name.end(); it++){
-    fprintf(file, "@item %s\n", it->first.c_str());
-    Field *f = (*it->second)();
-    std::string field_description = f->getDescription();
-    Sanitize_String_Texi(field_description);
-    fprintf(file,"%s@*\n", field_description.c_str());
-    if (!f->options.empty()) {
-      fprintf(file, "Options:@*\n");
-      fprintf(file, "@table @code\n");
-      for(std::map<std::string, FieldOption*>::iterator it2 = f->options.begin();
-          it2 != f->options.end(); it2++){
-        fprintf(file, "@item %s\n", it2->first.c_str());
-        std::string val;
-        it2->second->getTextRepresentation(val);
-        Sanitize_String_Texi(val);
-        fprintf(file, "%s@*\ntype: %s@*\ndefault value: @code{%s}\n",
-            it2->second->getDescription().c_str(),
-            it2->second->getTypeName().c_str(), val.c_str());
-      }
-      fprintf(file, "@end table\n\n");
+  {
+    FILE *file = fopen("shortcuts.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'shortcuts.texi'");
+      return;
     }
-    if (!f->callbacks.empty()) {
-      fprintf(file, "Actions:@*\n");
-      fprintf(file, "@table @code\n");
-      for(std::map<std::string, FieldCallback*>::iterator it2 = f->callbacks.begin();
-          it2 != f->callbacks.end(); it2++){
-        fprintf(file, "@item %s\n", it2->first.c_str());
-        fprintf(file, "%s@*\n", it2->second->getDescription().c_str());
-      }
-      fprintf(file, "@end table\n\n");
+    std::vector<std::pair<std::string, std::string> > s = GetShortcutsUsage("Ctrl+");
+    fprintf(file, "%s@table @kbd\n", warn);
+    for(unsigned int i = 0; i < s.size(); i++)
+      fprintf(file, "@item %s\n%s\n", s[i].first.c_str(), s[i].second.c_str());
+    fprintf(file, "@end table\n");
+    fclose(file);
+  }
+  {
+    FILE *file = fopen("mouse.texi", "w");
+    if(!file) {
+      Msg::Error("Unable to open file 'mouse.texi'");
+      return;
     }
+    std::vector<std::pair<std::string, std::string> > s = GetMouseUsage();
+    fprintf(file, "%s@table @kbd\n", warn);
+    for(unsigned int i = 0; i < s.size(); i++)
+      fprintf(file, "@item %s\n%s\n", s[i].first.c_str(), s[i].second.c_str());
+    fprintf(file, "@end table\n");
+    fclose(file);
   }
-  fprintf(file, "@end ftable\n");
-  fclose(file);
-#endif
 }
 
 #define GET_VIEW(error_val)                             \
diff --git a/Fltk/aboutWindow.cpp b/Fltk/aboutWindow.cpp
index 3d62179d3e48687905d8c4e1c0c93b6c2b284900..0ec4523e37e638293f39ae239ff8d3130c285800 100644
--- a/Fltk/aboutWindow.cpp
+++ b/Fltk/aboutWindow.cpp
@@ -22,10 +22,10 @@ static const char *help_link(Fl_Widget *w, const char *uri)
 
 aboutWindow::aboutWindow()
 {
-  int width = 28 * FL_NORMAL_SIZE;
-  int height = 18 * BH;
-
   {
+    int width = 28 * FL_NORMAL_SIZE;
+    int height = 18 * BH;
+
     win = new paletteWindow
       (width, height, CTX::instance()->nonModalWindows ? true : false, "About Gmsh");
     win->box(GMSH_WINDOW_BOX);
@@ -62,6 +62,9 @@ aboutWindow::aboutWindow()
   }
 
   {
+    int width = 40 * FL_NORMAL_SIZE;
+    int height = 18 * BH;
+
     winhelp = new paletteWindow
       (width, height, CTX::instance()->nonModalWindows ? true : false,
        "Keyboard and Mouse Usage");
@@ -74,22 +77,24 @@ aboutWindow::aboutWindow()
 
     std::string s;
     s += "<h3>Keyboard Shortcuts</h3>";
-    s += "<pre>";
+    s += "<table border=1>";
     {
-      std::vector<std::string> s0 = GetShortcutsUsage();
+      std::vector<std::pair<std::string, std::string> > s0 = GetShortcutsUsage();
       for(unsigned int i = 0; i < s0.size(); i++)
-        s += s0[i] + "<br>";
+        s += "<tr><td>" + s0[i].first + "</td><td>" + s0[i].second + "</td></tr>";
     }
-    s += "</pre>";
+    s += "</table>";
 
     s += "<h3>Mouse Actions</h3>";
-    s += "<pre>";
+    s += "<table border=1>";
     {
-      std::vector<std::string> s0 = GetMouseUsage();
+      std::vector<std::pair<std::string, std::string> > s0 = GetMouseUsage();
       for(unsigned int i = 0; i < s0.size(); i++)
-        s += s0[i] + "<br>";
+        s += "<tr><td>" + s0[i].first + "</td><td>" + s0[i].second + "</td></tr>";
     }
-    s += "</pre>";
+    s += "</table>";
+    s += "For a 2 button mouse, Middle button = Shift+Left button.<p>";
+    s += "For a 1 button mouse, Middle button = Shift+Left button, Right button = Alt+Left button.";
 
     o->value(s.c_str());
 
diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp
index d90e9b09335054a844011be0c6d2c018929566c3..e9fd12949c7d59915d4eb3b6ce2d512e52f66506 100644
--- a/Geo/GFace.cpp
+++ b/Geo/GFace.cpp
@@ -291,7 +291,7 @@ std::string GFace::getAdditionalInfoString()
   else if(l_edges.size()){
     sstream << "{";
     for(std::list<GEdge*>::iterator it = l_edges.begin(); it != l_edges.end(); ++it){
-      if(it != l_edges.begin()) sstream << ",";
+      if(it != l_edges.begin()) sstream << " ";
       sstream << (*it)->tag();
     }
     sstream << "}";
diff --git a/Geo/GVertex.cpp b/Geo/GVertex.cpp
index 614839ef883d2acfa266f92669cb74ebd03561c7..b7063057d3c5fc97be477cf1320b949b79570e6c 100644
--- a/Geo/GVertex.cpp
+++ b/Geo/GVertex.cpp
@@ -11,7 +11,7 @@
 #include "MPoint.h"
 #include "GmshMessage.h"
 
-GVertex::GVertex(GModel *m, int tag, double ms) : GEntity(m, tag), meshSize(ms) 
+GVertex::GVertex(GModel *m, int tag, double ms) : GEntity(m, tag), meshSize(ms)
 {
 }
 
@@ -36,12 +36,12 @@ void GVertex::setPosition(GPoint &p)
 }
 
 void GVertex::addEdge(GEdge *e)
-{ 
+{
   l_edges.push_back(e);
 }
 
 void GVertex::delEdge(GEdge *e)
-{ 
+{
   l_edges.erase(std::find(l_edges.begin(), l_edges.end(), e));
 }
 
@@ -55,7 +55,7 @@ std::string GVertex::getAdditionalInfoString()
   std::ostringstream sstream;
   sstream << "{" << x() << "," << y() << "," << z() << "}";
   double lc = prescribedMeshSizeAtVertex();
-  if(lc < MAX_LC) sstream << " (cl: " << lc << ")";
+  if(lc < MAX_LC) sstream << " (mesh size: " << lc << ")";
   return sstream.str();
 }
 
@@ -74,13 +74,13 @@ void GVertex::writeGEO(FILE *fp, const std::string &meshSizeParameter)
 
 unsigned int GVertex::getNumMeshElements()
 {
-  return points.size(); 
+  return points.size();
 }
 
 MElement *GVertex::getMeshElement(unsigned int index)
-{ 
+{
   if(index < points.size())
-    return points[index]; 
+    return points[index];
   return 0;
 }
 
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index dc755c3b1e17b17a335f8d6a341e9da254b8ab79..1062ddf7f47c2177032f12569ce40cc205a00944 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -962,55 +962,11 @@ Show this message
 @cindex Mouse, actions
 @cindex Bindings, mouse
 
-In the following, for a 2 button mouse, @kbd{Middle button} =
-@kbd{Shift+Left button}. For a 1 button mouse, @kbd{Middle button} =
-@kbd{Shift+Left button} and @kbd{Right button} = @kbd{Alt+Left button}.
+@include mouse.texi
 
-@kbd{Move the mouse}:
-@itemize @bullet
-@item
-Highlight the entity under the mouse pointer and display its properties
-@item
-Resize a lasso zoom or a lasso selection/unselection started with
-@kbd{Ctrl+Left button}
-@end itemize
-
-@kbd{Left button}:
-@itemize @bullet
-@item
-Rotate
-@item
-Select an entity
-@item
-Accept a lasso zoom or a lasso selection started with @kbd{Ctrl+Left
-button}
-@end itemize
-
-@kbd{Ctrl+Left button}: Start a lasso zoom or a lasso selection/unselection
-
-@kbd{Middle button}:
-@itemize @bullet
-@item
-Zoom
-@item
-Unselect an entity
-@item
-Accept a lasso zoom or a lasso unselection
-@end itemize
+For a 2 button mouse, Middle button = Shift+Left button.
 
-@kbd{Ctrl+Middle button}: Orthogonalize display
-
-@kbd{Right button}:
-@itemize @bullet
-@item
-Pan
-@item
-Cancel a lasso zoom or a lasso selection/unselection
-@item
-Pop-up menu on post-processing view button
-@end itemize
-
-@kbd{Ctrl+Right button}: Reset to default viewpoint
+For a 1 button mouse, Middle button = Shift+Left button, Right button = Alt+Left button.
 
 @c -------------------------------------------------------------------------
 @c Keyboard shortcuts
@@ -1026,167 +982,7 @@ Pop-up menu on post-processing view button
 (On Mac Ctrl is replaced by Cmd (the `Apple key') in the shortcuts
 below.)
 
-@table @kbd
-
-@item Left arrow
-Go to previous time step 
-@item Right arrow
-Go to next time step 
-@item Up arrow
-Make previous view visible 
-@item Down arrow
-Make next view visible 
-
-@sp 1 @c ----------------------------------------------
-
-@item 0
-Reload project file
-@item 1 or F1
-Mesh lines
-@item 2 or F2
-Mesh surfaces
-@item 3 or F3
-Mesh volumes
-@item Escape
-Cancel lasso zoom/selection, toggle mouse selection ON/OFF
-
-@sp 1 @c ----------------------------------------------
-
-@item g
-Go to geometry module
-@item m
-Go to mesh module
-@item p
-Go to post-processing module
-@item s
-Go to solver module
-
-@sp 1 @c ----------------------------------------------
-
-@item Shift+a
-Bring all windows to front
-@item Shift+g
-Show geometry options
-@item Shift+m
-Show mesh options
-@item Shift+o
-Show general options 
-@item Shift+p
-Show post-processing options
-@item Shift+s
-Show solver options 
-@item Shift+u
-Show post-processing view plugins
-@item Shift+w
-Show post-processing view options
-
-@sp 1 @c ----------------------------------------------
-
-@item Ctrl+i
-Show statistics window 
-@item Ctrl+d
-Attach/detach menu
-@item Ctrl+l
-Show message console
-@item Ctrl+n
-Create new project file 
-@item Ctrl+o
-Open project file
-@item Ctrl+q
-Quit
-@item Ctrl+r
-Rename project file
-@item Ctrl+s
-Save file
-
-@sp 1 @c ----------------------------------------------
-
-@item Shift+Ctrl+c
-Show clipping plane window
-@item Shift+Ctrl+m
-Show manipulator window 
-@item Shift+Ctrl+n
-Show option window 
-@item Shift+Ctrl+o
-Merge file(s)
-@item Shift+Ctrl+s
-Save mesh in default format
-@item Shift+Ctrl+u
-Show plugin window
-@item Shift+Ctrl+v
-Show visibility window
-
-@sp 1 @c ----------------------------------------------
-
-@item Alt+a
-Loop through axes modes
-@item Alt+b
-Hide/show bounding boxes
-@item Alt+c
-Loop through predefined color schemes
-@item Alt+e
-Hide/Show element outlines for visible post-processing views
-@item Alt+f
-Change redraw mode (fast/full) 
-@item Alt+h
-Hide/show all post-processing views 
-@item Alt+i
-Hide/show all post-processing view scales
-@item Alt+l
-Hide/show geometry lines
-@item Alt+m
-Toggle visibility of all mesh entities
-@item Alt+n
-Hide/show all post-processing view annotations
-@item Alt+o
-Change projection mode (orthographic/perspective)
-@item Alt+p
-Hide/show geometry points
-@item Alt+r
-Loop through range modes for visible post-processing views
-@item Alt+s
-Hide/show geometry surfaces
-@item Alt+t
-Loop through interval modes for visible post-processing views
-@item Alt+v
-Hide/show geometry volumes
-@item Alt+w
-Enable/disable all lighting
-@item Alt+x
-Set X view 
-@item Alt+y
-Set Y view 
-@item Alt+z
-Set Z view 
-
-@sp 1 @c ----------------------------------------------
-
-@item Alt+Shift+a
-Hide/show small axes 
-@item Alt+Shift+b
-Hide/show mesh volume faces
-@item Alt+Shift+d
-Hide/show mesh surface faces
-@item Alt+Shift+l
-Hide/show mesh lines
-@item Alt+Shift+o
-Adjust projection parameters
-@item Alt+Shift+p
-Hide/show mesh points
-@item Alt+Shift+s
-Hide/show mesh surface edges
-@item Alt+Shift+v
-Hide/show mesh volume edges
-@item Alt+Shift+w
-Reverse all mesh normals
-@item Alt+Shift+x
-Set -X view 
-@item Alt+Shift+y
-Set -Y view 
-@item Alt+Shift+z
-Set -Z view 
-
-@end table
+@include shortcuts.texi
 
 @c =========================================================================
 @c General tools
diff --git a/doc/texinfo/mouse.texi b/doc/texinfo/mouse.texi
new file mode 100644
index 0000000000000000000000000000000000000000..6bee1149aae0f8cfd8bcad2b62e2f27f9e455a4f
--- /dev/null
+++ b/doc/texinfo/mouse.texi
@@ -0,0 +1,35 @@
+@c
+@c This file is generated automatically by running "gmsh -doc".
+@c Do not edit by hand!
+@c
+
+@table @kbd
+@item Move
+- Highlight the entity under the mouse pointer and display its properties
+@item 
+- Resize a lasso zoom or a lasso (un)selection
+@item Left button
+- Rotate
+@item 
+- Select an entity
+@item 
+- Accept a lasso zoom or a lasso selection
+@item Ctrl+Left button
+Start a lasso zoom or a lasso (un)selection
+@item Middle button
+- Zoom
+@item 
+- Unselect an entity
+@item 
+- Accept a lasso zoom or a lasso unselection
+@item Ctrl+Middle button
+Orthogonalize display
+@item Right button
+- Pan
+@item 
+- Cancel a lasso zoom or a lasso (un)selection
+@item 
+- Pop-up menu on post-processing view button
+@item Ctrl+Right button
+Reset to default viewpoint
+@end table
diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi
index b3de4c1edf1c88a38c373471f01ca69316a55610..ced9830cba53395abd42a60f6c206469c7963a80 100644
--- a/doc/texinfo/opt_general.texi
+++ b/doc/texinfo/opt_general.texi
@@ -541,12 +541,12 @@ Saved in: @code{General.OptionsFileName}
 
 @item General.GraphicsFontSize
 Size of the font in the graphic window@*
-Default value: @code{17}@*
+Default value: @code{15}@*
 Saved in: @code{General.OptionsFileName}
 
 @item General.GraphicsFontSizeTitle
 Size of the font in the graphic window for titles@*
-Default value: @code{19}@*
+Default value: @code{18}@*
 Saved in: @code{General.OptionsFileName}
 
 @item General.GraphicsHeight
@@ -980,7 +980,7 @@ Default value: @code{150}@*
 Saved in: @code{General.SessionFileName}
 
 @item General.Stereo
-Use stereo rendering : use command line gmsh -string ``General.Stereo=1;''@*
+Use stereo rendering@*
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
diff --git a/doc/texinfo/opt_geometry.texi b/doc/texinfo/opt_geometry.texi
index 0bb64ed68dca0c3ab91d22a4b3972a02e3eb32a6..d534c6f1a02eb4817443fb1b6ea0605623f9d5fb 100644
--- a/doc/texinfo/opt_geometry.texi
+++ b/doc/texinfo/opt_geometry.texi
@@ -179,6 +179,11 @@ Global geometry scaling factor@*
 Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Geometry.OrientedPhysicals
+Use sign of elementary entity in physical definition as orientation indicator@*
+Default value: @code{1}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Geometry.SnapX
 Snapping grid spacing along the X-axis@*
 Default value: @code{0.1}@*
diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi
index 48a583c12e41cf162961fe1d21cda6dfa134667e..f6b790c44047023c808b13d78ed358ab4897ef9a 100644
--- a/doc/texinfo/opt_mesh.texi
+++ b/doc/texinfo/opt_mesh.texi
@@ -44,6 +44,11 @@ Apply Bunin optimization on quad meshes (the parameter is the maximal size of a
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Mesh.Lloyd
+Apply lloyd optimization on surface meshes@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Mesh.CgnsImportOrder
 Enable the creation of high-order mesh from CGNS structured meshes.(1, 2, 4, 8, ...)@*
 Default value: @code{1}@*
@@ -489,6 +494,11 @@ Apply recombination algorithm to all surfaces, ignoring per-surface spec@*
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Mesh.Recombine3DAll
+Apply recombination3D algorithm to all volumes, ignoring per-volume spec@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Mesh.RemeshAlgorithm
 Remeshing algorithm (0=no split, 1=automatic, 2=automatic only with metis)@*
 Default value: @code{0}@*
diff --git a/doc/texinfo/opt_plugin.texi b/doc/texinfo/opt_plugin.texi
index 1589016a4703170f6bdfe01cf2ee2d98fb2aa87f..de4cccdcb1a5e1358e455dfeddeacef459a7e678 100644
--- a/doc/texinfo/opt_plugin.texi
+++ b/doc/texinfo/opt_plugin.texi
@@ -399,6 +399,8 @@ Default value: @code{0}
 Default value: @code{0}
 @item Visible
 Default value: @code{1}
+@item Dimension
+Default value: @code{-1}
 @item View
 Default value: @code{-1}
 @end table
@@ -564,6 +566,8 @@ Default value: @code{1}
 Default value: @code{2}
 @item PostProcessSimplify
 Default value: @code{1}
+@item ReductionHeuristic
+Default value: @code{1}
 @end table
 
 @item Plugin(HomologyPostProcessing)
@@ -604,11 +608,11 @@ Default value: @code{0}
 @end table
 
 @item Plugin(Integrate)
-Plugin(Integrate) integrates scalar fields over all the elements in the view `View', as well as the circulation/flux of vector fields over line/surface elements.
+Plugin(Integrate) integrates a scalar field over all the elements of the view `View' (if `Dimension' < 0), or over all elements of the prescribed dimension (if `Dimension' > 0). If the field is a vector field,the circulation/flux of the field over line/surface elements is calculated.
 
 If `View' < 0, the plugin is run on the current view.
 
-Plugin(Integrate) creates one new view.If `OverTime' = 1 , the plugin integrates the scalar view over time instead of over space.
+If `OverTime' = 1 , the plugin integrates the scalar view over time instead of over space.
 
 Plugin(Integrate) creates one new view.
 Numeric options:
@@ -617,6 +621,8 @@ Numeric options:
 Default value: @code{-1}
 @item OverTime
 Default value: @code{-1}
+@item Dimension
+Default value: @code{-1}
 @end table
 
 @item Plugin(Isosurface)
@@ -706,7 +712,7 @@ If `TimeStep' < 0, the plugin extracts data from all the time steps in the view.
 
 If `View' < 0, the plugin is run on the current view.
 
-Plugin(MathEval) creates one new view.If `PhysicalRegion' < 0, the plugin is runon all physical regions.
+Plugin(MathEval) creates one new view.If `PhysicalRegion' < 0, the plugin is run on all physical regions.
 
 Plugin(MathEval) creates one new view.
 String options:
@@ -1024,6 +1030,18 @@ Default value: @code{-1}
 Default value: @code{-1}
 @end table
 
+@item Plugin(SimplePartition)
+Plugin(SimplePartition) partitions the current mesh into `NumSlices' slices, along the X-, Y- or Z-axis depending on the value of `Direction' (0,1,2). The plugin creates partition boundaries if `CreateBoundaries' is set.
+Numeric options:
+@table @code
+@item NumSlices
+Default value: @code{4}
+@item Direction
+Default value: @code{0}
+@item CreateBoundaries
+Default value: @code{1}
+@end table
+
 @item Plugin(Skin)
 Plugin(Skin) extracts the boundary (skin) of the view `View'. If `Visible' is set, the plugin only extracts the skin of visible entities.
 
diff --git a/doc/texinfo/opt_solver.texi b/doc/texinfo/opt_solver.texi
index 187511b6f2a90805abe42f6621eecf6f4b3e7bfe..7a6aab54e9964c17e339dd759738ba811a68fcdc 100644
--- a/doc/texinfo/opt_solver.texi
+++ b/doc/texinfo/opt_solver.texi
@@ -101,7 +101,7 @@ Saved in: @code{General.OptionsFileName}
 
 @item Solver.AutoSaveDatabase
 Automatically save database after each computation@*
-Default value: @code{1}@*
+Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Solver.AutoMesh
diff --git a/doc/texinfo/opt_view.texi b/doc/texinfo/opt_view.texi
index 6eefbbbcfe5214c3b172dc4271e7bcf545a7a885..36f3dd009d99a61a457ed153b3692c47e67520df 100644
--- a/doc/texinfo/opt_view.texi
+++ b/doc/texinfo/opt_view.texi
@@ -145,7 +145,7 @@ Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
 @item View.AutoPosition
-Position the scale or 2D plot automatically (0: manual, 1: automatic, 2: top left, 3: top right, 4: bottom left, 5: bottom right, 6: top, 7: bottom, 8: left, 9: right, 10: top 1/3)@*
+Position the scale or 2D plot automatically (0: manual, 1: automatic, 2: top left, 3: top right, 4: bottom left, 5: bottom right, 6: top, 7: bottom, 8: left, 9: right, 10: full, 11: top third)@*
 Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
diff --git a/doc/texinfo/shortcuts.texi b/doc/texinfo/shortcuts.texi
new file mode 100644
index 0000000000000000000000000000000000000000..5f9f4944e4d8a3f85b5c873f04f51107312e5900
--- /dev/null
+++ b/doc/texinfo/shortcuts.texi
@@ -0,0 +1,147 @@
+@c
+@c This file is generated automatically by running "gmsh -doc".
+@c Do not edit by hand!
+@c
+
+@table @kbd
+@item Left arrow
+Go to previous time step
+@item Right arrow
+Go to next time step
+@item Up arrow
+Make previous view visible
+@item Down arrow
+Make next view visible
+@item 0
+Reload project file
+@item 1 or F1
+Mesh lines
+@item 2 or F2
+Mesh surfaces
+@item 3 or F3
+Mesh volumes
+@item Escape
+Cancel lasso zoom/selection, toggle mouse selection ON/OFF
+@item g
+Go to geometry module
+@item m
+Go to mesh module
+@item p
+Go to post-processing module
+@item s
+Go to solver module
+@item Shift+a
+Bring all windows to front
+@item Shift+g
+Show geometry options
+@item Shift+m
+Show mesh options
+@item Shift+o
+Show general options
+@item Shift+p
+Show post-processing options
+@item Shift+s
+Show solver options
+@item Shift+u
+Show post-processing view plugins
+@item Shift+w
+Show post-processing view options
+@item Shift+Escape
+Enable full mouse selection
+@item Ctrl+i
+Show statistics window
+@item Ctrl+d
+Attach/detach menu
+@item Ctrl+l
+Show message console
+@item Ctrl+m
+Minimize window
+@item Ctrl+n
+Create new project file
+@item Ctrl+o
+Open project file
+@item Ctrl+q
+Quit
+@item Ctrl+r
+Rename project file
+@item Ctrl+s
+Save file as
+@item Shift+Ctrl+c
+Show clipping plane window
+@item Shift+Ctrl+m
+Show manipulator window
+@item Shift+Ctrl+n
+Show option window
+@item Shift+Ctrl+o
+Merge file(s)
+@item Shift+Ctrl+s
+Save mesh in default format
+@item Shift+Ctrl+u
+Show plugin window
+@item Shift+Ctrl+v
+Show visibility window
+@item Alt+a
+Loop through axes modes
+@item Alt+b
+Hide/show bounding boxes
+@item Alt+c
+Loop through predefined color schemes
+@item Alt+e
+Hide/Show element outlines for visible post-pro views
+@item Alt+f
+Change redraw mode (fast/full)
+@item Alt+h
+Hide/show all post-processing views
+@item Alt+i
+Hide/show all post-processing view scales
+@item Alt+l
+Hide/show geometry lines
+@item Alt+m
+Toggle visibility of all mesh entities
+@item Alt+n
+Hide/show all post-processing view annotations
+@item Alt+o
+Change projection mode (orthographic/perspective)
+@item Alt+p
+Hide/show geometry points
+@item Alt+r
+Loop through range modes for visible post-pro views
+@item Alt+s
+Hide/show geometry surfaces
+@item Alt+t
+Loop through interval modes for visible post-pro views
+@item Alt+v
+Hide/show geometry volumes
+@item Alt+w
+Enable/disable all lighting
+@item Alt+x
+Set X view
+@item Alt+y
+Set Y view
+@item Alt+z
+Set Z view
+@item Alt+Shift+a
+Hide/show small axes
+@item Alt+Shift+b
+Hide/show mesh volume faces
+@item Alt+Shift+d
+Hide/show mesh surface faces
+@item Alt+Shift+l
+Hide/show mesh lines
+@item Alt+Shift+o
+Adjust projection parameters
+@item Alt+Shift+p
+Hide/show mesh points
+@item Alt+Shift+s
+Hide/show mesh surface edges
+@item Alt+Shift+v
+Hide/show mesh volume edges
+@item Alt+Shift+w
+Reverse all mesh normals
+@item Alt+Shift+x
+Set -X view
+@item Alt+Shift+y
+Set -Y view
+@item Alt+Shift+z
+Set -Z view
+@end table