diff --git a/Common/Context.h b/Common/Context.h
index ff17a1187a018fd39836199009e47414f931d9eb..601aecd38377bf241c9c2d3a7b55a3e4cdd885e3 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -252,6 +252,8 @@ class CTX {
     int posElementary, posElement, posGamma, posEta, posRho, posDisto;
     int compositeWindows, deleteTmpFiles, background;
     int width, height;
+    double parameter, parameterFirst, parameterLast, parameterSteps;
+    std::string parameterCommand;
   } print;
   // color options
   struct{
diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp
index 83d3a653faed2a9118b76f4206f7500501c1d49f..7323f80a0aba9ecf22d50a86719230c6e1d557d3 100644
--- a/Common/CreateFile.cpp
+++ b/Common/CreateFile.cpp
@@ -10,6 +10,7 @@
 #include "StringUtils.h"
 #include "Context.h"
 #include "Options.h"
+#include "OpenFile.h"
 #include "OS.h"
 
 #if defined(HAVE_OPENGL)
@@ -208,6 +209,19 @@ static PixelBuffer *GetCompositePixelBuffer(GLenum format, GLenum type)
 }
 #endif
 
+static void change_print_parameter(int frame)
+{
+  double first = CTX::instance()->print.parameterFirst;
+  double last = CTX::instance()->print.parameterLast;
+  double steps = CTX::instance()->print.parameterSteps;
+  if(steps <= 0) steps = 1;
+  double step = (last - first) / steps;
+  double v = first + frame * step * CTX::instance()->post.animStep;
+  Msg::Info("Setting Print.Parameter = %g", v);
+  opt_print_parameter(0, GMSH_SET | GMSH_GUI, v);
+  ParseString(CTX::instance()->print.parameterCommand);
+}
+
 void CreateOutputFile(const std::string &fileName, int format, bool redraw)
 {
   std::string name = fileName;
@@ -510,66 +524,93 @@ void CreateOutputFile(const std::string &fileName, int format, bool redraw)
 
 #if defined(HAVE_MPEG_ENCODE)
   case FORMAT_MPEG:
+  case FORMAT_MPEG_PREVIEW:
     {
       std::string parFileName = CTX::instance()->homeDir + ".gmsh-mpeg_encode.par";
-      FILE *fp = Fopen(parFileName.c_str(), "w");
-      if(!fp){
-        Msg::Error("Unable to open file '%s'", parFileName.c_str());
-        error = true;
-        break;
+      FILE *fp = 0;
+      if(format != FORMAT_MPEG_PREVIEW){
+        fp = Fopen(parFileName.c_str(), "w");
+        if(!fp){
+          Msg::Error("Unable to open file '%s'", parFileName.c_str());
+          error = true;
+          break;
+        }
+      }
+
+      int numViews = (int)opt_post_nb_views(0, GMSH_GET, 0);
+      int numSteps = 0;
+      int cycle = CTX::instance()->post.animCycle;
+      if(cycle == 0){
+        for(int i = 0; i < numViews; i++){
+          if(opt_view_visible(i, GMSH_GET, 0))
+            numSteps = std::max(numSteps,
+                                (int)opt_view_nb_non_empty_timestep(i, GMSH_GET, 0));
+        }
+      }
+      else if(cycle == 1){
+        numSteps = numViews;
       }
-      int numViews = (int)opt_post_nb_views(0, GMSH_GET, 0), numSteps = 0;
-      for(int i = 0; i < numViews; i++){
-        if(opt_view_visible(i, GMSH_GET, 0))
-          numSteps = std::max(numSteps,
-                              (int)opt_view_nb_non_empty_timestep(i, GMSH_GET, 0));
+      else{
+        numSteps = CTX::instance()->print.parameterSteps;
       }
+
       std::vector<std::string> frames;
-      for(int i = 0; i < (CTX::instance()->post.animCycle ? numViews : numSteps);
-          i += CTX::instance()->post.animStep){
+      for(int i = 0; i < numSteps; i += CTX::instance()->post.animStep){
         char tmp[256];
         sprintf(tmp, ".gmsh-%06d.ppm", (int)frames.size());
         frames.push_back(tmp);
       }
-      status_play_manual(!CTX::instance()->post.animCycle, 0, false);
-      for(unsigned int i = 0; i < frames.size(); i++){
-        CreateOutputFile(CTX::instance()->homeDir + frames[i], FORMAT_PPM, false);
-        status_play_manual(!CTX::instance()->post.animCycle,
-                           CTX::instance()->post.animStep, false);
-      }
-      int repeat = (int)(CTX::instance()->post.animDelay * 24);
-      if(repeat < 1) repeat = 1;
-      std::string pattern("I");
-      // including P frames would lead to smaller files, but the quality
-      // degradation is perceptible:
-      // for(int i = 1; i < repeat; i++) pattern += "P";
-      fprintf(fp, "PATTERN %s\nBASE_FILE_FORMAT PPM\nGOP_SIZE %d\n"
-              "SLICES_PER_FRAME 1\nPIXEL FULL\nRANGE 10\n"
-              "PSEARCH_ALG EXHAUSTIVE\nBSEARCH_ALG CROSS2\n"
-              "IQSCALE 1\nPQSCALE 1\nBQSCALE 25\nREFERENCE_FRAME DECODED\n"
-              "OUTPUT %s\nINPUT_CONVERT *\nINPUT_DIR %s\nINPUT\n",
-              pattern.c_str(), repeat, name.c_str(),
-              CTX::instance()->homeDir.c_str());
+      if(cycle != 2)
+        status_play_manual(!cycle, 0, false);
+      else
+        change_print_parameter(0);
       for(unsigned int i = 0; i < frames.size(); i++){
-        fprintf(fp, "%s", frames[i].c_str());
-        if(repeat > 1) fprintf(fp, " [1-%d]", repeat);
-        fprintf(fp, "\n");
-      }
-      fprintf(fp, "END_INPUT\n");
-      fclose(fp);
-      extern int mpeg_encode_main(int, char**);
-      char *args[] = {(char*)"gmsh", (char*)parFileName.c_str()};
-      try{
-        mpeg_encode_main(2, args);
-      }
-      catch (const char *msg){
-        Msg::Error("%s", msg);
-        error = true;
+        if(fp)
+          CreateOutputFile(CTX::instance()->homeDir + frames[i], FORMAT_PPM, false);
+        if(cycle != 2)
+          status_play_manual(!cycle, CTX::instance()->post.animStep, false);
+        else
+          change_print_parameter(i + 1);
+        if(!fp){
+          drawContext::global()->draw();
+          SleepInSeconds(CTX::instance()->post.animDelay);
+        }
       }
-      if(opt_print_delete_tmp_files(0, GMSH_GET, 0)){
-        UnlinkFile(parFileName);
-        for(unsigned int i = 0; i < frames.size(); i++)
-          UnlinkFile(CTX::instance()->homeDir + frames[i]);
+      if(fp){
+        int repeat = (int)(CTX::instance()->post.animDelay * 24);
+        if(repeat < 1) repeat = 1;
+        std::string pattern("I");
+        // including P frames would lead to smaller files, but the quality
+        // degradation is perceptible:
+        // for(int i = 1; i < repeat; i++) pattern += "P";
+        fprintf(fp, "PATTERN %s\nBASE_FILE_FORMAT PPM\nGOP_SIZE %d\n"
+                "SLICES_PER_FRAME 1\nPIXEL FULL\nRANGE 10\n"
+                "PSEARCH_ALG EXHAUSTIVE\nBSEARCH_ALG CROSS2\n"
+                "IQSCALE 1\nPQSCALE 1\nBQSCALE 25\nREFERENCE_FRAME DECODED\n"
+                "OUTPUT %s\nINPUT_CONVERT *\nINPUT_DIR %s\nINPUT\n",
+                pattern.c_str(), repeat, name.c_str(),
+                CTX::instance()->homeDir.c_str());
+        for(unsigned int i = 0; i < frames.size(); i++){
+          fprintf(fp, "%s", frames[i].c_str());
+          if(repeat > 1) fprintf(fp, " [1-%d]", repeat);
+          fprintf(fp, "\n");
+        }
+        fprintf(fp, "END_INPUT\n");
+        fclose(fp);
+        extern int mpeg_encode_main(int, char**);
+        char *args[] = {(char*)"gmsh", (char*)parFileName.c_str()};
+        try{
+          mpeg_encode_main(2, args);
+        }
+        catch (const char *msg){
+          Msg::Error("%s", msg);
+          error = true;
+        }
+        if(opt_print_delete_tmp_files(0, GMSH_GET, 0)){
+          UnlinkFile(parFileName);
+          for(unsigned int i = 0; i < frames.size(); i++)
+            UnlinkFile(CTX::instance()->homeDir + frames[i]);
+        }
       }
     }
     break;
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 80bdfe212fa681ae8ec340eeed9ced8516b702d0..94b265692e232ba868b75230c62750d340cfff1c 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -266,6 +266,10 @@ StringXString ViewOptions_String[] = {
 } ;
 
 StringXString PrintOptions_String[] = {
+  { F|O, "ParameterCommand" , opt_print_parameter_command ,
+    "View.Clip=1; General.Clip0D=Print.Parameter;" ,
+    "Command parsed when the print parameter is changed" },
+
   { 0, 0 , 0 , "" , 0 }
 } ;
 
@@ -874,7 +878,8 @@ StringXNumber MeshOptions_Number[] = {
   { F|O, "Binary" , opt_mesh_binary , 0. ,
     "Write mesh files in binary format (if possible)" },
   { F|O, "Bunin" , opt_mesh_bunin , 0. ,
-    "Apply Bunin optimization on quad meshes (the parameter is the maximal size of a cavity that may be remeshed)" },
+    "Apply Bunin optimization on quad meshes (the parameter is the maximal size of "
+    "a cavity that may be remeshed)" },
   { F|O, "Lloyd" , opt_mesh_lloyd , 0. ,
     "Apply lloyd optimization on surface meshes" },
   { F|O, "SmoothCrossField" , opt_mesh_smooth_cross_field , 0. ,
@@ -1517,6 +1522,15 @@ StringXNumber ViewOptions_Number[] = {
 } ;
 
 StringXNumber PrintOptions_Number[] = {
+  { F|O, "Parameter" , opt_print_parameter , 0. ,
+    "Current value of the print parameter" },
+  { F|O, "ParameterFirst" , opt_print_parameter_first , -1. ,
+    "First value of print parameter in loop" },
+  { F|O, "ParameterLast" , opt_print_parameter_last , 1. ,
+    "Last value of print parameter in loop" },
+  { F|O, "ParameterSteps" , opt_print_parameter_steps , 24 ,
+    "Number of steps in loop over print parameter" },
+
   { F|O, "Background" , opt_print_background , 0. ,
     "Print background?" },
 
diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h
index 16632e84c2f095ab69f7a19f9da0eaa96105ca35..6226ccd540155cbae736be661e6933f367a91ba5 100644
--- a/Common/GmshDefines.h
+++ b/Common/GmshDefines.h
@@ -49,6 +49,7 @@
 #define FORMAT_PLY2  40
 #define FORMAT_CELUM 41
 #define FORMAT_SU2   42
+#define FORMAT_MPEG_PREVIEW 43
 
 // Element types
 #define TYPE_PNT     1
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 289e85c1edaedc32a91380e31d8a8bf0fee62c31..796e342d5de77f54effa730343c76870b7cee35b 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1868,6 +1868,13 @@ std::string opt_view_attributes(OPT_ARGS_STR)
 #endif
 }
 
+std::string opt_print_parameter_command(OPT_ARGS_STR)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->print.parameterCommand = val;
+  return CTX::instance()->print.parameterCommand;
+}
+
 // Numeric option routines
 
 double opt_general_initial_context(OPT_ARGS_NUM)
@@ -6213,8 +6220,12 @@ double opt_post_anim_delay(OPT_ARGS_NUM)
 
 double opt_post_anim_cycle(OPT_ARGS_NUM)
 {
-  if(action & GMSH_SET)
+  if(action & GMSH_SET){
     CTX::instance()->post.animCycle = (int)val;
+    if(CTX::instance()->post.animCycle < 0 ||
+       CTX::instance()->post.animCycle > 2)
+      CTX::instance()->post.animCycle = 0;
+  }
 #if defined(HAVE_FLTK)
   if(FlGui::available() && (action & GMSH_GUI))
     FlGui::instance()->options->post.butt[0]->value
@@ -8619,6 +8630,34 @@ double opt_print_width(OPT_ARGS_NUM)
   return CTX::instance()->print.width;
 }
 
+double opt_print_parameter(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->print.parameter = val;
+  return CTX::instance()->print.parameter;
+}
+
+double opt_print_parameter_first(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->print.parameterFirst = val;
+  return CTX::instance()->print.parameterFirst;
+}
+
+double opt_print_parameter_last(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->print.parameterLast = val;
+  return CTX::instance()->print.parameterLast;
+}
+
+double opt_print_parameter_steps(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->print.parameterSteps = val;
+  return CTX::instance()->print.parameterSteps;
+}
+
 // Color option routines
 
 #if defined(HAVE_FLTK)
diff --git a/Common/Options.h b/Common/Options.h
index 87c0dbe202da82d275de4674e7d2a4ed2a2cd91e..e2b3dd6cbd3b2769ca9ac9cc540b3db8dc69982a 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -109,6 +109,7 @@ std::string opt_view_stipple7(OPT_ARGS_STR);
 std::string opt_view_stipple8(OPT_ARGS_STR);
 std::string opt_view_stipple9(OPT_ARGS_STR);
 std::string opt_view_attributes(OPT_ARGS_STR);
+std::string opt_print_parameter_command(OPT_ARGS_STR);
 
 // NUMBERS
 
@@ -668,6 +669,10 @@ double opt_print_composite_windows(OPT_ARGS_NUM);
 double opt_print_delete_tmp_files(OPT_ARGS_NUM);
 double opt_print_height(OPT_ARGS_NUM);
 double opt_print_width(OPT_ARGS_NUM);
+double opt_print_parameter(OPT_ARGS_NUM);
+double opt_print_parameter_first(OPT_ARGS_NUM);
+double opt_print_parameter_last(OPT_ARGS_NUM);
+double opt_print_parameter_steps(OPT_ARGS_NUM);
 
 // COLORS
 
diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp
index 3bf30020ffc2602f7a2c569bdbd9cf126a90c331..168816d691185cd60207cbf0a0979af238d93983 100644
--- a/Fltk/fileDialogs.cpp
+++ b/Fltk/fileDialogs.cpp
@@ -367,31 +367,59 @@ int mpegFileDialog(const char *name)
 {
   struct _mpegFileDialog{
     Fl_Window *window;
-    Fl_Round_Button *b[2];
+    Fl_Round_Button *b[3];
+    Fl_Group *param;
     Fl_Check_Button *c[3];
-    Fl_Value_Input *v[2];
-    Fl_Button *ok, *cancel;
+    Fl_Input *p;
+    Fl_Value_Input *v[5];
+    Fl_Group *buttons;
+    Fl_Button *ok, *preview, *cancel;
   };
   static _mpegFileDialog *dialog = NULL;
 
   if(!dialog){
     dialog = new _mpegFileDialog;
-    int h = 3 * WB + 8 * BH, w = 2 * BB + 3 * WB, y = WB;
+    int h = 4 * WB + 11 * BH, w = 3 * BB + 4 * WB, y = WB;
+    int ww = w - 2 * WB;
     dialog->window = new Fl_Double_Window(w, h, "MPEG Options");
     dialog->window->box(GMSH_WINDOW_BOX);
     dialog->window->set_modal();
     {
-      Fl_Group *o = new Fl_Group(WB, y, 2 * BB + WB, 2 * BH);
+      Fl_Group *o = new Fl_Group(WB, y, ww, 3 * BH);
       dialog->b[0] = new Fl_Round_Button
-        (WB, y, 2 * BB + WB, BH, "Cycle through time steps"); y += BH;
+        (WB, y, ww, BH, "Cycle through time steps"); y += BH;
       dialog->b[0]->type(FL_RADIO_BUTTON);
       dialog->b[1] = new Fl_Round_Button
-        (WB, y, 2 * BB + WB, BH, "Cycle through views"); y += BH;
+        (WB, y, ww, BH, "Cycle through views"); y += BH;
       dialog->b[1]->type(FL_RADIO_BUTTON);
+      dialog->b[2] = new Fl_Round_Button
+        (WB, y, ww, BH, "Loop over print parameter value"); y += BH;
+      dialog->b[2]->type(FL_RADIO_BUTTON);
       o->end();
     }
+
+    int ww2 = (2 * BB + WB) / 4;
+
+    dialog->param = new Fl_Group(WB, y, ww, 2 * BH);
+    dialog->p = new Fl_Input(WB, y, ww, BH); y += BH;
+    dialog->p->align(FL_ALIGN_RIGHT);
+
+
+    dialog->v[2] = new Fl_Value_Input(WB, y, ww2, BH);
+    dialog->v[3] = new Fl_Value_Input(WB + ww2, y, ww2, BH);
+    dialog->v[4] = new Fl_Value_Input(WB + 2 * ww2, y, 2 * BB + WB - 3 * ww2, BH,
+                                      "First / Last / Steps");
+    dialog->v[4]->align(FL_ALIGN_RIGHT);
+    dialog->v[4]->minimum(1);
+    dialog->v[4]->maximum(500);
+    dialog->v[4]->step(1);
+    y += BH;
+    dialog->param->end();
+
+    y += WB;
+
     dialog->v[0] = new Fl_Value_Input
-      (WB, y, BB / 2, BH, "Frame duration (in sec.)"); y += BH;
+      (WB, y, ww2, BH, "Frame duration (in seconds)"); y += BH;
     dialog->v[0]->minimum(1. / 24.);
     dialog->v[0]->maximum(2.);
     dialog->v[0]->step(1. / 24.);
@@ -399,37 +427,52 @@ int mpegFileDialog(const char *name)
     dialog->v[0]->align(FL_ALIGN_RIGHT);
 
     dialog->v[1] = new Fl_Value_Input
-      (WB, y, BB / 2, BH, "Steps between frames"); y += BH;
+      (WB, y, ww2, BH, "Steps between frames"); y += BH;
     dialog->v[1]->minimum(1);
     dialog->v[1]->maximum(100);
     dialog->v[1]->step(1);
     dialog->v[1]->align(FL_ALIGN_RIGHT);
 
     dialog->c[0] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Print background"); y += BH;
+      (WB, y, ww, BH, "Print background"); y += BH;
     dialog->c[0]->type(FL_TOGGLE_BUTTON);
 
     dialog->c[1] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
+      (WB, y, ww, BH, "Composite all window tiles"); y += BH;
     dialog->c[1]->type(FL_TOGGLE_BUTTON);
 
     dialog->c[2] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Delete temporary files"); y += BH;
+      (WB, y, ww, BH, "Delete temporary files"); y += BH;
     dialog->c[2]->type(FL_TOGGLE_BUTTON);
 
+    dialog->buttons = new Fl_Group(WB, y + WB, ww, BH);
     dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK");
-    dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel");
+    dialog->preview = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Preview");
+    dialog->cancel = new Fl_Button(3 * WB + 2 * BB, y + WB, BB, BH, "Cancel");
+    dialog->buttons->end();
+
     dialog->window->end();
     dialog->window->hotspot(dialog->window);
   }
 
-  dialog->b[0]->value(!CTX::instance()->post.animCycle);
-  dialog->b[1]->value(CTX::instance()->post.animCycle);
+  dialog->b[0]->value(CTX::instance()->post.animCycle == 0);
+  dialog->b[1]->value(CTX::instance()->post.animCycle == 1);
+  dialog->b[2]->value(CTX::instance()->post.animCycle == 2);
   dialog->v[0]->value(CTX::instance()->post.animDelay);
   dialog->v[1]->value(CTX::instance()->post.animStep);
   dialog->c[0]->value(CTX::instance()->print.background);
   dialog->c[1]->value(CTX::instance()->print.compositeWindows);
   dialog->c[2]->value(CTX::instance()->print.deleteTmpFiles);
+
+  dialog->p->value(CTX::instance()->print.parameterCommand.c_str());
+  if(dialog->b[2]->value())
+    dialog->param->activate();
+  else
+    dialog->param->deactivate();
+  dialog->v[2]->value(CTX::instance()->print.parameterFirst);
+  dialog->v[3]->value(CTX::instance()->print.parameterLast);
+  dialog->v[4]->value(CTX::instance()->print.parameterSteps);
+
   dialog->window->show();
 
   while(dialog->window->shown()){
@@ -437,16 +480,32 @@ int mpegFileDialog(const char *name)
     for (;;) {
       Fl_Widget* o = Fl::readqueue();
       if (!o) break;
-      if (o == dialog->ok) {
-        opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value());
+      if (o == dialog->b[0] || o == dialog->b[1] || o == dialog->b[2]) {
+        if(dialog->b[2]->value())
+          dialog->param->activate();
+        else
+          dialog->param->deactivate();
+      }
+      if (o == dialog->ok || o == dialog->preview) {
+        opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value() ? 2 :
+                            dialog->b[1]->value() ? 1 : 0);
+        opt_print_parameter_command(0, GMSH_SET | GMSH_GUI, dialog->p->value());
+        opt_print_parameter_first(0, GMSH_SET | GMSH_GUI, dialog->v[2]->value());
+        opt_print_parameter_last(0, GMSH_SET | GMSH_GUI, dialog->v[3]->value());
+        opt_print_parameter_steps(0, GMSH_SET | GMSH_GUI, dialog->v[4]->value());
         opt_post_anim_delay(0, GMSH_SET | GMSH_GUI, dialog->v[0]->value());
         opt_post_anim_step(0, GMSH_SET | GMSH_GUI, (int)dialog->v[1]->value());
         opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->c[0]->value());
         opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->c[1]->value());
         opt_print_delete_tmp_files(0, GMSH_SET | GMSH_GUI, (int)dialog->c[2]->value());
-        CreateOutputFile(name, FORMAT_MPEG);
-        dialog->window->hide();
-        return 1;
+        int format = (o == dialog->preview) ? FORMAT_MPEG_PREVIEW : FORMAT_MPEG;
+        dialog->buttons->deactivate();
+        CreateOutputFile(name, format);
+        dialog->buttons->activate();
+        if(o == dialog->ok){
+          dialog->window->hide();
+          return 1;
+        }
       }
       if (o == dialog->window || o == dialog->cancel){
         dialog->window->hide();
diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp
index 2a5f130feb652c2f75fc8e6fee52421d16f1dd43..48bc840a2c556df466aa4066cf69a566a5258654 100644
--- a/Fltk/optionWindow.cpp
+++ b/Fltk/optionWindow.cpp
@@ -2689,7 +2689,7 @@ optionWindow::optionWindow(int deltaFontSize)
         solver.input[0]->callback(solver_options_ok_cb);
 
         solver.value[0] = new Fl_Value_Input
-          (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Timeout (in sec.)");
+          (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Timeout (in seconds)");
         solver.value[0]->align(FL_ALIGN_RIGHT);
         solver.value[0]->callback(solver_options_ok_cb);
 
@@ -2728,7 +2728,7 @@ optionWindow::optionWindow(int deltaFontSize)
       post.choice[0]->callback(post_options_ok_cb);
 
       post.value[0] = new Fl_Value_Input
-        (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Frame duration (in sec.)");
+        (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Frame duration (in seconds)");
       post.value[0]->minimum(0);
       post.value[0]->maximum(10);
       post.value[0]->step(0.01);
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index e7928c98492f3a54abf31636603d3fe13c9e38b7..8459d77b2a8ed5864257207ae13006a24dcbab24 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -1641,10 +1641,10 @@ current file.
 @item Draw;
 Redraws the scene.
 
-@item DrawForceChanged;
-Same as @code{Draw}, but force the mesh and post-processing vertex
-arrays to be regenerated. Useful e.g. for creating animations with
-changing clipping planes, etc.
+@item SetChanged;
+Force the mesh and post-processing vertex arrays to be
+regenerated. Useful e.g. for creating animations with changing clipping
+planes, etc.
 
 @item BoundingBox;
 Recomputes the bounding box of the scene (which is normally computed only
diff --git a/doc/texinfo/opt_print.texi b/doc/texinfo/opt_print.texi
index 48137782749d4ffcf36915184bd83e07f79e8ff2..d0d45df1b7d84a33431ad57bf060acc4116eb6a0 100644
--- a/doc/texinfo/opt_print.texi
+++ b/doc/texinfo/opt_print.texi
@@ -4,6 +4,31 @@
 @c
 
 @ftable @code
+@item Print.ParameterCommand
+Command parsed when the print parameter is changed@*
+Default value: @code{"View.Clip=1; General.Clip0D=Print.Parameter;"}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Print.Parameter
+Current value of the print parameter@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Print.ParameterFirst
+First value of print parameter in loop@*
+Default value: @code{-1}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Print.ParameterLast
+Last value of print parameter in loop@*
+Default value: @code{1}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Print.ParameterSteps
+Number of steps in loop over print parameter@*
+Default value: @code{24}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Print.Background
 Print background?@*
 Default value: @code{0}@*
diff --git a/doc/texinfo/shortcuts.texi b/doc/texinfo/shortcuts.texi
index c765b63f0f0f0b5be6d91cac5bd0843b605c8398..3ee35863062d042915e47ae7a038c66c731afb81 100644
--- a/doc/texinfo/shortcuts.texi
+++ b/doc/texinfo/shortcuts.texi
@@ -134,8 +134,6 @@ Hide/show mesh volume faces
 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