diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h b/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h
index 3bc695c3a030ed2009d26a518a641f1310640ab2..3ca8cc5f3e6d34b024106cbe3e7c356758762b05 100644
--- a/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h
+++ b/src/TNL/Meshes/DistributedMeshes/DistributedGridSynchronizer.h
@@ -48,7 +48,13 @@ class DistributedMeshSynchronizer< Functions::MeshFunction< Grid< MeshDimension,
       typedef typename Grid< MeshDimension, GridReal, Device, Index >::DistributedMeshType DistributedGridType; 
       typedef typename DistributedGridType::CoordinatesType CoordinatesType;
       using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType;
-          
+
+      enum PeriodicBoundariesCopyDirection
+      {
+         BoundaryToOverlap,
+         OverlapToBoundary
+      };
+
       DistributedMeshSynchronizer()
       {
          isSet = false;
@@ -108,22 +114,9 @@ class DistributedMeshSynchronizer< Functions::MeshFunction< Grid< MeshDimension,
             sendBuffers[ i ].setSize( sendSize );
             recieveBuffers[ i ].setSize( sendSize);
 
-            //Periodic-BC copy from overlap into domain
-            //if Im on boundary, and i is direction of the boundary i will swap source and destination
-            //i do this only for basic 6 directions, 
-            //because this swap at conners and edges produces writing multiple values at sam place in localsubdomain
-            {
-               if(  (  i==ZzYzXm || i==ZzYzXp 
-                     ||i==ZzYmXz || i==ZzYpXz 
-                     ||i==ZmYzXz || i==ZpYzXz ) 
-                  && neighbors[ i ] == -1) 
-               {
-                  //swap begins
-                  CoordinatesType tmp = sendBegin[i];
-                  sendBegin[i]=recieveBegin[i];
-                  recieveBegin[i]=tmp;
-               }
-            }
+            if( this->periodicBoundariesCopyDirection == OverlapToBoundary &&
+               neighbors[ i ] == -1 )
+                  swap( sendBegin[i], recieveBegin[i] );
          }
      }
 
@@ -213,6 +206,8 @@ class DistributedMeshSynchronizer< Functions::MeshFunction< Grid< MeshDimension,
       Containers::Array<RealType, Device, Index> recieveBuffers[getNeighborCount()];
       Containers::StaticArray< getNeighborCount(), int > sendSizes;
 
+      PeriodicBoundariesCopyDirection periodicBoundariesCopyDirection = BoundaryToOverlap;
+
       CoordinatesType sendDimensions[getNeighborCount()];
       CoordinatesType recieveDimensions[getNeighborCount()];
       CoordinatesType sendBegin[getNeighborCount()];