diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp
index 8dffc516349643bf4b1e845a8cf98ac1eaca4630..6e2eebe069554057d604221cca47f3153a943ec3 100644
--- a/Common/CreateFile.cpp
+++ b/Common/CreateFile.cpp
@@ -257,8 +257,9 @@ void CreateOutputFile(const std::string &fileName, int format,
     if(GModel::current()->getMeshPartitions().size() &&
        CTX::instance()->mesh.mshFilePartitioned == 1)
       GModel::current()->writePartitionedMSH
-        (name, CTX::instance()->mesh.binary, CTX::instance()->mesh.saveAll,
-         CTX::instance()->mesh.saveParametric, CTX::instance()->mesh.scalingFactor);
+        (name, CTX::instance()->mesh.mshFileVersion, CTX::instance()->mesh.binary,
+         CTX::instance()->mesh.saveAll, CTX::instance()->mesh.saveParametric,
+         CTX::instance()->mesh.scalingFactor);
     else if(GModel::current()->getMeshPartitions().size() &&
             CTX::instance()->mesh.mshFilePartitioned == 2)
       GModel::current()->writeMSH
diff --git a/Geo/GModel.h b/Geo/GModel.h
index ac63db49817ae890e9696873db7c793fd0067385..dab2d811dc39d3c2265f88f82aa18eb95e08e33c 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -53,6 +53,9 @@ class GModel
                  double scalingFactor=1.0, int elementStartNum=0,
                  int saveSinglePartition=0,
                  bool multipleView=false);
+  int _writePartitionedMSH2(const std::string &baseName, bool binary=false,
+                            bool saveAll=false, bool saveParametric=false,
+                            double scalingFactor=1.0);
 
   // the maximum vertex and element id number in the mesh
   int _maxVertexNum, _maxElementNum;
@@ -617,9 +620,9 @@ class GModel
                bool saveAll=false, bool saveParametric=false,
                double scalingFactor=1.0, int elementStartNum=0,
                int saveSinglePartition=0, bool multipleView=false);
-  int writePartitionedMSH(const std::string &baseName, bool binary=false,
-                          bool saveAll=false, bool saveParametric=false,
-                          double scalingFactor=1.0);
+  int writePartitionedMSH(const std::string &baseName, double version=2.2,
+                          bool binary=false, bool saveAll=false,
+                          bool saveParametric=false, double scalingFactor=1.0);
 
   // Iridium file format
   int writeIR3(const std::string &name, int elementTagType,
diff --git a/Geo/GModelIO_MSH.cpp b/Geo/GModelIO_MSH.cpp
index 34bf1fe3e278b330611e5a936375d2f8df6ecc7e..f8e4f8f922ee509f263d4e95a472ac8ca230a01f 100644
--- a/Geo/GModelIO_MSH.cpp
+++ b/Geo/GModelIO_MSH.cpp
@@ -3,6 +3,8 @@
 // See the LICENSE.txt file for license information. Please report all
 // bugs and problems to the public mailing list <gmsh@geuz.org>.
 
+#include <sstream>
+#include <iomanip>
 #include "GModel.h"
 #include "OS.h"
 #include "GmshMessage.h"
@@ -607,3 +609,23 @@ int GModel::writeMSH(const std::string &name, double version, bool binary,
 
   return 1;
 }
+
+int GModel::writePartitionedMSH(const std::string &baseName, double version,
+                                bool binary, bool saveAll, bool saveParametric,
+                                double scalingFactor)
+{
+  if(version < 3)
+    return _writePartitionedMSH2(baseName, binary, saveAll, saveParametric,
+                                 scalingFactor);
+
+  for(std::set<int>::iterator it = meshPartitions.begin();
+      it != meshPartitions.end(); it++){
+    int partition = *it;
+    std::ostringstream sstream;
+    sstream << baseName << "_" << std::setw(6) << std::setfill('0') << partition;
+    Msg::Info("Writing partition %d in file '%s'", partition, sstream.str().c_str());
+    writeMSH(sstream.str(), version, binary, saveAll, saveParametric,
+             scalingFactor, 0, partition);
+  }
+  return 1;
+}
diff --git a/Geo/GModelIO_MSH2.cpp b/Geo/GModelIO_MSH2.cpp
index efb40fe9f3354547726324b135ce1bc303a603f3..a99fd2f459fa305b03a2c39abba6fdb867cf5c91 100644
--- a/Geo/GModelIO_MSH2.cpp
+++ b/Geo/GModelIO_MSH2.cpp
@@ -1066,9 +1066,9 @@ int GModel::_writeMSH2(const std::string &name, double version, bool binary,
   return 1;
 }
 
-int GModel::writePartitionedMSH(const std::string &baseName, bool binary,
-                                bool saveAll, bool saveParametric,
-                                double scalingFactor)
+int GModel::_writePartitionedMSH2(const std::string &baseName, bool binary,
+                                  bool saveAll, bool saveParametric,
+                                  double scalingFactor)
 {
   int numElements;
   int startNum = 0;