diff --git a/Geo/GModelIO_MSH.cpp b/Geo/GModelIO_MSH.cpp
index 848688c2fb4327bb1fae6e47440647d2c69ad61d..4279d7817ca0886333a513c7e95d334f53ad3870 100644
--- a/Geo/GModelIO_MSH.cpp
+++ b/Geo/GModelIO_MSH.cpp
@@ -126,7 +126,7 @@ void readMSHPeriodicNodes(FILE *fp, GModel *gm)
       fgetpos(fp, &pos);
       if(fscanf(fp, "%s", token) != 1) return;
       if(strcmp(token, "Affine") == 0) {
-        std::vector<double> tfo;
+        std::vector<double> tfo(16);
         for(int i = 0; i < 16; i++){
           if(fscanf(fp, "%lf", &tfo[i]) != 1) return;
         }
diff --git a/Geo/GModelIO_MSH2.cpp b/Geo/GModelIO_MSH2.cpp
index 322c7520a380b118bde62c61e11cbe80cfc7ce65..3725973cb52f4fd5e9ff860e0bb8eebc2c34806b 100644
--- a/Geo/GModelIO_MSH2.cpp
+++ b/Geo/GModelIO_MSH2.cpp
@@ -31,6 +31,8 @@
 
 extern void writeMSHPeriodicNodes (FILE *fp, std::vector<GEntity*> &entities);
 
+extern void readMSHPeriodicNodes(FILE *fp, GModel *gm);
+
 static bool getVertices(int num, int *indices, std::map<int, MVertex*> &map,
                         std::vector<MVertex*> &vertices)
 {
@@ -690,6 +692,29 @@ int GModel::_readMSH2(const std::string &name)
     _storePhysicalTagsInEntities(i, physicals[i]);
 
   _createGeometryOfDiscreteEntities() ;
+
+
+  // copying periodic information from the mesh
+
+  rewind(fp);
+
+  while(1) {
+
+    while(str[0] != '$'){
+      if(!fgets(str, sizeof(str), fp) || feof(fp))
+        break;
+    }
+    
+    if(!strncmp(&str[1], "Periodic",8)) {
+      readMSHPeriodicNodes(fp,this);
+      break;
+    }
+    do {
+      if(!fgets(str, sizeof(str), fp) || feof(fp))
+        break;
+    } while(str[0] != '$');
+  }
+  
   fclose(fp);
 
   return postpro ? 2 : 1;