diff --git a/Post/PViewData.h b/Post/PViewData.h
index 6d6bd13f5257f878cdd0a8df68207dcdb3a4cd87..6f98f2df2fce9a4c5f56412d1dc6c7de67c155be 100644
--- a/Post/PViewData.h
+++ b/Post/PViewData.h
@@ -270,7 +270,8 @@ class PViewData {
   virtual bool writePOS(const std::string &fileName, bool binary=false,
                         bool parsed=true, bool append=false);
   virtual bool writeMSH(const std::string &fileName, double version=2.2, bool binary=false,
-                        bool savemesh=true, bool multipleView=false);
+                        bool savemesh=true, bool multipleView=false,
+                        int partitionNum=0, bool saveInterpolationMatrices=true);
   virtual bool writeMED(const std::string &fileName);
   virtual bool toVector(std::vector<std::vector<double> > &vec);
   virtual bool fromVector(const std::vector<std::vector<double> > &vec);
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index b29a02390747c1faf0c31279f679b80021a46d50..bf3d53ad366dd4f74026c3c7e279d55348c6359f 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -250,7 +250,8 @@ class PViewDataGModel : public PViewData {
                double time, int partition, int numComp, int numNodes,
                const std::string &interpolationScheme);
   virtual bool writeMSH(const std::string &fileName, double version=2.2, bool binary=false,
-                        bool savemesh=true, bool multipleView=false);
+                        bool savemesh=true, bool multipleView=false,
+                        int partitionNum=0, bool saveInterpolationMatrices=true);
   bool readMED(const std::string &fileName, int fileIndex);
   bool writeMED(const std::string &fileName);
 };
diff --git a/Post/PViewDataGModelIO.cpp b/Post/PViewDataGModelIO.cpp
index 6d79ff9ad3394ad3b7f9cbe0946e0613d4bfe03c..dbe8f67034d0df0168a0d902f8898ac18faf1f83 100644
--- a/Post/PViewDataGModelIO.cpp
+++ b/Post/PViewDataGModelIO.cpp
@@ -133,7 +133,8 @@ bool PViewDataGModel::readMSH(const std::string &viewName, const std::string &fi
 }
 
 bool PViewDataGModel::writeMSH(const std::string &fileName, double version, bool binary,
-                               bool savemesh, bool multipleView)
+                               bool savemesh, bool multipleView, int partitionNum,
+                               bool saveInterpolationMatrices)
 {
   if(_steps.empty()) return true;
 
@@ -181,7 +182,7 @@ bool PViewDataGModel::writeMSH(const std::string &fileName, double version, bool
     }
   }
 
-  if(haveInterpolationMatrices()){
+  if(saveInterpolationMatrices && haveInterpolationMatrices()){
     fprintf(fp, "$InterpolationScheme\n");
     fprintf(fp, "\"INTERPOLATION_SCHEME\"\n");
     fprintf(fp, "%d\n", (int)_interpolation.size());
@@ -212,7 +213,10 @@ bool PViewDataGModel::writeMSH(const std::string &fileName, double version, bool
         fprintf(fp, "$NodeData\n");
         fprintf(fp, "1\n\"%s\"\n", getName().c_str());
         fprintf(fp, "1\n%.16g\n", _steps[step]->getTime());
-        fprintf(fp, "3\n%d\n%d\n%d\n", step, numComp, numEnt);
+        if(partitionNum)
+          fprintf(fp, "4\n%d\n%d\n%d\n%d\n", step, numComp, numEnt, partitionNum);
+        else
+          fprintf(fp, "3\n%d\n%d\n%d\n", step, numComp, numEnt);
         for(int i = 0; i < _steps[step]->getNumData(); i++){
           if(_steps[step]->getData(i)){
             MVertex *v = _steps[step]->getModel()->getMeshVertexByTag(i);
@@ -242,13 +246,16 @@ bool PViewDataGModel::writeMSH(const std::string &fileName, double version, bool
           fprintf(fp, "$ElementNodeData\n");
         else
           fprintf(fp, "$ElementData\n");
-        if(haveInterpolationMatrices())
+        if(saveInterpolationMatrices && haveInterpolationMatrices())
           fprintf(fp, "2\n\"%s\"\n\"INTERPOLATION_SCHEME\"\n", getName().c_str());
         else
           fprintf(fp, "1\n\"%s\"\n", getName().c_str());
 
         fprintf(fp, "1\n%.16g\n", _steps[step]->getTime());
-        fprintf(fp, "3\n%d\n%d\n%d\n", step, numComp, numEnt);
+        if(partitionNum)
+          fprintf(fp, "4\n%d\n%d\n%d\n%d\n", step, numComp, numEnt, partitionNum);
+        else
+          fprintf(fp, "3\n%d\n%d\n%d\n", step, numComp, numEnt);
         for(int i = 0; i < _steps[step]->getNumData(); i++){
           if(_steps[step]->getData(i)){
             MElement *e = model->getMeshElementByTag(i);
diff --git a/Post/PViewDataIO.cpp b/Post/PViewDataIO.cpp
index 6b571abff553716c01f5dabca87ca0c6763c11b6..9e3eac75e8e06ee0789a6212d25395e7ac6d8e57 100644
--- a/Post/PViewDataIO.cpp
+++ b/Post/PViewDataIO.cpp
@@ -179,7 +179,8 @@ bool PViewData::writePOS(const std::string &fileName, bool binary, bool parsed,
 }
 
 bool PViewData::writeMSH(const std::string &fileName, double version, bool binary,
-                         bool savemesh, bool multipleView)
+                         bool savemesh, bool multipleView, int partitionNum,
+                         bool saveInterpolationMatrices)
 {
   Msg::Error("MSH export not implemented for this view type");
   return false;
diff --git a/Post/PViewDataList.h b/Post/PViewDataList.h
index bea48f95f6f386762a623822ed7af3e84a31d196..5b2dd2abb11cfb7f59e6fa6e0ebb975fb2ff879b 100644
--- a/Post/PViewDataList.h
+++ b/Post/PViewDataList.h
@@ -127,7 +127,8 @@ class PViewDataList : public PViewData {
   bool writePOS(const std::string &fileName, bool binary=false, bool parsed=true,
                 bool append=false);
   virtual bool writeMSH(const std::string &fileName, double version=2.2, bool binary=false,
-                        bool savemesh=true, bool multipleView=false);
+                        bool savemesh=true, bool multipleView=false,
+                        int partitionNum=0, bool saveInterpolationMatrices=true);
   virtual void importLists(int N[24], std::vector<double> *V[24]);
   virtual void getListPointers(int N[24], std::vector<double> *V[24]);
 };
diff --git a/Post/PViewDataListIO.cpp b/Post/PViewDataListIO.cpp
index 8ba69355a721d32e9003a32accc564374826de56..6ad08a7f149f3bebae2877bdc04f0b5560a367fc 100644
--- a/Post/PViewDataListIO.cpp
+++ b/Post/PViewDataListIO.cpp
@@ -527,7 +527,8 @@ static void createElements(std::vector<double> &list, int nbelm, int nbnod,
 }
 
 bool PViewDataList::writeMSH(const std::string &fileName, double version, bool binary,
-                             bool savemesh, bool multipleView)
+                             bool savemesh, bool multipleView,
+                             int partitionNum, bool saveInterpolationMatrices)
 {
   if(_adaptive){
     Msg::Warning("Writing adapted dataset (will only export current time step)");
@@ -588,7 +589,7 @@ bool PViewDataList::writeMSH(const std::string &fileName, double version, bool b
   }
   fprintf(fp, "$EndElements\n");
 
-  if(haveInterpolationMatrices()){
+  if(saveInterpolationMatrices && haveInterpolationMatrices()){
     fprintf(fp, "$InterpolationScheme\n");
     fprintf(fp, "\"INTERPOLATION_SCHEME\"\n");
     fprintf(fp, "%d\n", (int)_interpolation.size());
@@ -612,12 +613,16 @@ bool PViewDataList::writeMSH(const std::string &fileName, double version, bool b
 
   for(int ts = 0; ts < NbTimeStep; ts++){
     fprintf(fp, "$ElementNodeData\n");
-    if(haveInterpolationMatrices())
+    if(saveInterpolationMatrices && haveInterpolationMatrices())
       fprintf(fp, "2\n\"%s\"\n\"INTERPOLATION_SCHEME\"\n", getName().c_str());
     else
       fprintf(fp, "1\n\"%s\"\n", getName().c_str());
     fprintf(fp, "1\n%.16g\n", getTime(ts));
-    fprintf(fp, "3\n%d\n%d\n%d\n", ts, numComponents, (int)elements.size());
+    if(partitionNum)
+      fprintf(fp, "4\n%d\n%d\n%d\n%d\n", ts, numComponents, (int)elements.size(),
+              partitionNum);
+    else
+      fprintf(fp, "3\n%d\n%d\n%d\n", ts, numComponents, (int)elements.size());
     num = 0;
     for(int i = 0; i < 24; i++){
       std::vector<double> *list = 0;