diff --git a/Geo/GModelIO_CGNS.cpp b/Geo/GModelIO_CGNS.cpp
index ff2b4d99c3d6b5f56c7734e67c0effb4c116ddde..c5aabc60d44da044f4bb7ebe79be6f622de7b72c 100644
--- a/Geo/GModelIO_CGNS.cpp
+++ b/Geo/GModelIO_CGNS.cpp
@@ -3,7 +3,7 @@
 // See the LICENSE.txt file for license information. Please report all
 // bugs and problems to <gmsh@geuz.org>.
 //
-// GModelIO_CGNS.cpp - Copyright (C) 2008 S. Guzik, C. Geuzaine, J.-F. Remacle
+// GModelIO_CGNS.cpp - Copyright (C) 2008-2012 S. Guzik, B. Gorissen, C. Geuzaine, J.-F. Remacle
 
 #include "GmshConfig.h"
 #include "GmshMessage.h"
@@ -788,6 +788,15 @@ int GModel::readCGNS(const std::string &name)
       int transform[3];
       cg_1to1_read(index_file, index_base, index_zone,index_section,
 		   ConnectionName, DonorName, range, donor_range, transform);
+      
+      // Do not ignore periodic boundaries when creating elements later on.
+      float RotationCenter[3];
+      float RotationAngle[3];
+      float Translation[3];
+      if (cg_1to1_periodic_read(index_file, index_base, index_zone, index_section,
+				RotationCenter, RotationAngle, Translation) != CG_NODE_NOT_FOUND)
+	continue;
+
       // Checking on which face it is
       int face = 0;
       if (range[0] == range[3]) {
@@ -813,6 +822,8 @@ int GModel::readCGNS(const std::string &name)
       forbidden[face].push_back(range_int);
     }
 
+    
+
 
     for(int face = 0; face < 6; face++) {
       int imin, imax, jmin, jmax, kmin, kmax;
@@ -871,27 +882,6 @@ int GModel::readCGNS(const std::string &name)
 	break;
       }
       
-      /**/
-
-	  /*
-	if (forbidden[face][ff][3]-1 > imin)
-	  imin = forbidden[face][ff][3]-1;
-	if (forbidden[face][ff][0]-1 < imax)
-	  imax = forbidden[face][ff][0]-1;
-
-	if (forbidden[face][ff][4]-1 > jmin)
-	  jmin = forbidden[face][ff][4]-1;
-	if (forbidden[face][ff][1]-1 < jmax)
-	  jmax = forbidden[face][ff][1]-1;
-
-	if (forbidden[face][ff][5]-1 > kmin)
-	  kmin = forbidden[face][ff][5]-1;
-	if (forbidden[face][ff][2]-1 < kmax)
-	  kmax = forbidden[face][ff][2]-1;
-      }
-
-	     printf("Range : %i-> %i   %i->%i   %i->%i\n", imin, imax, jmin, jmax, kmin, kmax);
-	*/
       GRegion* gr = getRegionByTag(elementary_region);
       elementary_face++;
       num = 1;
@@ -903,9 +893,10 @@ int GModel::readCGNS(const std::string &name)
 	    bool ok = true;
 	    for (int ff=0; ff < forbidden[face].size(); ff++) {
 	      int* lim = forbidden[face][ff];
-	      if ((i >= fmin(lim[0], lim[3])-1 && i <= fmax(lim[0], lim[3])-2) || igrow == 0) {
-		if ((j >= fmin(lim[1], lim[4])-1 && j <= fmax(lim[1],lim[4])-2) || jgrow == 0) {
-		  if ((k >= fmin(lim[2], lim[5])-1 && k <= fmax(lim[2], lim[5])-2) || kgrow == 0) {
+
+	      if ((i >= fmin(lim[0], lim[3])-1 && i <= fmax(lim[0], lim[3])) || (igrow == 0 && i == lim[0]-1) ) {
+		if ((j >= fmin(lim[1], lim[4])-1 && j <= fmax(lim[1],lim[4])) || (jgrow == 0 && j == lim[1]-1) ) {
+		  if ((k >= fmin(lim[2], lim[5])-1 && k <= fmax(lim[2], lim[5])) || (kgrow == 0 && k == lim[2]-1) ) {
 		    ok = false;
 		  }
 		}
@@ -935,16 +926,11 @@ int GModel::readCGNS(const std::string &name)
       if (gf)
 	gf->addRegion(gr);
 
-      for (int ff = 0; ff < forbidden[face].size(); ff++) {
+      for (int ff = 0; ff < forbidden[face].size(); ff++)
 	  delete[] forbidden[face][ff];
-      }
-
-     }
+    }
   }
 
-  // store the vertices in their associate
-  
-
   // store the elements in their associated elementary entity. If the
   // entity does not exist, create a new (discrete) one.
   for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++)