diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index 2d703baba6ac27e598c145834440eaf55588e90a..d133482cf4ba2b496180dd3cde4a5aa3e8d9f73c 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -482,6 +482,49 @@ void GetOptions(int argc, char *argv[])
         else
           Msg::Fatal("Missing algorithm");
       }
+      else if(!strcmp(argv[i] + 1, "format") || !strcmp(argv[i] + 1, "f")) {
+        i++;
+        if(argv[i]) {
+          if(!strcmp(argv[i], "auto")){
+            CTX::instance()->mesh.fileFormat = FORMAT_AUTO;
+          }
+          else if(!strcmp(argv[i], "msh1")){
+            CTX::instance()->mesh.fileFormat = FORMAT_MSH;
+            CTX::instance()->mesh.mshFileVersion = 1.0;
+          }
+          else if(!strcmp(argv[i], "msh2")){
+            CTX::instance()->mesh.fileFormat = FORMAT_MSH;
+            CTX::instance()->mesh.mshFileVersion = 2.0;
+          }
+          else if(!strcmp(argv[i], "msh"))
+            CTX::instance()->mesh.fileFormat = FORMAT_MSH;
+          else if(!strcmp(argv[i], "unv"))
+            CTX::instance()->mesh.fileFormat = FORMAT_UNV;
+          else if(!strcmp(argv[i], "vrml"))
+            CTX::instance()->mesh.fileFormat = FORMAT_VRML;
+          else if(!strcmp(argv[i], "stl"))
+            CTX::instance()->mesh.fileFormat = FORMAT_STL;
+          else if(!strcmp(argv[i], "mesh"))
+            CTX::instance()->mesh.fileFormat = FORMAT_MESH;
+          else if(!strcmp(argv[i], "bdf"))
+            CTX::instance()->mesh.fileFormat = FORMAT_BDF;
+          else if(!strcmp(argv[i], "p3d"))
+            CTX::instance()->mesh.fileFormat = FORMAT_P3D;
+          else if(!strcmp(argv[i], "cgns"))
+            CTX::instance()->mesh.fileFormat = FORMAT_CGNS;
+          else if(!strcmp(argv[i], "diff"))
+            CTX::instance()->mesh.fileFormat = FORMAT_DIFF;
+          else if(!strcmp(argv[i], "med"))
+            CTX::instance()->mesh.fileFormat = FORMAT_MED;
+          else if(!strcmp(argv[i], "ir3"))
+            CTX::instance()->mesh.fileFormat = FORMAT_IR3;
+          else
+            Msg::Fatal("Unknown mesh format");
+          i++;
+        }
+        else
+          Msg::Fatal("Missing format");
+      }
       else if(!strcmp(argv[i] + 1, "listen")) {
         CTX::instance()->solver.listen = 1;
         i++;
diff --git a/Common/Context.h b/Common/Context.h
index b4791950978545a31f00502d3cec168b5efb5e28..d120f727b1c6d8e620831665bff1f031e5d3a0bf 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -28,7 +28,7 @@ struct contextMeshOptions {
   double lcMin, lcMax, toleranceEdgeLength;
   int lcFromPoints, lcFromCurvature, lcExtendFromBoundary;
   int dual, voronoi, drawSkinOnly, colorCarousel;
-  int format, nbSmoothing, algo2d, algo3d, algoSubdivide;
+  int fileFormat, nbSmoothing, algo2d, algo3d, algoSubdivide;
   int order, secondOrderLinear, secondOrderIncomplete;
   int secondOrderExperimental, meshOnlyVisible;
   int smoothInternalEdges, minCircPoints, minCurvPoints;
@@ -210,7 +210,7 @@ class CTX {
   }solver;
   // print options 
   struct{
-    int format, epsQuality, epsBackground, epsCompress, epsPS3Shading;
+    int fileFormat, epsQuality, epsBackground, epsCompress, epsPS3Shading;
     int epsOcclusionCulling, epsBestRoot;
     double epsLineWidthFactor, epsPointSizeFactor;
     int jpegQuality, jpegSmoothing, geoLabels, text, texAsEquation;
diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp
index dc15fcfca58f34e63b290a9fa8b7e460e6b1b2b6..72d5f56e319db324820e252da2db158d69aaa894 100644
--- a/Common/CreateFile.cpp
+++ b/Common/CreateFile.cpp
@@ -156,8 +156,8 @@ void CreateOutputFile(std::string fileName, int format)
   if(fileName.empty())
     fileName = GetDefaultFileName(format);
 
-  int oldFormat = CTX::instance()->print.format;
-  CTX::instance()->print.format = format;
+  int oldFormat = CTX::instance()->print.fileFormat;
+  CTX::instance()->print.fileFormat = format;
   CTX::instance()->printing = 1;
 
   if(format != FORMAT_AUTO) 
@@ -509,7 +509,7 @@ void CreateOutputFile(std::string fileName, int format)
 
   if(printEndMessage) Msg::StatusBar(2, true, "Done writing '%s'", fileName.c_str());
 
-  CTX::instance()->print.format = oldFormat;
+  CTX::instance()->print.fileFormat = oldFormat;
   CTX::instance()->printing = 0;
 
 #if defined(HAVE_OPENGL)
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index b4eb48b55d2d4d9bd932fb9e8c2488b15bccf4aa..d3beb5e9e0597ce1c925e20b85b230e4fadb01d9 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1091,7 +1091,7 @@ StringXNumber MeshOptions_Number[] = {
   { F|O, "Explode" , opt_mesh_explode , 1.0 ,
     "Element shrinking factor (between 0 and 1)" },
 
-  { F|O, "Format" , opt_mesh_format , FORMAT_AUTO , 
+  { F|O, "Format" , opt_mesh_file_format , FORMAT_AUTO , 
     "Mesh output format (1=msh, 2=unv, 10=automatic, 19=vrml, 27=stl, 30=mesh, 31=bdf, "
     "32=cgns, 33=med)" },
 
@@ -1628,7 +1628,7 @@ StringXNumber PrintOptions_Number[] = {
     "PostScript/PDF quality (0=bitmap, 1=vector (simple sort), 2=vector "
     "(accurate sort), 3=vector (unsorted)" },
 
-  { F|O, "Format" , opt_print_format , FORMAT_AUTO , 
+  { F|O, "Format" , opt_print_file_format , FORMAT_AUTO , 
     "File format (10=automatic)" }, 
 
   { F|O, "GeoLabels" , opt_print_geo_labels , 1. ,
diff --git a/Common/Gmsh.cpp b/Common/Gmsh.cpp
index 9574243e27cfeb23cf62d29512ec7ce1ff45bb86..9ec3c4faf4d08d5dbc8aca9a3c2d3f0ecf6ee073 100644
--- a/Common/Gmsh.cpp
+++ b/Common/Gmsh.cpp
@@ -188,9 +188,14 @@ int GmshBatch()
     }
 #endif
 #endif
-    CreateOutputFile(CTX::instance()->outputFileName, 
-                     CTX::instance()->outputFileName.empty() ? FORMAT_MSH :
-                     FORMAT_AUTO);
+    std::string name = CTX::instance()->outputFileName;
+    if(name.empty()){
+      if(CTX::instance()->mesh.fileFormat == FORMAT_AUTO)
+        name = GetDefaultFileName(FORMAT_MSH);
+      else
+        name = GetDefaultFileName(CTX::instance()->mesh.fileFormat);
+    }
+    CreateOutputFile(name, CTX::instance()->mesh.fileFormat);
   }
 
   time_t now;
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 829da1163075aab356f666be59e35f29e46738bd..7fae483863172956a9ec1b24146d8baf86118c78 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -5470,11 +5470,11 @@ double opt_mesh_light_two_side(OPT_ARGS_NUM)
   return CTX::instance()->mesh.lightTwoSide;
 }
 
-double opt_mesh_format(OPT_ARGS_NUM)
+double opt_mesh_file_format(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
-    CTX::instance()->mesh.format = (int)val;
-  return CTX::instance()->mesh.format;
+    CTX::instance()->mesh.fileFormat = (int)val;
+  return CTX::instance()->mesh.fileFormat;
 }
 
 double opt_mesh_msh_file_version(OPT_ARGS_NUM)
@@ -8347,11 +8347,11 @@ double opt_view_component_map6(OPT_ARGS_NUM){ return ovcm(num, action, val, 6);
 double opt_view_component_map7(OPT_ARGS_NUM){ return ovcm(num, action, val, 7); }
 double opt_view_component_map8(OPT_ARGS_NUM){ return ovcm(num, action, val, 8); }
 
-double opt_print_format(OPT_ARGS_NUM)
+double opt_print_file_format(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
-    CTX::instance()->print.format = (int)val;
-  return CTX::instance()->print.format;
+    CTX::instance()->print.fileFormat = (int)val;
+  return CTX::instance()->print.fileFormat;
 }
 
 double opt_print_eps_compress(OPT_ARGS_NUM)
diff --git a/Common/Options.h b/Common/Options.h
index 157f3de6e456969793a6327c0a8f758577f356b0..1e117dea0372c2e2c98232a1821b85abb28bc02d 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -508,7 +508,7 @@ double opt_mesh_angle_smooth_normals(OPT_ARGS_NUM);
 double opt_mesh_light(OPT_ARGS_NUM);
 double opt_mesh_light_lines(OPT_ARGS_NUM);
 double opt_mesh_light_two_side(OPT_ARGS_NUM);
-double opt_mesh_format(OPT_ARGS_NUM);
+double opt_mesh_file_format(OPT_ARGS_NUM);
 double opt_mesh_msh_file_version(OPT_ARGS_NUM);
 double opt_mesh_msh_file_partitioned(OPT_ARGS_NUM);
 double opt_mesh_binary(OPT_ARGS_NUM);
@@ -712,7 +712,7 @@ double opt_view_component_map5(OPT_ARGS_NUM);
 double opt_view_component_map6(OPT_ARGS_NUM);
 double opt_view_component_map7(OPT_ARGS_NUM);
 double opt_view_component_map8(OPT_ARGS_NUM);
-double opt_print_format(OPT_ARGS_NUM);
+double opt_print_file_format(OPT_ARGS_NUM);
 double opt_print_eps_compress(OPT_ARGS_NUM);
 double opt_print_eps_ps3shading(OPT_ARGS_NUM);
 double opt_print_eps_quality(OPT_ARGS_NUM);
diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp
index 39df2e036756a8c4facdec49d084e299a00ac3f2..f7e818f31a1ccff4d846547dc81184855acc0f62 100644
--- a/Fltk/menuWindow.cpp
+++ b/Fltk/menuWindow.cpp
@@ -336,8 +336,8 @@ static void file_save_as_cb(Fl_Widget *w, void *data)
     {"Gmsh Options" TT "*.opt", _save_options},
     {"Gmsh Unrolled Geometry" TT "*.geo", _save_geo},
     SEPARATOR_OUT
-#if defined(HAVE_LIBCGNS)
     {"Abaqus INP Mesh" TT "*.inp", _save_inp},
+#if defined(HAVE_LIBCGNS)
     {"CGNS (Experimental)" TT "*.cgns", _save_cgns},
 #endif
     {"Diffpack 3D Mesh" TT "*.diff", _save_diff},
@@ -1587,14 +1587,19 @@ static void geometry_physical_add_cb(Fl_Widget *w, void *data)
 static void mesh_save_cb(Fl_Widget *w, void *data)
 {
   std::string name = CTX::instance()->outputFileName;
-  if(name.empty()) name = GetDefaultFileName(CTX::instance()->mesh.format);
+  if(name.empty()){
+    if(CTX::instance()->mesh.fileFormat == FORMAT_AUTO)
+      name = GetDefaultFileName(FORMAT_MSH);
+    else
+      name = GetDefaultFileName(CTX::instance()->mesh.fileFormat);
+  }
   if(CTX::instance()->confirmOverwrite) {
     if(!StatFile(name))
       if(!fl_choice("File '%s' already exists.\n\nDo you want to replace it?",
                     "Cancel", "Replace", 0, name.c_str()))
         return;
   }
-  CreateOutputFile(name, name.empty() ? FORMAT_MSH : CTX::instance()->mesh.format);
+  CreateOutputFile(name, CTX::instance()->mesh.fileFormat);
 }
 
 static void mesh_define_cb(Fl_Widget *w, void *data)
diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp
index 58bbf3e9f5d757c88d339178eb62fcac9b1c9d6f..67a8158b8a7d285a265595bc01f9a130befeb404 100644
--- a/Geo/GFaceCompound.cpp
+++ b/Geo/GFaceCompound.cpp
@@ -1727,7 +1727,7 @@ void GFaceCompound::partitionFaceCM()
 	
   model()->recomputeMeshPartitions();
 	
-  CreateOutputFile("toto.msh", CTX::instance()->mesh.format);
+  CreateOutputFile("toto.msh", CTX::instance()->mesh.fileFormat);
   Msg::Exit(1);
 	 
   return;
diff --git a/Graphics/drawGlyph.cpp b/Graphics/drawGlyph.cpp
index e4a7437968709e4017253ebb608394bd69cc1592..119bb7c7e8937f5017d24c36f2a96206f7158b7d 100644
--- a/Graphics/drawGlyph.cpp
+++ b/Graphics/drawGlyph.cpp
@@ -19,7 +19,7 @@ void drawContext::drawString(const std::string &s, const std::string &font_name,
 
   // change the raster position only if not creating TeX files
   if(align > 0 && (!CTX::instance()->printing || 
-                   CTX::instance()->print.format != FORMAT_TEX)){
+                   CTX::instance()->print.fileFormat != FORMAT_TEX)){
     GLboolean valid;
     glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid);
     if(valid == GL_TRUE){
@@ -50,7 +50,7 @@ void drawContext::drawString(const std::string &s, const std::string &font_name,
     drawContext::global()->drawString(s.c_str());
   }
   else{
-    if(CTX::instance()->print.format == FORMAT_TEX){
+    if(CTX::instance()->print.fileFormat == FORMAT_TEX){
       std::string tmp = SanitizeTeXString
         (s.c_str(), CTX::instance()->print.texAsEquation);
       int opt;
@@ -68,10 +68,10 @@ void drawContext::drawString(const std::string &s, const std::string &font_name,
       gl2psTextOpt(tmp.c_str(), font_name.c_str(), font_size, opt, 0.);
     }
     else if(CTX::instance()->print.epsQuality && 
-            (CTX::instance()->print.format == FORMAT_PS ||
-             CTX::instance()->print.format == FORMAT_EPS ||
-             CTX::instance()->print.format == FORMAT_PDF ||
-             CTX::instance()->print.format == FORMAT_SVG)){
+            (CTX::instance()->print.fileFormat == FORMAT_PS ||
+             CTX::instance()->print.fileFormat == FORMAT_EPS ||
+             CTX::instance()->print.fileFormat == FORMAT_PDF ||
+             CTX::instance()->print.fileFormat == FORMAT_SVG)){
       gl2psText(s.c_str(), font_name.c_str(), font_size);
     }
     else{
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 9534642e83a9e9e00f1cebf83f5245e8685518b6..cda67e04a5fd17cd7e98b217fdf491469722843f 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1712,7 +1712,7 @@ void partitionAndRemesh(GFaceCompound *gf)
   gf->coherenceNormals();
   gf->meshStatistics.status = GFace::DONE; 
 
-  //CreateOutputFile("toto.msh", CTX::instance()->mesh.format);
+  //CreateOutputFile("toto.msh", CTX::instance()->mesh.fileFormat);
   //Msg::Exit(1);
 #endif
 }
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 63447c0329da37c864449d9321749b806b02e6ad..aa36829bdf964c1da9bf976262d299e1ea22939d 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -6341,12 +6341,12 @@ yyreduce:
 	// the print command is in the same file as the geometry)
 	GModel::current()->importGEOInternals();
         std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c));
-	CreateOutputFile(tmp, CTX::instance()->print.format);
+	CreateOutputFile(tmp, CTX::instance()->print.fileFormat);
       }
       else if(!strcmp((yyvsp[(1) - (3)].c), "Save")){
 	GModel::current()->importGEOInternals();
         std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c));
-	CreateOutputFile(tmp, CTX::instance()->mesh.format);
+	CreateOutputFile(tmp, CTX::instance()->mesh.fileFormat);
       }
       else if(!strcmp((yyvsp[(1) - (3)].c), "Merge") || !strcmp((yyvsp[(1) - (3)].c), "MergeWithBoundingBox")){
 	// MergeWithBoundingBox is deprecated
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 27c76059da473d513418cb94f5adc0fba77c75e9..f959bb5a600e6f85e515e43c9f42f36f31d468bf 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -2274,12 +2274,12 @@ Command :
 	// the print command is in the same file as the geometry)
 	GModel::current()->importGEOInternals();
         std::string tmp = FixRelativePath(gmsh_yyname, $2);
-	CreateOutputFile(tmp, CTX::instance()->print.format);
+	CreateOutputFile(tmp, CTX::instance()->print.fileFormat);
       }
       else if(!strcmp($1, "Save")){
 	GModel::current()->importGEOInternals();
         std::string tmp = FixRelativePath(gmsh_yyname, $2);
-	CreateOutputFile(tmp, CTX::instance()->mesh.format);
+	CreateOutputFile(tmp, CTX::instance()->mesh.fileFormat);
       }
       else if(!strcmp($1, "Merge") || !strcmp($1, "MergeWithBoundingBox")){
 	// MergeWithBoundingBox is deprecated