diff --git a/Common/Context.h b/Common/Context.h
index ab570ec0080f58d69f0b4ef8930069f646500dc4..5fcef16d91dee9b0e8129c05089e8d450ae7bf80 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -219,13 +219,13 @@ class CTX {
   }solver;
   // print options 
   struct{
-    int fileFormat, epsQuality, epsBackground, epsCompress, epsPS3Shading;
+    int fileFormat, epsQuality, epsCompress, epsPS3Shading;
     int epsOcclusionCulling, epsBestRoot;
     double epsLineWidthFactor, epsPointSizeFactor;
     int jpegQuality, jpegSmoothing, geoLabels, text, texAsEquation;
     int gifDither, gifSort, gifInterlace, gifTransparent;
     int posElementary, posElement, posGamma, posEta, posRho, posDisto;
-    int compositeWindows, deleteTmpFiles;
+    int compositeWindows, deleteTmpFiles, background;
   } print;
   // color options
   struct{
diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp
index 7e14e143719b873b114bf336ac3884897d27f057..7495bd0875d3d3a777dabd6260e5b7fbf940db10 100644
--- a/Common/CreateFile.cpp
+++ b/Common/CreateFile.cpp
@@ -158,7 +158,7 @@ static PixelBuffer *GetCompositePixelBuffer(GLenum format, GLenum type)
 }
 #endif
 
-void CreateOutputFile(std::string fileName, int format)
+void CreateOutputFile(std::string fileName, int format, bool redraw)
 {
   if(fileName.empty())
     fileName = GetDefaultFileName(format);
@@ -166,17 +166,15 @@ void CreateOutputFile(std::string fileName, int format)
   int oldFormat = CTX::instance()->print.fileFormat;
   CTX::instance()->print.fileFormat = format;
   CTX::instance()->printing = 1;
+  bool error = false;
 
-  if(format != FORMAT_AUTO) 
+  if(redraw) 
     Msg::StatusBar(2, true, "Writing '%s'...", fileName.c_str());
 
-  bool printEndMessage = true;
-
   switch (format) {
 
   case FORMAT_AUTO:
-    CreateOutputFile(fileName, GuessFileFormatFromFileName(fileName));
-    printEndMessage = false;
+    CreateOutputFile(fileName, GuessFileFormatFromFileName(fileName), false);
     break;
     
   case FORMAT_OPT:
@@ -310,17 +308,12 @@ void CreateOutputFile(std::string fileName, int format)
       FILE *fp = fopen(fileName.c_str(), "wb");
       if(!fp){
         Msg::Error("Unable to open file '%s'", fileName.c_str());
+        error = true;
         break;
       }
 
-      int oldGradient = CTX::instance()->bgGradient;
-      if(format == FORMAT_GIF && CTX::instance()->print.gifTransparent)
-        CTX::instance()->bgGradient = 0;
-
       PixelBuffer *buffer = GetCompositePixelBuffer(GL_RGB, GL_UNSIGNED_BYTE);
 
-      CTX::instance()->bgGradient = oldGradient;
-
       if(format == FORMAT_PPM)
         create_ppm(fp, buffer);
       else if(format == FORMAT_YUV)
@@ -330,10 +323,7 @@ void CreateOutputFile(std::string fileName, int format)
                    CTX::instance()->print.gifDither,
                    CTX::instance()->print.gifSort,
                    CTX::instance()->print.gifInterlace,
-                   CTX::instance()->print.gifTransparent,
-                   CTX::instance()->unpackRed(CTX::instance()->color.bg),
-                   CTX::instance()->unpackGreen(CTX::instance()->color.bg), 
-                   CTX::instance()->unpackBlue(CTX::instance()->color.bg));
+                   CTX::instance()->print.gifTransparent);
       else if(format == FORMAT_JPEG)
         create_jpeg(fp, buffer, CTX::instance()->print.jpegQuality, 
                     CTX::instance()->print.jpegSmoothing);
@@ -355,6 +345,7 @@ void CreateOutputFile(std::string fileName, int format)
       FILE *fp = fopen(fileName.c_str(), "wb");
       if(!fp){
         Msg::Error("Unable to open file '%s'", fileName.c_str());
+        error = true;
         break;
       }
       std::string base = SplitFileName(fileName)[1];
@@ -362,9 +353,6 @@ void CreateOutputFile(std::string fileName, int format)
       GLint height = FlGui::instance()->getCurrentOpenglWindow()->h();
       GLint viewport[4] = {0, 0, width, height};
 
-      int oldGradient = CTX::instance()->bgGradient;
-      if(!CTX::instance()->print.epsBackground) CTX::instance()->bgGradient = 0;
-      
       PixelBuffer buffer(width, height, GL_RGB, GL_FLOAT);
       
       if(CTX::instance()->print.epsQuality == 0)
@@ -383,7 +371,7 @@ void CreateOutputFile(std::string fileName, int format)
         GL2PS_SIMPLE_LINE_OFFSET | GL2PS_SILENT |
         (CTX::instance()->print.epsOcclusionCulling ? GL2PS_OCCLUSION_CULL : 0) |
         (CTX::instance()->print.epsBestRoot ? GL2PS_BEST_ROOT : 0) |
-        (CTX::instance()->print.epsBackground ? GL2PS_DRAW_BACKGROUND : 0) |
+        (CTX::instance()->print.background ? GL2PS_DRAW_BACKGROUND : 0) |
         (CTX::instance()->print.epsCompress ? GL2PS_COMPRESS : 0) |
         (CTX::instance()->print.epsPS3Shading ? 0 : GL2PS_NO_PS3_SHADING);
 
@@ -417,7 +405,6 @@ void CreateOutputFile(std::string fileName, int format)
         res = gl2psEndPage();
       }
 
-      CTX::instance()->bgGradient = oldGradient;
       fclose(fp);
     }
     break;
@@ -429,6 +416,7 @@ void CreateOutputFile(std::string fileName, int format)
       FILE *fp = fopen(fileName.c_str(), "w");
       if(!fp){
         Msg::Error("Unable to open file '%s'", fileName.c_str());
+        error = true;
         break;
       }
       std::string base = SplitFileName(fileName)[1];
@@ -460,6 +448,7 @@ void CreateOutputFile(std::string fileName, int format)
       FILE *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), numSteps = 0;
@@ -475,10 +464,11 @@ void CreateOutputFile(std::string fileName, int format)
         sprintf(tmp, ".gmsh-%06d.ppm", (int)frames.size());
         frames.push_back(tmp);
       }
-      status_play_manual(!CTX::instance()->post.animCycle, 0);
+      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);
-        status_play_manual(!CTX::instance()->post.animCycle, CTX::instance()->post.animStep);
+        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;
@@ -505,8 +495,9 @@ void CreateOutputFile(std::string fileName, int format)
       try{
         mpeg_encode_main(2, args);
       }
-      catch (const char *error){
-        Msg::Error("mpeg_encode: %s", error);
+      catch (const char *msg){
+        Msg::Error("%s", msg);
+        error = true;
       }
       if(opt_print_delete_tmp_files(0, GMSH_GET, 0)){
         UnlinkFile(parFileName);
@@ -520,17 +511,18 @@ void CreateOutputFile(std::string fileName, int format)
 #endif
 
   default:
-    Msg::Error("Unknown output file format %d", format);
-    printEndMessage = false;
+    Msg::Error("Unknown output file format");
+    error = true;
     break;
   }
 
-  if(printEndMessage) Msg::StatusBar(2, true, "Done writing '%s'", fileName.c_str());
-
   CTX::instance()->print.fileFormat = oldFormat;
   CTX::instance()->printing = 0;
 
+  if(redraw && !error)
+    Msg::StatusBar(2, true, "Done writing '%s'", fileName.c_str());
+  
 #if defined(HAVE_OPENGL)
-  drawContext::global()->draw();
+  if(redraw) drawContext::global()->draw();
 #endif
 }
diff --git a/Common/CreateFile.h b/Common/CreateFile.h
index 37304f6be61a79d9e7cbd6ec15cc6dd06a755548..7b6d67883d3ccdb5845564bdd023784464c201e5 100644
--- a/Common/CreateFile.h
+++ b/Common/CreateFile.h
@@ -10,6 +10,6 @@
 
 int GuessFileFormatFromFileName(std::string fileName);
 std::string GetDefaultFileName(int format);
-void CreateOutputFile(std::string fileName, int format);
+void CreateOutputFile(std::string fileName, int format, bool redraw=true);
 
 #endif
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 016a7600023833cf35b03b6e89f713d16bbabaad..075cf12384be46e48aa9ef54f55b4ab1e833884c 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1366,14 +1366,15 @@ StringXNumber ViewOptions_Number[] = {
 } ;
 
 StringXNumber PrintOptions_Number[] = {
+  { F|O, "Background" , opt_print_background , 0. ,
+    "Print background?" },
+
   { F|O, "CompositeWindows" , opt_print_composite_windows , 0. ,
     "Composite all window tiles in the same output image (for bitmap output only)" },
 
   { F|O, "DeleteTemporaryFiles" , opt_print_delete_tmp_files , 1. ,
     "Delete temporary files used during printing" },
 
-  { F|O, "EpsBackground" , opt_print_eps_background , 1. ,
-    "Save image background in PostScript/PDF output" },
   { F|O, "EpsBestRoot" , opt_print_eps_best_root , 1. ,
     "Try to minimize primitive splitting in BSP tree sorted PostScript/PDF output" },
   { F|O, "EpsCompress" , opt_print_eps_compress , 0. ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index e61cd42844c291ea3133d87eb4bfbb0b2b6eb48e..58bfd6e0abdfc5aeac48a8fbab81e0b03224a11a 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -7746,13 +7746,6 @@ double opt_print_eps_best_root(OPT_ARGS_NUM)
   return CTX::instance()->print.epsBestRoot;
 }
 
-double opt_print_eps_background(OPT_ARGS_NUM)
-{
-  if(action & GMSH_SET)
-    CTX::instance()->print.epsBackground = (int)val;
-  return CTX::instance()->print.epsBackground;
-}
-
 double opt_print_eps_line_width_factor(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
@@ -7858,6 +7851,13 @@ double opt_print_gif_transparent(OPT_ARGS_NUM)
   return CTX::instance()->print.gifTransparent;
 }
 
+double opt_print_background(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->print.background = (int)val;
+  return CTX::instance()->print.background;
+}
+
 double opt_print_text(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
diff --git a/Common/Options.h b/Common/Options.h
index b576f0712671017659ec5108f76e6e1a3282f2b6..7979e94e0790fd08e9bf3229cd0a82b069ad47eb 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -577,7 +577,6 @@ double opt_print_eps_ps3shading(OPT_ARGS_NUM);
 double opt_print_eps_quality(OPT_ARGS_NUM);
 double opt_print_eps_occlusion_culling(OPT_ARGS_NUM);
 double opt_print_eps_best_root(OPT_ARGS_NUM);
-double opt_print_eps_background(OPT_ARGS_NUM);
 double opt_print_eps_line_width_factor(OPT_ARGS_NUM);
 double opt_print_eps_point_size_factor(OPT_ARGS_NUM);
 double opt_print_jpeg_quality(OPT_ARGS_NUM);
@@ -593,6 +592,7 @@ double opt_print_gif_dither(OPT_ARGS_NUM);
 double opt_print_gif_sort(OPT_ARGS_NUM);
 double opt_print_gif_interlace(OPT_ARGS_NUM);
 double opt_print_gif_transparent(OPT_ARGS_NUM);
+double opt_print_background(OPT_ARGS_NUM);
 double opt_print_text(OPT_ARGS_NUM);
 double opt_print_tex_as_equation(OPT_ARGS_NUM);
 double opt_print_composite_windows(OPT_ARGS_NUM);
diff --git a/Common/onelab.h b/Common/onelab.h
index 2fa9b05f6bbe36ac3fa8e8a82aae5a6520bc20ee..8f49f54bacb0788a7452208e791f6eeed8421bea 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -494,10 +494,11 @@ namespace onelab{
              const std::string &client=""){ return _get(ps, name, client, _regions); }
     bool get(std::vector<function> &ps, const std::string &name="",
              const std::string &client=""){ return _get(ps, name, client, _functions); }
-    // check if at least one parameter depends on the given client
-    int NumParam(){
+    unsigned int getNumParameters()
+    {
       return _numbers.size() + _strings.size() + _regions.size() + _functions.size();
     }
+    // check if at least one parameter depends on the given client
     bool hasClient(const std::string &client) const
     {
       std::set<parameter*> ps;
@@ -633,7 +634,7 @@ namespace onelab{
     {
       return _parameterSpace.toChar(client); 
     }    
-    int NumParam(){ return _parameterSpace.NumParam();}
+    unsigned int getNumParameters(){ return _parameterSpace.getNumParameters(); }
   };
     
   class localClient : public client{
diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp
index 162159ab421268ba0bda0edf056e89e0daa34a66..7f5fb23d668117345fef65060d3ea50459227c96 100644
--- a/Fltk/FlGui.cpp
+++ b/Fltk/FlGui.cpp
@@ -194,6 +194,12 @@ FlGui::FlGui(int argc, char **argv) : _openedThroughMacFinder(false)
   if(CTX::instance()->display.size())
     Fl::display(CTX::instance()->display.c_str());
 
+#if 0 // dark scheme... not bad, but needs work
+  Fl::background(60, 60, 60);
+  Fl::background2(120, 120, 120);
+  Fl::foreground(200, 200, 200);
+#endif
+
   // add global shortcuts
   Fl::add_handler(globalShortcut);
 
diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp
index b49431fad557f4fe351d4718c32db767b59aa2ae..1b0a4482401357cd7ede28b57357b57a0d922b37 100644
--- a/Fltk/fileDialogs.cpp
+++ b/Fltk/fileDialogs.cpp
@@ -183,14 +183,14 @@ int genericBitmapFileDialog(const char *name, const char *title, int format)
 {
   struct _genericBitmapFileDialog{
     Fl_Window *window;
-    Fl_Check_Button *b[2];
+    Fl_Check_Button *b[3];
     Fl_Button *ok, *cancel;
   };
   static _genericBitmapFileDialog *dialog = NULL;
 
   if(!dialog){
     dialog = new _genericBitmapFileDialog;
-    int h = 3 * WB + 3 * BH, w = 2 * BB + 3 * WB, y = WB;
+    int h = 3 * WB + 4 * BH, w = 2 * BB + 3 * WB, y = WB;
     dialog->window = new Fl_Double_Window(w, h);
     dialog->window->box(GMSH_WINDOW_BOX);
     dialog->window->set_modal();
@@ -198,8 +198,11 @@ int genericBitmapFileDialog(const char *name, const char *title, int format)
       (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH;
     dialog->b[0]->type(FL_TOGGLE_BUTTON);
     dialog->b[1] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
+      (WB, y, 2 * BB + WB, BH, "Print background"); y += BH;
     dialog->b[1]->type(FL_TOGGLE_BUTTON);
+    dialog->b[2] = new Fl_Check_Button
+      (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
+    dialog->b[2]->type(FL_TOGGLE_BUTTON);
     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->window->end();
@@ -208,7 +211,8 @@ int genericBitmapFileDialog(const char *name, const char *title, int format)
   
   dialog->window->label(title);
   dialog->b[0]->value(CTX::instance()->print.text);
-  dialog->b[1]->value(CTX::instance()->print.compositeWindows);
+  dialog->b[1]->value(CTX::instance()->print.background);
+  dialog->b[2]->value(CTX::instance()->print.compositeWindows);
   dialog->window->show();
 
   while(dialog->window->shown()){
@@ -218,7 +222,8 @@ int genericBitmapFileDialog(const char *name, const char *title, int format)
       if (!o) break;
       if (o == dialog->ok) {
         opt_print_text(0, GMSH_SET | GMSH_GUI, (int)dialog->b[0]->value());
-        opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value());
+        opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value());
+        opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[2]->value());
         CreateOutputFile(name, format);
         dialog->window->hide();
         return 1;
@@ -288,14 +293,14 @@ int jpegFileDialog(const char *name)
   struct _jpegFileDialog{
     Fl_Window *window;
     Fl_Value_Slider *s[2];
-    Fl_Check_Button *b[2];
+    Fl_Check_Button *b[3];
     Fl_Button *ok, *cancel;
   };
   static _jpegFileDialog *dialog = NULL;
 
   if(!dialog){
     dialog = new _jpegFileDialog;
-    int h = 3 * WB + 5 * BH, w = 2 * BB + 3 * WB, y = WB;
+    int h = 3 * WB + 6 * BH, w = 2 * BB + 3 * WB, y = WB;
     dialog->window = new Fl_Double_Window(w, h, "JPEG Options");
     dialog->window->box(GMSH_WINDOW_BOX);
     dialog->window->set_modal();
@@ -315,8 +320,11 @@ int jpegFileDialog(const char *name)
       (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH;
     dialog->b[0]->type(FL_TOGGLE_BUTTON);
     dialog->b[1] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
+      (WB, y, 2 * BB + WB, BH, "Print background"); y += BH;
     dialog->b[1]->type(FL_TOGGLE_BUTTON);
+    dialog->b[2] = new Fl_Check_Button
+      (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
+    dialog->b[2]->type(FL_TOGGLE_BUTTON);
     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->window->end();
@@ -326,7 +334,8 @@ int jpegFileDialog(const char *name)
   dialog->s[0]->value(CTX::instance()->print.jpegQuality);
   dialog->s[1]->value(CTX::instance()->print.jpegSmoothing);
   dialog->b[0]->value(CTX::instance()->print.text);
-  dialog->b[1]->value(CTX::instance()->print.compositeWindows);
+  dialog->b[1]->value(CTX::instance()->print.background);
+  dialog->b[2]->value(CTX::instance()->print.compositeWindows);
   dialog->window->show();
 
   while(dialog->window->shown()){
@@ -338,7 +347,8 @@ int jpegFileDialog(const char *name)
         opt_print_jpeg_quality(0, GMSH_SET | GMSH_GUI, (int)dialog->s[0]->value());
         opt_print_jpeg_smoothing(0, GMSH_SET | GMSH_GUI, (int)dialog->s[1]->value());
         opt_print_text(0, GMSH_SET | GMSH_GUI, (int)dialog->b[0]->value());
-        opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value());
+        opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value());
+        opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->b[2]->value());
         CreateOutputFile(name, FORMAT_JPEG);
         dialog->window->hide();
         return 1;
@@ -359,7 +369,7 @@ int mpegFileDialog(const char *name)
   struct _mpegFileDialog{
     Fl_Window *window;
     Fl_Round_Button *b[2];
-    Fl_Check_Button *c[2];
+    Fl_Check_Button *c[3];
     Fl_Value_Input *v[2];
     Fl_Button *ok, *cancel;
   };
@@ -367,7 +377,7 @@ int mpegFileDialog(const char *name)
 
   if(!dialog){
     dialog = new _mpegFileDialog;
-    int h = 3 * WB + 7 * BH, w = 2 * BB + 3 * WB, y = WB;
+    int h = 3 * WB + 8 * BH, w = 2 * BB + 3 * WB, y = WB;
     dialog->window = new Fl_Double_Window(w, h, "MPEG Options");
     dialog->window->box(GMSH_WINDOW_BOX);
     dialog->window->set_modal();
@@ -397,13 +407,17 @@ int mpegFileDialog(const char *name)
     dialog->v[1]->align(FL_ALIGN_RIGHT);
     
     dialog->c[0] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
+      (WB, y, 2 * BB + WB, 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, "Delete temporary files"); y += BH;
+      (WB, y, 2 * BB + WB, 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;
+    dialog->c[2]->type(FL_TOGGLE_BUTTON);
+
     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->window->end();
@@ -414,8 +428,9 @@ int mpegFileDialog(const char *name)
   dialog->b[1]->value(CTX::instance()->post.animCycle);
   dialog->v[0]->value(CTX::instance()->post.animDelay);
   dialog->v[1]->value(CTX::instance()->post.animStep);
-  dialog->c[0]->value(CTX::instance()->print.compositeWindows);
-  dialog->c[1]->value(CTX::instance()->print.deleteTmpFiles);
+  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->window->show();
 
   while(dialog->window->shown()){
@@ -427,8 +442,9 @@ int mpegFileDialog(const char *name)
         opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->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_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->c[0]->value());
-        opt_print_delete_tmp_files(0, GMSH_SET | GMSH_GUI, (int)dialog->c[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;
@@ -448,14 +464,14 @@ int gifFileDialog(const char *name)
 {
   struct _gifFileDialog{
     Fl_Window *window;
-    Fl_Check_Button *b[6];
+    Fl_Check_Button *b[7];
     Fl_Button *ok, *cancel;
   };
   static _gifFileDialog *dialog = NULL;
 
   if(!dialog){
     dialog = new _gifFileDialog;
-    int h = 3 * WB + 7 * BH, w = 2 * BB + 3 * WB, y = WB;
+    int h = 3 * WB + 8 * BH, w = 2 * BB + 3 * WB, y = WB;
     dialog->window = new Fl_Double_Window(w, h, "GIF Options");
     dialog->window->box(GMSH_WINDOW_BOX);
     dialog->window->set_modal();
@@ -470,8 +486,10 @@ int gifFileDialog(const char *name)
     dialog->b[4] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH;
     dialog->b[5] = new Fl_Check_Button
+      (WB, y, 2 * BB + WB, BH, "Print background"); y += BH;
+    dialog->b[6] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH;
-    for(int i = 0; i < 6; i++){
+    for(int i = 0; i < 7; i++){
       dialog->b[i]->type(FL_TOGGLE_BUTTON);
     }
     dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK");
@@ -485,7 +503,8 @@ int gifFileDialog(const char *name)
   dialog->b[2]->value(CTX::instance()->print.gifSort);
   dialog->b[3]->value(CTX::instance()->print.gifTransparent);
   dialog->b[4]->value(CTX::instance()->print.text);
-  dialog->b[5]->value(CTX::instance()->print.compositeWindows);
+  dialog->b[5]->value(CTX::instance()->print.background);
+  dialog->b[6]->value(CTX::instance()->print.compositeWindows);
   dialog->window->show();
 
   while(dialog->window->shown()){
@@ -499,7 +518,8 @@ int gifFileDialog(const char *name)
         opt_print_gif_sort(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value());
         opt_print_gif_transparent(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value());
         opt_print_text(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value());
-        opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value());
+        opt_print_background(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value());
+        opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, dialog->b[6]->value());
         CreateOutputFile(name, FORMAT_GIF);
         dialog->window->hide();
         return 1;
@@ -581,15 +601,15 @@ int gl2psFileDialog(const char *name, const char *title, int format)
     dialog->b[0] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Compress"); y += BH;
     dialog->b[1] = new Fl_Check_Button
-      (WB, y, 2 * BB + WB, BH, "Print background"); y += BH;
-    dialog->b[2] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Remove hidden primitives"); y += BH;
-    dialog->b[3] = new Fl_Check_Button
+    dialog->b[2] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Optimize BSP tree"); y += BH;
-    dialog->b[4] = new Fl_Check_Button
+    dialog->b[3] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Use level 3 shading"); y += BH;
-    dialog->b[5] = new Fl_Check_Button
+    dialog->b[4] = new Fl_Check_Button
       (WB, y, 2 * BB + WB, BH, "Print text strings"); y += BH;
+    dialog->b[5] = new Fl_Check_Button
+      (WB, y, 2 * BB + WB, BH, "Print background"); y += BH;
     for(int i = 0; i < 6; i++){
       dialog->b[i]->type(FL_TOGGLE_BUTTON);
     }
@@ -602,11 +622,11 @@ int gl2psFileDialog(const char *name, const char *title, int format)
   dialog->window->label(title);
   dialog->c->value(CTX::instance()->print.epsQuality);
   dialog->b[0]->value(CTX::instance()->print.epsCompress);
-  dialog->b[1]->value(CTX::instance()->print.epsBackground);
-  dialog->b[2]->value(CTX::instance()->print.epsOcclusionCulling);
-  dialog->b[3]->value(CTX::instance()->print.epsBestRoot);
-  dialog->b[4]->value(CTX::instance()->print.epsPS3Shading);
-  dialog->b[5]->value(CTX::instance()->print.text);
+  dialog->b[1]->value(CTX::instance()->print.epsOcclusionCulling);
+  dialog->b[2]->value(CTX::instance()->print.epsBestRoot);
+  dialog->b[3]->value(CTX::instance()->print.epsPS3Shading);
+  dialog->b[4]->value(CTX::instance()->print.text);
+  dialog->b[5]->value(CTX::instance()->print.background);
 
   activate_gl2ps_choices(format, CTX::instance()->print.epsQuality, dialog->b);
 
@@ -624,11 +644,11 @@ int gl2psFileDialog(const char *name, const char *title, int format)
       if (o == dialog->ok) {
         opt_print_eps_quality(0, GMSH_SET | GMSH_GUI, dialog->c->value());
         opt_print_eps_compress(0, GMSH_SET | GMSH_GUI, dialog->b[0]->value());
-        opt_print_eps_background(0, GMSH_SET | GMSH_GUI, dialog->b[1]->value());
-        opt_print_eps_occlusion_culling(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value());
-        opt_print_eps_best_root(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value());
-        opt_print_eps_ps3shading(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value());
-        opt_print_text(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value());
+        opt_print_eps_occlusion_culling(0, GMSH_SET | GMSH_GUI, dialog->b[1]->value());
+        opt_print_eps_best_root(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value());
+        opt_print_eps_ps3shading(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value());
+        opt_print_text(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value());
+        opt_print_background(0, GMSH_SET | GMSH_GUI, dialog->b[5]->value());
         CreateOutputFile(name, format);
         dialog->window->hide();
         return 1;
diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index 474fa605fc1d3f0c16461a6cc9e4f2c8913e674f..6ef2986580c07c4fe325b1642a3cab2228db442c 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -321,7 +321,7 @@ void status_options_cb(Fl_Widget *w, void *data)
 
 static int stop_anim = 0, view_in_cycle = -1;
 
-void status_play_manual(int time, int incr)
+void status_play_manual(int time, int incr, bool redraw)
 {
   // avoid firing this routine recursively (can happen e.g when
   // keeping the finger down on the arrow key: if the system generates
@@ -371,7 +371,7 @@ void status_play_manual(int time, int incr)
         opt_view_visible(i, GMSH_SET | GMSH_GUI, (i == view_in_cycle));
     }
   }
-  drawContext::global()->draw();
+  if(redraw) drawContext::global()->draw();
   busy = false;
 }
 
diff --git a/Fltk/graphicWindow.h b/Fltk/graphicWindow.h
index 865043487b74054d8ad9a63167fd5fbb572f9f0b..9b1f96b4d16df695b926da363759980220baddf6 100644
--- a/Fltk/graphicWindow.h
+++ b/Fltk/graphicWindow.h
@@ -47,7 +47,7 @@ class graphicWindow{
 
 void status_xyz1p_cb(Fl_Widget *w, void *data);
 void status_options_cb(Fl_Widget *w, void *data);
-void status_play_manual(int time, int incr);
+void status_play_manual(int time, int incr, bool redraw=true);
 void message_cb(Fl_Widget *w, void *data);
 
 #endif
diff --git a/Fltk/openglWindow.cpp b/Fltk/openglWindow.cpp
index 6814e4b242ea272a82276dd88b2dae5d8a3cb83b..379af979468af564ab8293344522f482081aed0f 100644
--- a/Fltk/openglWindow.cpp
+++ b/Fltk/openglWindow.cpp
@@ -192,11 +192,14 @@ void openglWindow::draw()
   }
   else{
     // draw the whole scene
-    glClearColor
-      ((GLclampf)(CTX::instance()->unpackRed(CTX::instance()->color.bg) / 255.),
-       (GLclampf)(CTX::instance()->unpackGreen(CTX::instance()->color.bg) / 255.),
-       (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), 
-       0.0F);
+    if(CTX::instance()->printing && !CTX::instance()->print.background)
+      glClearColor(1.0F, 1.0F, 1.0F, 0.0F);
+    else
+      glClearColor
+        ((GLclampf)(CTX::instance()->unpackRed(CTX::instance()->color.bg) / 255.),
+         (GLclampf)(CTX::instance()->unpackGreen(CTX::instance()->color.bg) / 255.),
+         (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), 
+         0.0F);
     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    
     if(CTX::instance()->camera && !CTX::instance()->stereo){
diff --git a/Graphics/PixelBuffer.h b/Graphics/PixelBuffer.h
index c07eba7f3d191c4cacdc9ae5bcca0789a1c2f45e..f707084cf8de5e393601419aa0c759f1c82dd2d1 100644
--- a/Graphics/PixelBuffer.h
+++ b/Graphics/PixelBuffer.h
@@ -96,6 +96,8 @@ class PixelBuffer{
   void fill(int offscreen)
   {
     if(!offscreen){
+      // workaround double buffering issues by redrawing twice
+      drawContext::global()->drawCurrentOpenglWindow(true);
       drawContext::global()->drawCurrentOpenglWindow(true);
       glFinish();
       glPixelStorei(GL_PACK_ALIGNMENT, 1);
diff --git a/Graphics/drawContext.cpp b/Graphics/drawContext.cpp
index a4dd4ec4e1e158c641e9231e725281cbcbf46d7a..d1efb9f56a1eb073ddebf95d777503aca05a5105 100644
--- a/Graphics/drawContext.cpp
+++ b/Graphics/drawContext.cpp
@@ -496,8 +496,9 @@ void drawContext::initProjection(int xpick, int ypick, int wpick, int hpick)
 		    (GLdouble)wpick, (GLdouble)hpick, (GLint *)viewport);
 
     // draw background if not in selection mode
-    if(render_mode != GMSH_SELECT && (CTX::instance()->bgGradient || 
-				      CTX::instance()->bgImageFileName.size())){
+    if(render_mode != GMSH_SELECT && 
+       (CTX::instance()->bgGradient || CTX::instance()->bgImageFileName.size()) &&
+       (!CTX::instance()->printing || CTX::instance()->print.background)){
       glDisable(GL_DEPTH_TEST);
       glPushMatrix();
       glLoadIdentity();
diff --git a/Graphics/gl2gif.cpp b/Graphics/gl2gif.cpp
index 7b870f64459797d7f8b6a9370af27d473c55cbdd..21151dc2d6e664249149f5a38b512e1c65346ceb 100644
--- a/Graphics/gl2gif.cpp
+++ b/Graphics/gl2gif.cpp
@@ -1147,7 +1147,7 @@ static void GIFEncode(FILE * fp,
 
 void create_gif(FILE * outfile, PixelBuffer *buffer,
                 int dither, int sort, int interlace,
-                int transparency, int bg_r, int bg_g, int bg_b)
+                int transparency)
 {
 
   int i, j, k, transparent, rows, cols;
@@ -1438,9 +1438,9 @@ void create_gif(FILE * outfile, PixelBuffer *buffer,
   static_cht = ppm_colorhisttocolorhash(chv, static_nbcolors);
   ppm_freecolorhist(chv);
 
-  /* figure out the transparent colour index */
+  /* figure out the transparent colour index, assuming the background is white */
   if(transparency) {
-    PPM_ASSIGN(transcolor, bg_r, bg_g, bg_b);
+    PPM_ASSIGN(transcolor, 255, 255, 255);
     transparent = ppm_lookupcolor(static_cht, &transcolor);
     if(transparent == -1)
       transparent = closestcolor(transcolor);
diff --git a/Graphics/gl2gif.h b/Graphics/gl2gif.h
index 923991dbc618b0c102a2a0de3f0a90c418479672..c10394c7a58a2d5bf0496fc7bf8320965f24d37c 100644
--- a/Graphics/gl2gif.h
+++ b/Graphics/gl2gif.h
@@ -58,7 +58,7 @@ typedef colorhist_list* colorhash_table;
 
 void create_gif(FILE *outfile, PixelBuffer *buffer, 
                 int dither, int sort, int interlace, 
-                int transparency, int r, int g, int b);
+                int transparency);
 
 
 #endif
diff --git a/Post/PViewVertexArrays.cpp b/Post/PViewVertexArrays.cpp
index 97990fdc2e23ead89a58a6685ce6a4a8e47881f3..9a9aab480d52619c9e7add97c667360684373773 100644
--- a/Post/PViewVertexArrays.cpp
+++ b/Post/PViewVertexArrays.cpp
@@ -1383,12 +1383,12 @@ class initPView {
     p->va_vectors->finalize();
     p->va_ellipses->finalize();
 
-    Msg::Info("%d vertices in vertex arrays (%g Mb)", p->va_points->getNumVertices() +
-              p->va_lines->getNumVertices() + p->va_triangles->getNumVertices() +
-              p->va_vectors->getNumVertices() + p->va_ellipses->getNumVertices(),
-              p->va_points->getMemoryInMb() +
-              p->va_lines->getMemoryInMb() + p->va_triangles->getMemoryInMb() +
-              p->va_vectors->getMemoryInMb() + p->va_ellipses->getMemoryInMb());
+    Msg::Debug("%d vertices in vertex arrays (%g Mb)", p->va_points->getNumVertices() +
+               p->va_lines->getNumVertices() + p->va_triangles->getNumVertices() +
+               p->va_vectors->getNumVertices() + p->va_ellipses->getNumVertices(),
+               p->va_points->getMemoryInMb() +
+               p->va_lines->getMemoryInMb() + p->va_triangles->getMemoryInMb() +
+               p->va_vectors->getMemoryInMb() + p->va_ellipses->getMemoryInMb());
 
     p->setChanged(false);
   }