Index: /NEMO/trunk/doc/tex_sub/chap_LBC.tex
===================================================================
--- /NEMO/trunk/doc/tex_sub/chap_LBC.tex	(revision 9666)
+++ /NEMO/trunk/doc/tex_sub/chap_LBC.tex	(revision 9667)
@@ -137,15 +137,15 @@
 
 At the model domain boundaries several choices are offered: closed, cyclic east-west, 
-south symmetric across the equator, a north-fold, and combination closed-north fold 
-or cyclic-north-fold. The north-fold boundary condition is associated with the 3-pole ORCA mesh. 
+cyclic north-south, a north-fold, and combination closed-north fold 
+or bi-cyclic east-west and north-fold. The north-fold boundary condition is associated with the 3-pole ORCA mesh. 
 
 % -------------------------------------------------------------------------------------------------------------
-%        Closed, cyclic, south symmetric (\np{jperio}\forcode{ = 0..2}) 
+%        Closed, cyclic (\np{jperio}\forcode{ = 0..2}) 
 % -------------------------------------------------------------------------------------------------------------
-\subsection{Closed, cyclic, south symmetric (\protect\np{jperio}\forcode{= 0..2})}
+\subsection{Closed, cyclic (\protect\np{jperio}\forcode{= [0127]})}
 \label{subsec:LBC_jperio012}
 
-The choice of closed, cyclic or symmetric model domain boundary condition is made 
-by setting \np{jperio} to 0, 1 or 2 in namelist \ngn{namcfg}. Each time such a boundary 
+The choice of closed or cyclic model domain boundary condition is made 
+by setting \np{jperio} to 0, 1, 2 or 7 in namelist \ngn{namcfg}. Each time such a boundary 
 condition is needed, it is set by a call to routine \mdl{lbclnk}. The computation of 
 momentum and tracer trends proceeds from $i=2$ to $i=jpi-1$ and from $j=2$ to 
@@ -162,16 +162,13 @@
 and the last column to the value of the second one (\autoref{fig:LBC_jperio}-a). 
 Whatever flows out of the eastern (western) end of the basin enters the western 
-(eastern) end. Note that there is no option for north-south cyclic or for doubly 
-cyclic cases.
-
-\item[For symmetric boundary condition across the equator (\np{jperio}\forcode{ = 2})], 
-last rows, and first and last columns are set to zero (closed). The row of symmetry 
-is chosen to be the $u$- and $T-$points equator line ($j=2$, i.e. at the southern 
-end of the domain). For arrays defined at $u-$ or $T-$points, the first row is set 
-to the value of the third row while for most of $v$- and $f$-point arrays ($v$, $\zeta$, 
-$j\psi$, but \gmcomment{not sure why this is "but"} scalar arrays such as eddy coefficients) 
-the first row is set to minus the value of the second row (\autoref{fig:LBC_jperio}-b). 
-Note that this boundary condition is not yet available for the case of a massively 
-parallel computer (\textbf{key{\_}mpp} defined).
+(eastern) end.
+
+\item[For cyclic north-south boundary (\np{jperio}\forcode{ = 2})], first and last columns are set 
+to zero (closed) whilst the first row is set to the value of the last-but-one row 
+and the last row to the value of the second one (\autoref{fig:LBC_jperio}-a). 
+Whatever flows out of the northern (southern) end of the basin enters the southern  
+(northern) end.
+
+\item[Bi-cyclic east-west and north-south boundary (\np{jperio}\forcode{ = 7})] combines cases 1 and 2.
 
 \end{description}
Index: /NEMO/trunk/src/OCE/CRS/crs.F90
===================================================================
--- /NEMO/trunk/src/OCE/CRS/crs.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/CRS/crs.F90	(revision 9667)
@@ -276,5 +276,5 @@
       jpim1  = jpim1_full
       jpjm1  = jpjm1_full
-      nperio = nperio_full
+      jperio = nperio_full
 
       npolj  = npolj_full
@@ -315,5 +315,5 @@
       jpim1  = jpi_crsm1
       jpjm1  = jpj_crsm1
-      nperio = nperio_crs
+      jperio = nperio_crs
 
       npolj  = npolj_crs
Index: /NEMO/trunk/src/OCE/CRS/crsdom.F90
===================================================================
--- /NEMO/trunk/src/OCE/CRS/crsdom.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/CRS/crsdom.F90	(revision 9667)
@@ -2037,5 +2037,5 @@
       jpim1_full  = jpim1
       jpjm1_full  = jpjm1
-      nperio_full = nperio
+      nperio_full = jperio
 
       npolj_full  = npolj
@@ -2121,5 +2121,5 @@
       CASE ( 0 ) 
 
-         SELECT CASE ( nperio )
+         SELECT CASE ( jperio )
      
  
Index: /NEMO/trunk/src/OCE/DOM/dom_oce.F90
===================================================================
--- /NEMO/trunk/src/OCE/DOM/dom_oce.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/DOM/dom_oce.F90	(revision 9667)
@@ -66,11 +66,12 @@
    !! space domain parameters
    !!----------------------------------------------------------------------
-   INTEGER, PUBLIC ::   jperio   !: Global domain lateral boundary type (between 0 and 6)
+   INTEGER, PUBLIC ::   jperio   !: Global domain lateral boundary type (between 0 and 7)
    !                                !  = 0 closed                 ;   = 1 cyclic East-West
-   !                                !  = 2 equatorial symmetric   ;   = 3 North fold T-point pivot
+   !                                !  = 2 cyclic North-South     ;   = 3 North fold T-point pivot
    !                                !  = 4 cyclic East-West AND North fold T-point pivot
    !                                !  = 5 North fold F-point pivot
    !                                !  = 6 cyclic East-West AND North fold F-point pivot
-   INTEGER, PUBLIC ::   nperio   !: Local domain lateral boundary type (deduced from jperio and MPP decomposition)
+   !                                !  = 7 bi-cyclic East-West AND North-South
+   LOGICAL, PUBLIC ::   l_Iperio, l_Jperio   !   should we explicitely take care I/J periodicity 
 
    !                                 !  domain MPP decomposition parameters
Index: /NEMO/trunk/src/OCE/ICB/icblbc.F90
===================================================================
--- /NEMO/trunk/src/OCE/ICB/icblbc.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/ICB/icblbc.F90	(revision 9667)
@@ -85,5 +85,5 @@
       !! =============================
 
-      IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN
+      IF( l_Iperio ) THEN
 
          this => first_berg
@@ -103,8 +103,7 @@
       !! north/south boundaries
       !! ======================
-      ! south symmetric
-      IF( nperio == 2 )   CALL ctl_stop(' south symmetric condition not implemented for icebergs')
+      IF( l_Jperio)      CALL ctl_stop(' north-south periodicity not implemented for icebergs')
       ! north fold
-      IF( nperio == 3 .OR. nperio == 4 .OR. nperio == 5 .OR. nperio == 6 )   CALL icb_lbc_nfld()
+      IF( npolj /= 0 )   CALL icb_lbc_nfld()
       !
    END SUBROUTINE icb_lbc
Index: /NEMO/trunk/src/OCE/IOM/prtctl.F90
===================================================================
--- /NEMO/trunk/src/OCE/IOM/prtctl.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/IOM/prtctl.F90	(revision 9667)
@@ -387,10 +387,8 @@
       !!                periodic
       !!                Type :         jperio global periodic condition
-      !!                               nperio local  periodic condition
       !!
       !! ** Action  : - set domain parameters
       !!                    nimpp     : longitudinal index 
       !!                    njmpp     : latitudinal  index
-      !!                    nperio    : lateral condition type 
       !!                    narea     : number for local area
       !!                    nlcil      : first dimension
Index: /NEMO/trunk/src/OCE/LBC/lbc_lnk_generic.h90
===================================================================
--- /NEMO/trunk/src/OCE/LBC/lbc_lnk_generic.h90	(revision 9666)
+++ /NEMO/trunk/src/OCE/LBC/lbc_lnk_generic.h90	(revision 9667)
@@ -60,5 +60,5 @@
       INTEGER  ::   ipi, ipj, ipk, ipl, ipf      ! dimension of the input array
       REAL(wp) ::   zland
-      LOGICAL  ::   ll_Iperio, ll_Jperio, ll_nfd
+      LOGICAL  ::   ll_nfd
       !!----------------------------------------------------------------------
       !
@@ -67,7 +67,5 @@
       ipf = F_SIZE(ptab)   ! 5th    -      use in "multi" case (array of pointers)
       !
-      ll_Iperio = nperio==1 .OR. nperio==4 .OR. nperio==6
-      ll_Jperio = jperio==7
-      ll_nfd    = nperio==3 .OR. nperio==4 .OR. nperio==5 .OR. nperio==6
+      ll_nfd    = jperio==3 .OR. jperio==4 .OR. jperio==5 .OR. jperio==6
       !
       IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value
@@ -89,5 +87,5 @@
             !
             !                                ! East-West boundaries
-            IF( ll_Iperio ) THEN                   !* cyclic
+            IF( l_Iperio ) THEN                   !* cyclic
                ARRAY_IN( 1 ,:,:,:,jf) = ARRAY_IN(jpim1,:,:,:,jf)
                ARRAY_IN(jpi,:,:,:,jf) = ARRAY_IN(  2  ,:,:,:,jf)
@@ -97,5 +95,5 @@
             ENDIF
             !                                ! North-South boundaries
-            IF( ll_Jperio ) THEN                   !* cyclic
+            IF( l_Jperio ) THEN                   !* cyclic
                ARRAY_IN(:, 1 ,:,:,jf) = ARRAY_IN(:, jpjm1,:,:,jf)
                ARRAY_IN(:,jpj,:,:,jf) = ARRAY_IN(:,   2  ,:,:,jf)
Index: /NEMO/trunk/src/OCE/LBC/lib_mpp.F90
===================================================================
--- /NEMO/trunk/src/OCE/LBC/lib_mpp.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/LBC/lib_mpp.F90	(revision 9667)
@@ -1466,11 +1466,19 @@
       !                                      ! East-West boundaries
       !                                           !* Cyclic east-west
-      IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN
-         pt2d(1-kexti:     1    ,:) = pt2d(jpim1-kexti:  jpim1 ,:)       ! east
-         pt2d(   jpi  :jpi+kexti,:) = pt2d(     2      :2+kexti,:)       ! west
+      IF( l_Iperio ) THEN
+         pt2d(1-kexti:     1   ,:) = pt2d(jpim1-kexti: jpim1 ,:)       ! east
+         pt2d(  jpi  :jpi+kexti,:) = pt2d(     2     :2+kexti,:)       ! west
          !
       ELSE                                        !* closed
-         IF( .NOT. cd_type == 'F' )   pt2d(  1-kexti   :nn_hls    ,:) = 0._wp    ! south except at F-point
-                                      pt2d(jpi-nn_hls+1:jpi+kexti,:) = 0._wp    ! north
+         IF( .NOT. cd_type == 'F' )   pt2d(  1-kexti   :nn_hls   ,:) = 0._wp    ! east except at F-point
+                                      pt2d(jpi-nn_hls+1:jpi+kexti,:) = 0._wp    ! west
+      ENDIF
+      !                                      ! North-South boundaries
+      IF( l_Jperio ) THEN                         !* cyclic (only with no mpp j-split)
+         pt2d(:,1-kextj:     1   ) = pt2d(:,jpjm1-kextj:  jpjm1)       ! north
+         pt2d(:,  jpj  :jpj+kextj) = pt2d(:,     2     :2+kextj)       ! south
+      ELSE                                        !* closed
+         IF( .NOT. cd_type == 'F' )   pt2d(:,  1-kextj   :nn_hls   ) = 0._wp    ! north except at F-point
+                                      pt2d(:,jpj-nn_hls+1:jpj+kextj) = 0._wp    ! south
       ENDIF
       !
Index: /NEMO/trunk/src/OCE/LBC/mpp_bdy_generic.h90
===================================================================
--- /NEMO/trunk/src/OCE/LBC/mpp_bdy_generic.h90	(revision 9666)
+++ /NEMO/trunk/src/OCE/LBC/mpp_bdy_generic.h90	(revision 9667)
@@ -76,5 +76,5 @@
          IF( nbondi == 2) THEN                  ! neither subdomain to the east nor to the west
             !                                      !* Cyclic
-            IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN
+            IF( l_Iperio ) THEN
                ARRAY_IN( 1 ,:,:,:,jf) = ARRAY_IN(jpim1,:,:,:,jf)
                ARRAY_IN(jpi,:,:,:,jf) = ARRAY_IN(  2  ,:,:,:,jf)
@@ -91,9 +91,20 @@
          !                                ! North-South boundaries
          !
-         IF (nbondj == 2 .OR. nbondj == -1) THEN      !* closed
-           IF( .NOT. NAT_IN(jf) == 'F' )   ARRAY_IN(:,1:nn_hls,:,:,jf) = zland            ! south except F-point
-         ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN
-                                           ARRAY_IN(:,nlcj-nn_hls+1:jpj,:,:,jf) = zland   ! north
+         IF( nbondj == 2) THEN                  ! neither subdomain to the north nor to the south
+            !                                      !* Cyclic
+            IF( l_Jperio ) THEN
+               ARRAY_IN(:, 1 ,:,:,jf) = ARRAY_IN(:,jpjm1,:,:,jf)
+               ARRAY_IN(:,jpj,:,:,jf) = ARRAY_IN(:,  2  ,:,:,jf)
+            ELSE                                   !* Closed
+               IF( .NOT. NAT_IN(jf) == 'F' )   ARRAY_IN(:,     1       :nn_hls,:,:,jf) = zland  ! east except F-point
+                                               ARRAY_IN(:,nlcj-nn_hls+1:jpj   ,:,:,jf) = zland  ! west
+            ENDIF
+         ELSEIF(nbondi == -1) THEN              ! subdomain to the east only
+            IF( .NOT. NAT_IN(jf) == 'F' )   ARRAY_IN(:,1:nn_hls,:,:,jf) = zland     ! south except F-point
+            !
+         ELSEIF(nbondi == 1) THEN               ! subdomain to the west only
+            ARRAY_IN(:,nlcj-nn_hls+1:jpj,:,:,jf) = zland    ! north
          ENDIF
+         !
       END DO
 
Index: /NEMO/trunk/src/OCE/LBC/mpp_lnk_generic.h90
===================================================================
--- /NEMO/trunk/src/OCE/LBC/mpp_lnk_generic.h90	(revision 9666)
+++ /NEMO/trunk/src/OCE/LBC/mpp_lnk_generic.h90	(revision 9667)
@@ -62,5 +62,4 @@
       INTEGER  ::   ml_req1, ml_req2, ml_err     ! for key_mpi_isend
       REAL(wp) ::   zland
-      LOGICAL  ::   ll_Iperio, ll_Jperio
       INTEGER , DIMENSION(MPI_STATUS_SIZE)      ::   ml_stat        ! for key_mpi_isend
       REAL(wp), DIMENSION(:,:,:,:,:,:), ALLOCATABLE ::   zt3ns, zt3sn   ! north-south & south-north  halos
@@ -75,7 +74,4 @@
          &      zt3ew(jpj,nn_hls,ipk,ipl,ipf,2), zt3we(jpj,nn_hls,ipk,ipl,ipf,2)  )
       !
-      ll_Iperio = nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6)
-      ll_Jperio = nbondj == 2 .AND.  jperio == 7
-      !
       IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value
       ELSE                         ;   zland = 0._wp     ! zero by default
@@ -111,6 +107,6 @@
          DO jf = 1, ipf                      ! number of arrays to be treated
             !
-            !                             ! East-West boundaries
-            IF( ll_Iperio ) THEN                   !* cyclic
+            !                                ! East-West boundaries
+            IF( l_Iperio ) THEN                    !* cyclic
                ARRAY_IN( 1 ,:,:,:,jf) = ARRAY_IN(jpim1,:,:,:,jf)
                ARRAY_IN(jpi,:,:,:,jf) = ARRAY_IN(  2  ,:,:,:,jf)
@@ -120,5 +116,5 @@
             ENDIF
             !                                ! North-South boundaries
-            IF( ll_Jperio ) THEN                   !* cyclic (only with no mpp j-split)
+            IF( l_Jperio ) THEN                    !* cyclic (only with no mpp j-split)
                ARRAY_IN(:, 1 ,:,:,jf) = ARRAY_IN(:, jpjm1,:,:,jf)
                ARRAY_IN(:,jpj,:,:,jf) = ARRAY_IN(:,   2  ,:,:,jf)
Index: /NEMO/trunk/src/OCE/LBC/mppini.F90
===================================================================
--- /NEMO/trunk/src/OCE/LBC/mppini.F90	(revision 9666)
+++ /NEMO/trunk/src/OCE/LBC/mppini.F90	(revision 9667)
@@ -78,9 +78,10 @@
       nlei   = jpi
       nlej   = jpj
-      nperio = jperio
       nbondi = 2
       nbondj = 2
       nidom  = FLIO_DOM_NONE
       npolj = jperio
+      l_Iperio = jpni == 1 .AND. (jperio == 1 .OR. jperio == 4 .OR. jperio == 6 .OR. jperio == 7)
+      l_Jperio = jpnj == 1 .AND. (jperio == 2 .OR. jperio == 7)
       !
       IF(lwp) THEN
@@ -88,6 +89,6 @@
          WRITE(numout,*) 'mpp_init : NO massively parallel processing'
          WRITE(numout,*) '~~~~~~~~ '
-         WRITE(numout,*) '   nperio = ', nperio, '   nimpp  = ', nimpp
-         WRITE(numout,*) '   npolj  = ', npolj , '   njmpp  = ', njmpp
+         WRITE(numout,*) '   l_Iperio = ', l_Iperio, '    l_Jperio = ', l_Jperio 
+         WRITE(numout,*) '     npolj  = ',   npolj , '      njmpp  = ', njmpp
       ENDIF
       !
@@ -95,7 +96,4 @@
          CALL ctl_stop( 'mpp_init: equality  jpni = jpnj = jpnij = 1 is not satisfied',   &
             &           'the domain is lay out for distributed memory computing!' )
-         !
-      IF( jperio == 7 ) CALL ctl_stop( 'mpp_init: jperio = 7 needs distributed memory computing ',       &
-         &                             'with 1 process. Add key_mpp_mpi in the list of active cpp keys ' )
          !
    END SUBROUTINE mpp_init
@@ -122,10 +120,8 @@
       !!      periodic
       !!      Type :         jperio global periodic condition
-      !!                     nperio local  periodic condition
       !!
       !! ** Action : - set domain parameters
       !!                    nimpp     : longitudinal index 
       !!                    njmpp     : latitudinal  index
-      !!                    nperio    : lateral condition type 
       !!                    narea     : number for local area
       !!                    nlci      : first dimension
@@ -276,5 +272,9 @@
       ! 3. Subdomain description in the Regular Case
       ! --------------------------------------------
-      nperio = 0
+      ! specific cases where there is no communication -> must do the periodicity by itself
+      ! Warning: because of potential land-area suppression, do not use nbond[ij] == 2  
+      l_Iperio = jpni == 1 .AND. (jperio == 1 .OR. jperio == 4 .OR. jperio == 6 .OR. jperio == 7)
+      l_Jperio = jpnj == 1 .AND. (jperio == 2 .OR. jperio == 7)
+      
       icont = -1
       DO jarea = 1, jpni*jpnj
@@ -284,12 +284,12 @@
          ili = ilci(ii,ij)
          ilj = ilcj(ii,ij)
-         ibondj(ii,ij) = -1
-         IF( jarea >  jpni          )   ibondj(ii,ij) = 0
-         IF( jarea >  (jpnj-1)*jpni )   ibondj(ii,ij) = 1
-         IF( jpnj  == 1             )   ibondj(ii,ij) = 2
-         ibondi(ii,ij) = 0
-         IF( MOD(jarea,jpni) ==  1  )   ibondi(ii,ij) = -1
-         IF( MOD(jarea,jpni) ==  0  )   ibondi(ii,ij) =  1
-         IF( jpni            ==  1  )   ibondi(ii,ij) =  2
+         ibondi(ii,ij) = 0                         ! default: has e-w neighbours
+         IF( ii   ==    1 )   ibondi(ii,ij) = -1   ! first column, has only e neighbour
+         IF( ii   == jpni )   ibondi(ii,ij) =  1   ! last column,  has only w neighbour
+         IF( jpni ==    1 )   ibondi(ii,ij) =  2   ! has no e-w neighbour
+         ibondj(ii,ij) = 0                         ! default: has n-s neighbours
+         IF( ij   ==    1 )   ibondj(ii,ij) = -1   ! first row, has only n neighbour
+         IF( ij   == jpnj )   ibondj(ii,ij) =  1   ! last row,  has only s neighbour
+         IF( jpnj ==    1 )   ibondj(ii,ij) =  2   ! has no n-s neighbour
 
          ! Subdomain neighbors (get their zone number): default definition
@@ -305,16 +305,14 @@
          ! East-West periodicity: change ibondi, ioea, iowe
          IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 .OR. jperio == 7 ) THEN
-            IF( jpni == 1 )THEN
-               ibondi(ii,ij) = 2
-               nperio = 1
-            ELSE
-               ibondi(ii,ij) = 0
-            ENDIF
-            IF( MOD(jarea,jpni) == 0 ) THEN
-               ioea(ii,ij) = iarea0 - (jpni-1)
-            ENDIF
-            IF( MOD(jarea,jpni) == 1 ) THEN
-               iowe(ii,ij) = iarea0 + jpni - 1
-            ENDIF
+            IF( jpni  /= 1 )   ibondi(ii,ij) = 0                        ! redefine: all have e-w neighbours
+            IF( ii ==    1 )   iowe(ii,ij) = iarea0 +        (jpni-1)   ! redefine: first column, address of w neighbour
+            IF( ii == jpni )   ioea(ii,ij) = iarea0 -        (jpni-1)   ! redefine: last column,  address of e neighbour
+         ENDIF
+
+         ! Simple North-South periodicity: change ibondj, ioso, iono
+         IF( jperio == 2 .OR. jperio == 7 ) THEN
+            IF( jpnj  /= 1 )   ibondj(ii,ij) = 0                        ! redefine: all have n-s neighbours
+            IF( ij ==    1 )   ioso(ii,ij) = iarea0 + jpni * (jpnj-1)   ! redefine: first row, address of s neighbour
+            IF( ij == jpnj )   iono(ii,ij) = iarea0 - jpni * (jpnj-1)   ! redefine: last row,  address of n neighbour
          ENDIF
 
@@ -393,33 +391,36 @@
          ii = 1 + MOD( jarea-1  , jpni )
          ij = 1 +     (jarea-1) / jpni
+         ! land-only area with an active n neigbour
          IF ( ipproc(ii,ij) == -1 .AND. 0 <= iono(ii,ij) .AND. iono(ii,ij) <= jpni*jpnj-1 ) THEN
-            iino = 1 + MOD( iono(ii,ij) , jpni )
-            ijno = 1 +      iono(ii,ij) / jpni
-            ! Need to reverse the logical direction of communication 
-            ! for northern neighbours of northern row processors (north-fold)
-            ! i.e. need to check that the northern neighbour only communicates
-            ! to the SOUTH (or not at all) if this area is land-only (#1057)
-            idir = 1
-            IF( ij == jpnj .AND. ijno == jpnj )   idir = -1    
-            IF( ibondj(iino,ijno) == idir     )   ibondj(iino,ijno) =   2
-            IF( ibondj(iino,ijno) == 0        )   ibondj(iino,ijno) = -idir
-         ENDIF
+            iino = 1 + MOD( iono(ii,ij) , jpni )                    ! ii index of this n neigbour
+            ijno = 1 +      iono(ii,ij) / jpni                      ! ij index of this n neigbour
+            ! In case of north fold exchange: I am the n neigbour of my n neigbour!! (#1057)
+            ! --> for northern neighbours of northern row processors (in case of north-fold)
+            !     need to reverse the LOGICAL direction of communication 
+            idir = 1                                           ! we are indeed the s neigbour of this n neigbour
+            IF( ij == jpnj .AND. ijno == jpnj )   idir = -1    ! both are on the last row, we are in fact the n neigbour
+            IF( ibondj(iino,ijno) == idir     )   ibondj(iino,ijno) =   2     ! this n neigbour had only a s/n neigbour -> no more
+            IF( ibondj(iino,ijno) == 0        )   ibondj(iino,ijno) = -idir   ! this n neigbour had both, n-s neighbours -> keep 1
+         ENDIF
+         ! land-only area with an active s neigbour
          IF( ipproc(ii,ij) == -1 .AND. 0 <= ioso(ii,ij) .AND. ioso(ii,ij) <= jpni*jpnj-1 ) THEN
-            iiso = 1 + MOD( ioso(ii,ij) , jpni )
-            ijso = 1 +      ioso(ii,ij) / jpni
-            IF( ibondj(iiso,ijso) == -1 )   ibondj(iiso,ijso) = 2
-            IF( ibondj(iiso,ijso) ==  0 )   ibondj(iiso,ijso) = 1
-         ENDIF
+            iiso = 1 + MOD( ioso(ii,ij) , jpni )                    ! ii index of this s neigbour
+            ijso = 1 +      ioso(ii,ij) / jpni                      ! ij index of this s neigbour
+            IF( ibondj(iiso,ijso) == -1 )   ibondj(iiso,ijso) = 2   ! this s neigbour had only a n neigbour    -> no more neigbour
+            IF( ibondj(iiso,ijso) ==  0 )   ibondj(iiso,ijso) = 1   ! this s neigbour had both, n-s neighbours -> keep s neigbour
+         ENDIF
+         ! land-only area with an active e neigbour
          IF( ipproc(ii,ij) == -1 .AND. 0 <= ioea(ii,ij) .AND. ioea(ii,ij) <= jpni*jpnj-1 ) THEN
-            iiea = 1 + MOD( ioea(ii,ij) , jpni )
-            ijea = 1 +      ioea(ii,ij) / jpni
-            IF( ibondi(iiea,ijea) == 1 )   ibondi(iiea,ijea) =  2
-            IF( ibondi(iiea,ijea) == 0 )   ibondi(iiea,ijea) = -1
-         ENDIF
+            iiea = 1 + MOD( ioea(ii,ij) , jpni )                    ! ii index of this e neigbour
+            ijea = 1 +      ioea(ii,ij) / jpni                      ! ij index of this e neigbour
+            IF( ibondi(iiea,ijea) == 1 )   ibondi(iiea,ijea) =  2   ! this e neigbour had only a w neigbour    -> no more neigbour
+            IF( ibondi(iiea,ijea) == 0 )   ibondi(iiea,ijea) = -1   ! this e neigbour had both, e-w neighbours -> keep e neigbour
+         ENDIF
+         ! land-only area with an active w neigbour
          IF( ipproc(ii,ij) == -1 .AND. 0 <= iowe(ii,ij) .AND. iowe(ii,ij) <= jpni*jpnj-1) THEN
-            iiwe = 1 + MOD( iowe(ii,ij) , jpni )
-            ijwe = 1 +      iowe(ii,ij) / jpni
-            IF( ibondi(iiwe,ijwe) == -1 )   ibondi(iiwe,ijwe) = 2
-            IF( ibondi(iiwe,ijwe) ==  0 )   ibondi(iiwe,ijwe) = 1
+            iiwe = 1 + MOD( iowe(ii,ij) , jpni )                    ! ii index of this w neigbour
+            ijwe = 1 +      iowe(ii,ij) / jpni                      ! ij index of this w neigbour
+            IF( ibondi(iiwe,ijwe) == -1 )   ibondi(iiwe,ijwe) = 2   ! this w neigbour had only a e neigbour    -> no more neigbour
+            IF( ibondi(iiwe,ijwe) ==  0 )   ibondi(iiwe,ijwe) = 1   ! this w neigbour had both, e-w neighbours -> keep w neigbour
          ENDIF
       END DO
@@ -562,5 +563,6 @@
          WRITE(numout,*) '      nbondj = ', nbondj
          WRITE(numout,*) '      npolj  = ', npolj
-         WRITE(numout,*) '      nperio = ', nperio
+         WRITE(numout,*) '    l_Iperio = ', l_Iperio
+         WRITE(numout,*) '    l_Jperio = ', l_Jperio
          WRITE(numout,*) '      nlci   = ', nlci
          WRITE(numout,*) '      nlcj   = ', nlcj
@@ -571,9 +573,4 @@
          WRITE(numout,*) '      nn_hls = ', nn_hls 
       ENDIF
- 
-      IF( nperio == 1 .AND. jpni /= 1 )   CALL ctl_stop( 'mpp_init: error on cyclicity' )
-
-      IF( jperio == 7 .AND. ( jpni /= 1 .OR. jpnj /= 1 ) )   &
-         &                  CALL ctl_stop( ' mpp_init: error jperio = 7 works only with jpni = jpnj = 1' )
 
       !                          ! Prepare mpp north fold
